本博客整参考文章: 以及 以及
不同于master-salve 或者 哨兵模式 cluster与他们最大的区别就是 前两种是全量存储 内存消耗大,且存在木桶效应而 cluster集群则是分布式存储 即每台Redis存储不同的内容。
redis-cluster被设计为一共有16384个hash slot可用,每个master分得一部分的slot 其分布算法为:【hash_slot = crc16(key) mod 16384】 如果有{}则取{}的可用key,否则整个可以是可用key。集群至少要3主3从,且每个实例使用不同的配置文件。
-
所有的
redis
节点彼此互联(PING
-PONG
机制),内部使用二进制协议优化传输速度和带宽。 -
节点的
fail
是通过集群中超过半数的节点检测失效时才生效。 -
客户端与
redis
节点直连,不需要中间proxy
层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。 -
redis-cluster
把所有的物理节点映射到[0-16383
]slot
上,cluster
负责维护node
<->slot
<->value
redis-cluster投票:容错
-
投票过程是集群中所有
master
参与,如果半数以上master
节点与master
节点通信超时(cluster-node-timeout
),认为当前master
节点挂掉. -
什么时候整个集群不可用(
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,达到读写分离。