单线程

四季春风,不厌冬

  1. 槽位分配
    1. 槽位数量
  2. 重新分片
  3. 参考

  众所周知,key-value 是存储在redis数据库中,那么在redis集群中,key又是如何分配的呢?在使用上,即使不清楚key的定位方式,开发人员也能很好地使用redis,但是redis的设计思想值得我们学习。   

槽位分配

  一个集群默认拥有16384个槽位(slot),集群中所有的key都属于16384个槽位其中一个,所有槽位以某种方式分配至每个节点。
  
  每个节点都有一个clusterNode数据结构,该结构记录了节点负责处理哪些槽位。并且节点之间会经常通信,每个节点存储其他所有节点的槽位信息,所以通过任一节点都能找到某个槽位所在的目标节点。例如节点1001分配的槽位是0~100,1002分配的槽位是101~200,客户端操作key=”blog”,经过crc16(一种加密方式,类似MD5)计算得到150,即key=”blog”所属的槽位是150,那么客户端将会定位到节点1002。   

槽位数量

  一个集群默认16384个槽位,用户可以自己设置。理论上槽位数量没有限制,但是集群的节点之间需要频繁的交互信息,其中就包括槽位相关:unsigned char myslots[CLUSTER_SLOTS/8],根据以上依据,可以得出初步结论:信息占用空间随着CLUSTER_SLOTS单调递增。空间大小会影响网络传输效率,所以slot的数量不宜太大。

重新分片

  可以将任意数量已经指派给某个节点(源节点)的槽位改为指派给另一个节点(目标节点),并且相关槽位所拥有的键值对也会从源节点被移动到目标节点。重新分片操作可以在线上进行。
  
  因为复制节点的最小单位是key,而不是槽位,所以在迁移一个槽的过程中,可能某一个槽位其中一部分key在源节点,另一部分在目标节点,又重新分片可以在线上进行,所以当有属于该槽位的key被访问时,首先根据key计算出正在迁移的槽位,然后定位到源节点,如果key在源节点中,则直接返回value,否则返回目标节点的地址,最后客户端重新访问目标节点。

参考

本文作者 : pengqin.zhou
本文使用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议
本文链接 : https://www.zhoupq.com/blog/Redis-%E5%A6%82%E4%BD%95%E5%AE%9A%E4%BD%8Dkey%EF%BC%9F/

本文最后更新于 天前,文中所描述的信息可能已发生改变