Redis集群模式中节点变动导致数据重新映射的实现和原理探讨
- 问答
- 2026-01-03 14:37:28
- 2
Redis集群模式的核心目标是实现数据的分片存储和高可用性,当集群中的节点发生变动,比如为了扩容增加新节点,或者因为故障有节点下线时,集群必须能够自动地将数据重新分配到存活的节点上,并保证整个服务尽可能少地中断,这个过程的核心实现依赖于哈希槽(Hash Slot) 的重新映射机制。
数据分片的基础:哈希槽
Redis集群没有使用传统的一致性哈希算法,而是引入了哈希槽的概念来管理数据分片,整个集群被划分为16384个哈希槽(编号从0到16383),你可以把这些槽想象成一个个固定数量的、用来装数据的“桶”。
每个键值对存储在哪个槽里,是通过一个简单的计算决定的:对键的CRC16校验和取模16384,公式是:HASH_SLOT = CRC16(key) mod 16384,这样,任何一个键都能唯一地映射到这16384个槽中的某一个。
集群中的每个主节点负责处理其中一部分哈希槽,在一个有三个主节点的集群中,分配可能如下:
- 节点A负责槽0到5460。
- 节点B负责槽5461到10922。
- 节点C负责槽10923到16383。
当客户端要访问某个键时,它可以先计算该键对应的哈希槽,然后就知道应该去哪个节点上进行读写操作了。

节点变动时的数据迁移原理
节点变动主要分为两种情况:扩容(增加节点)和缩容(节点下线),无论是哪种情况,触发数据重新映射的根本原因是哈希槽的归属关系发生了变化。
扩容与数据迁移
假设我们向三节点集群中加入一个新的主节点D,集群的槽分配是不均衡的,新节点D还没有负责任何槽,为了重新平衡数据,集群需要从现有的节点(A、B、C)中匀出一部分哈希槽分配给D。

这个过程是逐步且受控的:
- 规划迁移:管理员通过集群管理命令,指示将一部分槽(比如从节点A的槽中分出0-1000)迁移到新节点D,集群的元数据(记录了每个槽由哪个节点负责)会开始更新,但迁移尚未开始。
- 设置迁移状态:集群会将槽0-1000标记为“迁移中”,源节点是A,目标节点是D,这个信息会通过集群的Gossip协议广播给所有节点,让它们逐渐知晓这一变化。
- 数据迁移:这是最关键的步骤,集群管理工具会开始逐个键地进行数据迁移。
- 对于源节点A上属于槽0-1000的每个键,它会被序列化并发送给目标节点D。
- 节点D接收到数据后,会将其反序列化并存入本地数据库。
- 一旦数据在D节点成功存储,源节点A就会删除本地的这个键。
- 处理迁移中的请求:在迁移过程中,如果客户端请求一个已经被迁走的键,源节点A会发现这个键已经不在自己这里了,但它知道这个键对应的槽正在迁往节点D,于是它会向客户端返回一个
-ASK重定向错误,并告知D节点的地址,客户端根据这个重定向信息,会重新向正确的节点D发起请求,这保证了在迁移过程中,读写请求基本不会丢失。 - 完成迁移:当槽0-1000内的所有键都迁移完毕后,管理员会执行命令,正式将槽0-1000的归属权从A节点变更到D节点,集群会再次广播这一最终的元数据变更,此后,所有客户端查询集群元数据时,都会知道槽0-1000由D节点负责,不再需要重定向。
节点故障与故障转移
当某个主节点(比如节点B)发生故障时,集群的高可用机制会启动。
- 故障发现:集群中的节点通过定期互相发送Ping/Pong消息来检测健康状态,如果大多数主节点在指定时间内都没有收到节点B的回应,它们会共同判定节点B为“故障”。
- 触发故障转移:节点B如果有一个或多个从节点(副本),其中一个从节点会被选举为新的主节点,这个选举过程由集群中其他存活的主节点投票完成。
- 槽的重新映射:新的主节点(原B的从节点)上任后,它会接管原节点B负责的所有哈希槽,集群会立即更新元数据,将原来属于B的槽(5461-10922)标记为由这个新节点负责。
- 客户端适配:客户端在尝试连接旧的故障节点B时,会收到连接错误,客户端会随机重试集群中的另一个节点,这个节点会返回一个
-MOVED重定向错误,明确告诉客户端槽5461-10922现在由哪个新节点负责,客户端会更新本地的槽位映射缓存,然后直接连接新的主节点,这个过程对应用来说是透明的,虽然会有一次重定向的延迟,但不会导致持久性的服务不可用。
Redis集群通过将数据空间固定为16384个哈希槽,简化了数据分片和管理的复杂度,节点变动的核心就是哈希槽所有权在不同节点间的转移,对于计划内的扩容缩容,通过数据迁移和ASK重定向机制,实现了数据的平滑移动,对于计划外的节点故障,通过故障转移和MOVED重定向机制,实现了服务的快速恢复,这种设计在数据一致性、可用性和可扩展性之间取得了良好的平衡。
(主要思想参考自Redis官方文档关于集群规范的描述)
本文由雪和泽于2026-01-03发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/73754.html
