概念
在Redis集群中没有采用一致性hash算法,而是采用更为简单的哈希槽(hash slot)的方式映射key和节点的关系,它实现了对数据的分片存储,解决了Redis在线扩容的问题。
在Redis Cluster集群模式中被划分为16384个槽位,每个节点负责其中一部分槽位slot,客户端查找某个key是根据槽位信息表,定位到目标节点。
槽位信息算法会对key值使用CRC16算法hash得到一个整数值,然后再对16384进行取模得到具体的槽位,Cluster集群模式中,用户可以自定义挂载到某个特定的slot的槽位上。
计算公式
hash slot=CRC16(key)%16384 。
哈希槽(hash slot)的优点
新增节点时,把其它的节点部分哈希槽(hash slot)移动到新的节点即可。
删除节点时,把要删除节点的哈希槽(hash slot)移动到其它的节点即可。
比如已有节点abc,
新增节点d,只需要将abc的部分哈希槽(hash slot)移动到d节点即可。
删除节点a,只需要将a的部分哈希槽(hash slot)移动到bc即可。
为什么不用一致性hash
因为作者认为CRC16新增节点,删除新增节点更佳容易。
扩容或者删除节点如何保证数据不丢失
1. 做好redis备份
2. 修改参数min-slaves-to-write=1 min-slaves-max-lag=10。