Memcached Cache是集中式Cache,它仅仅是支持将数据能够分片分区的存储到一台或者多台的Cache Server实例中,但是这些数据并没有作冗余,因此任何一个服务实例不可用,都会导致部分缓存数据丢失。当然很多人采取持久化等方式来保证数据的完整性,但是这种方式对于效率以及恢复的复杂性都会有影响。
简单的来想,为什么不把数据在多保存一份或者多份呢,当其中一份不可用的情况下,就用另外一份补上。这就是最原始的Cache Client Cluster的构想。
这张图上需要注意四个角色:web应用程序(使用Cache的应用),缓存集群(Cache配置的虚拟集群),缓存节点(Cache的虚拟节点,在同一个Cluster中的缓存数据保持完全一致),缓存实例(Cache虚拟节点中实际包含的Memcached Cache服务端实例)。
应用仅仅操作缓存节点,不了解具体数据存储或数据获取是操作哪一个缓存服务端实例。(这点也就是Memcached Cache可扩展性的基础设计)。缓存集群又将多个缓存节点组成了虚拟的集群,通过数据冗余,保证了服务可用性和数据完整性。
缓存客户端集群主要的功能点( 比如缓存客户端集群主要有两种配置模式:active 和 standby):
1.容错。当被分配到读取或者操作数据的Cache虚拟节点不可用的情况下,集群其他节点支持代替错误节点服务于客户端应用。
2.数据冗余。当操作集群中某一个Cache虚拟节点时,数据会异步传播到其他集群节点。
3.软负载。客户端通过对操作的key作算法(比如采用简单的key hash再取余的方式)选择集群中的节点,达到集群中节点简单的负载分担。同时也由于这种模式,可以使得key都有默认的第一操作节点,此节点的操作保持时时更新,而其他节点可以通过客户端异步更新来实现效率提升。
4. 数据恢复。当集群中某一节点失效后恢复时,其数据可能已经完全丢失,此时通过配置成为Active模式可以将其他节点上冗余的数据Lazy复制到该节点(获取一个复制一个,同时只支持一个冗余节点的数据获取(不采取遍历,防止低效))。
Active模式拥有1,2,3,4的特性。Standby模式拥用1,2,3特性。Active在key不存在的情况下会有些低效,因为会判断一个冗余节点是否存在内容,然后决定是否修复当前节点。(考虑采用短期失败标示之类的,不过效率不一定高,同时增加了复杂度)
运行期动态扩容部署
Memcached cache客户端算法中比较出名的是Consistent Hashing算法,其目的也就是为了在节点增加或者减少以后,通过算法尽量减小数据重新分布的代价。采用虚拟节点,环状和二叉树等方式可以部分降低节点增加和减少对于数据分布的影响,但是始终还是有部分数据会失效,这点还是由于Memcached Cache是集中式Cache所决定的。
但如果有了Cache Cluster的话,数据有了冗余,就可以通过逐步修改集群中虚拟节点配置,达到对于单个虚拟节点的配置动态扩容。
支持动态部署前提:
配置文件动态加载。(配置文件可以在Classpath中,也可以是Http资源的方式)通过Cache Client 中Cache Manager可以停止Cache 服务,重新加载配置文件,即时生效。
当前动态部署的两种方式:
1.修改集群配置中某一套虚拟节点的服务实例配置,增加或者减少后端数据存储实例。然后动态加载新的配置文件(可以通过指定远端的http配置作为新的配置文件),通过集群的lazy的修复方式,逐渐的将数据从冗余节点复制到新的节点上来,最终实现数据迁移。
2.修改集群配置中某一套虚拟节点的服务实例配置,增加或者减少后端数据存储实例。然后动态加载新的配置文件(可以通过指定远端的http配置作为新的配置文件),在调用Cache Manager主动将数据由某一虚拟节点复制到指定的集群中,实现数据批量迁移,然后根据需要看是否需要修改其他几套虚拟节点配置。
存在的问题:
1. 当前没有做到不停止服务来动态部署。
2. 不论是lazy复制还是批量数据迁移,都是会将原本有失效时间的数据变成了无失效时间的数据
分享到:
相关推荐
在本文中,我们将深入探讨如何搭建Redis集群,以及如何在Java中使用Jedis客户端进行集群操作。 首先,让我们了解Redis集群的基本概念。Redis集群通过数据分片(Sharding)来分散数据,每个节点存储一部分数据。集群...
在标题提到的“memcache缓存分布式集群”中,主要涉及以下知识点: 1. **分布式存储原理**:分布式存储是将数据分散存储在多台独立的设备上,以提高系统的可扩展性和可用性。Memcache分布式集群就是通过将数据分散...
【Redis缓存高可用集群】是为了解决单机Redis在面临高并发、大数据量时可能出现的性能瓶颈和单点故障问题。本文将探讨Redis的两种集群方案:哨兵模式和高可用集群模式,以及如何搭建Redis高可用集群。 1. **哨兵...
当我们谈论“Java客户端测试Redis集群”,这涉及到几个关键的知识点: 1. **Redis集群基础**:Redis集群提供了数据分布和容错能力,通过将数据分散到多个节点来实现水平扩展。每个节点负责一部分键的空间,并且通过...
例如,通过分布式Hash表和集群路由算法,客户端可以将请求映射到特定的数据节点进行处理,这样的设计可以保障数据的即时一致性,但同时也可能带来较大的性能开销。异步复制技术可以解决这一问题,允许客户端在复制...
创建Memcached集群通常涉及配置多个实例,以及使用客户端库支持分布式存储。 总结来说,Memcached是跨平台的缓存解决方案,适用于Windows和Linux环境。通过正确配置和使用,它可以显著提升Web应用的性能,减少对...
总结来说,构建Memcached集群并在Linux上实现淘宝月光宝盒架构是一项涉及多个步骤的任务,包括安装Memcached、配置集群、设置客户端以及部署和管理MoonBox架构。理解这些概念和技术对于优化大规模Web应用的性能至关...
resty-redis-集群用于 redis 集群的 Openresty lua 客户端。我们为什么要建立这个客户端?Openresty 没有官方客户端可以支持 redis 集群。(我们可以在openresty/lua-resty-redis#43上看到讨论)。此外,查看其他第...
此外,通过负载均衡,WebLogic集群可以将来自客户端的请求均匀分配到各个服务器,避免单点过载。 在WebLogic集群中集成Coherence,我们可以利用Coherence的数据网格功能,创建一个分布式、高性能的缓存层。...
Node.js 的 Redis 集群客户端redis-clustr 教程 此模块是 node redis 客户端的一个相对较薄的包装器,以便使用Redis Cluster。...客户端被缓存,因此每个服务器只会建立一个连接。var RedisClustr = r
对于IIOP负载平衡,Shoal通过事件通知机制使远程客户端在节点故障时能够动态适应集群的变化,获取新的IIOP端点地址。而在事务服务方面,Shoal提供了恢复服务器选择通知和失败防护,支持自动的事务恢复操作,以确保...
6. Cluster集群:Redis Cluster支持自动分片,可以将数据分布在多个节点上,提供水平扩展能力。 二、Redis客户端 1. 客户端类型:Redis支持多种编程语言的客户端,如C、Python、Java、Node.js等,这些客户端提供了...
nhibernate调用各种分布式缓存客户端,包括Velocity,SysCache,SharedCache,Prevalence,MemCache,EnyimMemcached elocity是微软推出的分布式缓存解决方案,为开发可扩展性,可用的,高性能的应用程提供支持,可以...
缓存集群由代理层和存储层组成,为应用客户端提供统一的分布式缓存服务入口,基础组件包括 etcd 集群、Apollo 配置中心,为 TMC 提供“集群推送”和“统一配置”能力。 TMC 的基本流程是:Java 应用调用 Jedis-...
### Memcached缓存系统在Linux与Windows环境下的安装与集群配置 #### 一、概述 Memcached是一款高性能的分布式内存对象缓存系统,用于通过缓存数据库查询结果和其他开销较大的计算结果来减少数据库负载并加速动态...
### 搭建Redis缓存高可用集群环境详解 #### 一、Redis集群方案比较 在探讨具体的搭建步骤之前,我们需要了解两种常见的Redis集群模式:哨兵模式与高可用集群模式。 ##### 1.1 哨兵模式 在Redis 3.0以前的版本中...
3. **共享缓存**: 当多个Ehcache客户端连接到同一Terracotta Server时,它们将共享同一份缓存数据。这意味着对缓存的任何修改都会立即同步到其他节点。 4. **故障转移**: 如果一个服务器宕机,Ehcache可以自动切换...
Redis 是一款高性能的键值存储系统,常用于缓存和数据库解决方案。本文主要讨论了Redis的高可用集群搭建,特别是从哨兵模式到集群模式的转变,以及如何手动配置一个简单的Redis集群。 首先,Redis的高可用性可以...
- 当多个客户端同时操作同一份缓存数据时,需要考虑数据一致性问题。可以通过分布式锁、乐观锁、事件驱动等方式实现缓存同步,确保数据的一致性。 总结,Redis 作为一个高性能的键值数据库,广泛应用于缓存和...
本资料包含的是使用Java的jedis客户端操作Redis高可用集群的源码示例。通过这份资料,我们可以深入理解如何在Java应用中实现对Redis集群的高效且可靠的访问。 首先,让我们了解一下Redis集群的基本概念。Redis集群...