`
chong_zh
  • 浏览: 69967 次
  • 来自: 杭州
社区版块
存档分类
最新评论

基于Client端一致性哈希的Redis Cache 集群方案设计

 
阅读更多
设计目标是高可用,易伸缩的RedisCache集群方案,Cache的应用可以允许Key丢失,但应当越少越好:
  • 故障转移:某个Redis实例故障应当可以把负责的key转移到其他实例。故障实例保存的数据可能丢失(符合Cache应用场景需求)
  • 动态水平伸缩:应当可以在运行时动态增加Redis实例,以达到容量水平扩容。水平扩容可能造成部分Cache Key丢失(符合Cache应用场景需求)
  • 配置简单,操作简便


1. 总体架构

  • 每一个Redis实例都在Zookeeper当中注册一个SEQUENTIAL节点,每个Redis实例获得一个唯一ID方便一致性哈希算法的实现
  • Client通过读取Zookeeper记录获取全集Redis实例信息,并按照一致性哈希完成Key->Redis的映射

Zookeeper中,Redis实例对应的SEQUENTIAL节点中保存如下字段:
IP端口状态

其中状态字段有两种取值
  • 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还没有更新本地缓存

分享到:
评论
2 楼 chong_zh 2015-05-28  
xudonu 写道
架构中的cache manage与web界面需要自己实现?

对的
1 楼 xudonu 2015-05-07  
架构中的cache manage与web界面需要自己实现?

相关推荐

Global site tag (gtag.js) - Google Analytics