设为首页 收藏本站
查看: 775|回复: 0

[经验分享] 基于Client端一致性哈希的Redis Cache 集群方案设计

[复制链接]

尚未签到

发表于 2016-12-20 11:30:34 | 显示全部楼层 |阅读模式
设计目标是高可用,易伸缩的RedisCache集群方案,Cache的应用可以允许Key丢失,但应当越少越好:

  • 故障转移:某个Redis实例故障应当可以把负责的key转移到其他实例。故障实例保存的数据可能丢失(符合Cache应用场景需求)
  • 动态水平伸缩:应当可以在运行时动态增加Redis实例,以达到容量水平扩容。水平扩容可能造成部分Cache Key丢失(符合Cache应用场景需求)
  • 配置简单,操作简便


1. 总体架构
DSC0000.png

  • 每一个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还没有更新本地缓存

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-316957-1-1.html 上篇帖子: 对redis数据持久化的一些想法[转] 下篇帖子: Redis与Memcached的incr/decr差异对比
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表