-
之前在使用Redis集群的时候,发现集群的slot的个数是16384个,对这个数字比较好奇,查了一些资料,这里记录下基于资料我自己的理解。
-
查了一下,github里redis项目的issue里专门有对这个问题的解答,传送门
-
这里记录下我自己的理解。
- Redis集群中,计算key位于哪个slot时,会先用crc16(key)函数计算key的哈希值,然后再用哈希值对216取模,取模结果有216 -1=65535个余值,可能很多人会有疑问, slot的个数为什么不是65536?这里主要是有两方面的考虑:
- redis集群中各节点间会定时通过心跳发送消息,以让其他节点知道当前节点存活,并且利用Gossip协议交换节点间的信息;心跳消息中包含一个节点的完整配置信息,包括slot bitmap的信息。如果是16384个slot,占的空间为16384个位,即16384/8=2048=2KB空间。而如果是65536个slot,即65536位,占用空间为65536/8=8KB;16384个slot占用的空间更少;
- 由于其他的设计权衡,redis集群中master节点数基本上不超过1000个;在最大集群规模下,slot均匀分配的情况下,每个节点平均分到的slot不至于太少。
- 基于以上两点,对于最多1000个主节点的redis集群,16384个slot在合理的范围内;但是呢,更少的slot bitmap在节点间传播slot配置信息的时候更快。
- 简单来说,16384个slot占用空间更少;对于最多1000个master的redis集群来说,也完全够用。所以规定为16384个slot,而不是65536个。