Redis Cluster slot
slot 是什么
我们都知道在集群模式下key是需要进行路由的,那就需要有路由策略,Redis Cluster并没有使用一致性hash的方案,而是使用分配slot的方式进行key路由。
如何分配slot
Redis Cluster为整个集群定义了一共16384个slot,并通过crc16的hash函数来对key进行取模,将结果路由到预先分配过slot的相应节点上。
1.将节点加入Redis Cluster中
2.为集群中的节点分配slot(分配完成后,每个即诶单不仅直到自己的slot列表,还需要知道别的节点的slot列表)
3.分配完成后,key会根据crc16计算出得结果和16384取模进行slot定位,从而定位到具体节点。
举个例子
节点A保存了0-5500的slot
节点B保存了5501-11000的slot
节点C保存了11001-16383的slot
当客户端要执行 SET test 123 实际上会执行crc16(123)
具体流程如下:
客户端调用SET test 123
任意节点接受到指令,将执行crc16(test)=63534
63534%16384=14382
-
14382术语节点C因此将key test路由到C节点。
- 因为指令是发到任意节点的,如果这个节点不是C节点,则会触发MOVED命令,将命令发到相应node(各个节点保存了其他节点的slot列表)
重新分配slot
所有分片的算法都会面对一个问题,就是当节点增加或减少时怎么处理,Redis Cluster也不例外
当有节点D加入进来原本的A,B,C节点需要拿出一部分slot给到D,这样的操作就叫做slot重新分配。
redis-trib
redis Cluster 是使用redis-trib来自动实现的slot重新分配