目录 #
Cluster 功能 [1.1] #
-
Redis Cluster支持多个master,每个master又可以挂载多个slave
- 读写分离
- 支持数据的高可用
-
故障转移, 高可用 由于Cluster自带Sentinel的故障转移机制,内置了高可用的支持, 无需再去使用哨兵功能
-
由对应的集群来负责维护节点、插槽和数据之间的关系
Slot #
Redis集群有16384个哈希槽每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽.
分片方式 #
- crc(key)% 16384
映射关系 #
key (→ CRC) 分片 分片 (→ 映射关系) 实例
slot分配 #
- 自动分配slot create()
- 手动分配slot meet() addSlot()
指令 #
- MOVED指令, ASK 指令
最大槽数是16384的原因 [1.3] #
[ redis 作者解答] why redis-cluster use 16384 slots? #2576 antirez
[中文翻译] 正常的心跳数据包带有节点的完整配置,可以用幂等方式用旧的节点替换旧节点,以便更新旧的配置。 这意味着它们包含原始节点的插槽配置,该节点使用2k的空间和16k的插槽,但是会使用8k的空间(使用65k的插槽)。同时,由于其他设计折衷,Redis集群不太可能扩展到1000个以上的主节点。 因此16k处于正确的范围内,以确保每个主机具有足够的插槽,最多可容纳1000个矩阵,但数量足够少,可以轻松地将插槽配置作为原始位图传播。请注意,在小型群集中,位图将难以压缩,因为当N较小时,位图将设置的slot / N位占设置位的很大百分比。
[解读]
- 消息头太大, 发送的心跳包过于庞大 如果槽位为65536,发送心跳信息的消息头达8k,发送的心跳包过于庞大。
在消息头中最占空间的是myslots[CLUSTER_SLOTS/8]。当槽位为65536时,这块的大小是:65536÷8÷1024=8kb
在消息头中最占空间的是myslots[CLUSTER_SLOTS/8]。当槽位为16384时,这块的大小是:16384∶8∶1024=2kb
因为每秒钟,redis节点需要发送一定数量的ping消息作为心跳包,如果槽位为65536,这个ping消息的消息头太大了,浪费带宽。
- 主节点数量上限为1000,无需65536个slot redis的集群主节点数量基本不可能超过个1000个。 集群节点越多,心跳包的消息体内携带的数据越多。如果节点过1000个,也会导致网络拥堵。因此redis作者不建议redis cluster节点数量超过1000个。那么,对于节点数在1000以内的redis cluster集群,16384个槽位够用了。没有必要拓展到65536个。
一致性 #
- Redis集群不保证强一致性 redis集群不保证强一致性,这意味着在特定的条件下,Redis集群可能会丢掉一些被系统收到的写入请求命令
参考 #
- 10.Redis集群(cluster) 1.1Redis集群介绍 1.2 Redis Cluster 1.3 Redis Cluster