设计目标是高可用,易伸缩的RedisCache集群方案,Cache的应用可以允许Key丢失,但应当越少越好:
- 故障转移:某个Redis实例故障应当可以把负责的key转移到其他实例。故障实例保存的数据可能丢失(符合Cache应用场景需求)
- 动态水平伸缩:应当可以在运行时动态增加Redis实例,以达到容量水平扩容。水平扩容可能造成部分Cache Key丢失(符合Cache应用场景需求)
- 配置简单,操作简便
1. 总体架构
- 每一个Redis实例都在Zookeeper当中注册一个SEQUENTIAL节点,每个Redis实例获得一个唯一ID方便一致性哈希算法的实现
- Client通过读取Zookeeper记录获取全集Redis实例信息,并按照一致性哈希完成Key->Redis的映射
Zookeeper中,Redis实例对应的SEQUENTIAL节点中保存如下字段:
其中状态字段有两种取值
- Available:该Redis实例可以正常访问
- Not working:该Redis实例在最近的状态检查中无法访问(可能随后恢复)
2. 启动Cache Manager
流程如下:
- 启动Cache Manager程序
- Cache Manager在Zookeeper上检查是否存在/cache_cluster节点,若没有则创建
- 启动Monitor线程(轮询维护Redis实例状态),详细功能见5.
- 监听80端口并提供Web管理界面
3. 新增Redis实例
- 1.启动Redis实例
- 2.访问Cache Manager,提供新增Redis实例IP、端口
- 3.Cache Manager在Zookeeper中为Redis实例在/cache_cluster下创建子节点:(IP,Port, Available)
4. 删除Redis实例
- 1.访问Cache Manager,指出要删除的Redis实例:对应/cache_cluster下的子节点名称
- 2.Cache Manager在Zookeeper中删除/cache_cluster下的对应子节点
5. 启动Client
在业务端首次通过Cache客户端访问Cache集群时触发,流程如下:
- 读取Zookeeper /cache_cluster 节点中,所有Redis实例的信息
- 把Redis实例信息保存在Client内存中
- Watch Zookeeper的/cache_cluster 节点,接受来自Zookeeper关于/cache_cluster子节点变化的通知
- 启动Monitor线程(轮询维护Redis实例状态)
6. Monitor线程
Cache Manager和Client启动之后对会创建Monitor线程,负责轮询Redis实例,并向更新Zookeeper更新,具体流程如下:
- 1.读取Zookeeper中所有Redis实例的信息,对于所有Redis实例,无论其是什么状态,完成步骤2~5
- 2.向每一个Redis实例发送PING包
- 3.若Redis实例返回正常Pong包,且当前Zookeeper中该Redis的状态信息为Not working,则将其更新为Available
- 4.若Redis实例超时无响应,则重试
- 5.若超过重试最大次数无响应,且当前Zookeeper中该Redis的状态信息为Available,则修改Zookeeper中相关节点的状态为Not working
每次Monitor/Cache Manager更新Redis实例信息,Client都会收到Zookeeper相应通知,收到通知后Client应当更新其缓存的Redis实例信息。
7. 访问Cache集群
- 从Client本地内存中查询所有Avalilable状态的Redis实例信息
- 根据一致性哈希计算要访问的Key->Redis的映射
- 访问Redis实例
- 若成功返回结果,否则返回NULL
访问失败返回NULL的情况分为以下几种情况,此时,应当从DB中读取数据重新存入Cache
- Redis实例正常访问,但是Redis实例上没有对应的键值
- Redis实例故障,但是Monitor线程没有发现故障,还没有更新Zookeeper全局配置信息
- Redis实例故障,并且Monitor已经发现并更新Zookeeper全局配置信息,但是Zookeeper还没有通知Client
- Redis实例故障,Monitor已经发现并更新Zookeeper全局配置信息,并且Zookeeper已经通知Client,但是Client还没有更新本地缓存
分享到:
相关推荐
#资源达人分享计划#
Redis3.0集群代理系统, 并发接收客户端请求,计算Key的哈希槽值,转发到对应的缓存服务器,并将缓存服务器的返回值回传给客户端, 这样客户端只要访问集群代理系统,实现一次性定位访问,效率与单台缓存服务器...
对已有的负载平衡的改进算法,通过一致性哈希算法,负载平衡更加的有效。
一致性哈希算法
集群原理:Redis的集群通过将数据划分为16384个哈希插槽,分配给多个Redis节点,来实现数据在多个Redis节点间的分布存储。 分布式集群搭建过程 环境准备:首先需要准备好Redis集群的基本环境,包括安装多个Redis...
一致性哈希算法,广泛应用于分布式计算,C版实现,属于分布式服务器管理的核心算法。
execMany 函数要求密钥映射器保持一致(即它应该知道密钥驻留在哪个服务器中)安装npm install node-redis-cluster默认值:基于哈希环的 Redis 集群默认集群使用在其节点之间分配密钥 var RedisCluster = require('...
一致性哈希算法的php版,希望能帮到phper了解一致性哈希
#资源达人分享计划#
支持Rediska一致性哈希算法端口。 用法 var RedisCluster = require('node-redis-cluster'); var redis = new RedisCluster({ servers : [{ host : '127.0.0.1', port : 6379, db : 0 }], redisFactory : Redis...
基于动态转移的分布式缓存系统一致性哈希算法改进,张昊,张永军,近年来,随着大数据与分布式集群的广泛应用,一致性哈希算法在分布式缓存系统的负载均衡中得到了广泛的应用。一致性哈希算法虽然
#资源达人分享计划#
通过使用nginx uri一致性哈希,将请求分发到10台缓存服务器上,总容量提升10倍,经过一致性哈希,命中率提升至999.9% 特别适合bazel服务相关的环境使用。 完整配置版本,下载后可直接启动使用。 1.sh bazel-remote...
scala-redis:一个scala库,用于在客户端使用一致的哈希连接到redis服务器或redis节点集群
#资源达人分享计划#
Mycat一致性哈希分片算法.zip Mycat一致性哈希分片算法.zip Mycat一致性哈希分片算法.zip Mycat一致性哈希分片算法.zip Mycat一致性哈希分片算法.zip
39、支持一致性哈希的客户端有哪些? 40、Redis 与其他 key-value 存储有什么不同? 41、Redis 的内存占用情况怎么样? 42、都有哪些办法可以降低 Redis 的内存使用情况呢? 43、查看 Redis 使用情况及状态信息用...
* 有两种方案,第一种普通hash分布,第二种一致性哈希分布 * * 普通hash分布 * 首先将key处理为一个32位字符串,取前8位,在经过hash计算处理成整数并返回,然后映射到其中一台服务器 * $servers[$this->...
11、Redis 集群方案什么情况下会导致整个集群不可用? 12、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 13、Redis 有哪些适合的场景? 14、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个...
NULL 博文链接:https://blackbeans.iteye.com/blog/1129256