shardedjedis单分片挂掉整个集群不可用问题解决

shardedjedis是用来作redis分片集群的方式之一,根据redis key经过一致性哈希算法找到选择操做的redis服务分片。它是基于apache的开源项目通用对象管理池实现的,须要时从pool中获取,用完时放回到pool中(详情见http://www.cnblogs.com/chenjian5/p/5149312.html )。html

输入图片说明

在官方的实现中有一个问题当一个jedis(tcp client)建立链接失败或链接失效时抛异常(心跳检查或者使用时检查),池对象会被销毁,致使另外一个正常的jredis(tcp client)也一块被销毁了。同理若是一个redis服务分片挂掉全部的池对象到该redis分片服务的jedis(tcp client) 都不可用以致于全部的池对象都被销毁。进而致使整个集群不可用。git

所以本项目( https://git.oschina.net/zhanggaofeng/redis-proxy )针对该问题进行二次开发,池对象建立链接失败或链接失效抛异常时(心跳检查或者使用时检查),不会被销毁并加入到一个失效节点集合中,利用redis心跳检查(配置必须开启)失效节点和失效节点恢复(从失效节点中移除)。每次操做获取时首先判断根据key获取的jedis是否失效并快速失败返回(由于每次jedis操做前会判断tcp是否链接并尝试链接,每次回耗时很长特别是redis服务分片挂的时候),达到快送响应的目的。
增长redis链接失效和恢复报警。redis

相关文章
相关标签/搜索