本博客整参考文章:redis架构演变与redis-cluster群集读写方案 以及 Redis cluster集群:原理及搭建 以及 redis官方集群文档html
不一样于master-salve 或者 哨兵模式 cluster与他们最大的区别就是 前两种是全量存储 内存消耗大,且存在木桶效应而 cluster集群则是分布式存储 即每台Redis存储不一样的内容。node
redis-cluster被设计为一共有16384个hash slot可用,每一个master分得一部分的slot 其分布算法为:【hash_slot = crc16(key) mod 16384】 若是有{}则取{}的可用key,不然整个能够是可用key。集群至少要3主3从,且每一个实例使用不一样的配置文件。redis
全部的redis
节点彼此互联(PING
-PONG
机制),内部使用二进制协议优化传输速度和带宽。算法
节点的fail
是经过集群中超过半数的节点检测失效时才生效。架构
客户端与redis
节点直连,不须要中间proxy
层.客户端不须要链接集群全部节点,链接集群中任何一个可用节点便可。分布式
redis-cluster
把全部的物理节点映射到[0-16383
]slot
上,cluster
负责维护node
<->slot
<->value
优化
redis-cluster投票:容错ui
投票过程是集群中全部master
参与,若是半数以上master
节点与master
节点通讯超时(cluster-node-timeout
),认为当前master
节点挂掉..net
何时整个集群不可用(cluster_state:fail
)?设计
master
挂掉,且当前master
没有slave
.集群进入fail
状态,也能够理解成集群的slot
映射[0-16383
]不完整时进入fail状态.
redis-3.0.0.rc1
加入cluster-require-full-coverage
参数,默认关闭,打开集群兼容部分失败.master
挂掉,不管是否有slave
,集群进入fail
状态。
在redis-cluster架构中,redis-master节点通常用于接收读写,而redis-slave节点则通常只用于备份,其与对应的master拥有相同的slot集合,若某个redis-master意外失效,则再将其对应的slave进行升级为临时redis-master。
在redis的官方文档中,对redis-cluster架构上,有这样的说明:在cluster架构下,默认的,通常redis-master用于接收读写,而redis-slave则用于备份,当有请求是在向slave发起时,会直接重定向到对应key所在的master来处理。但若是不介意读取的是redis-cluster中有可能过时的数据而且对写请求不感兴趣时,则亦可经过readonly命令,将slave设置成可读,而后经过slave获取相关的key,达到读写分离。