Redis Cluster 是 Redis 官方提供的分布式解决方案,它通过分片(sharding)将数据分散到多个节点上,同时利用集群总线(cluster bus)和 Gossip 协议实现节点间的状态同步与故障检测。理解 cluster bus 和 Gossip 协议,是掌握 Redis Cluster 高可用与去中心化设计的关键。本文将从面试常见问题出发,深入剖析这两大机制。
一、什么是 cluster bus?
在 Redis Cluster 中,每个节点都会监听两个 TCP 端口:
- 客户端端口:默认 6379,用于处理客户端命令。
- 集群总线端口:默认是客户端端口 + 10000,即 16379,用于节点间通信。
这个集群总线端口就是 cluster bus。节点之间通过 cluster bus 交换信息,包括:
- 节点握手与加入集群
- 槽位(slot)分配与迁移
- 故障检测与故障转移
- 配置更新与状态同步
Cluster bus 使用二进制协议,相比客户端协议更紧凑,适合节点间高频通信。它基于 TCP 长连接,每个节点与集群中其他所有节点都保持一条 bus 连接,形成一个全连接网状拓扑。
二、Gossip 协议在 Redis Cluster 中的作用
Gossip 协议是一种去中心化的分布式通信协议,节点通过周期性地随机选择若干其他节点交换信息,最终使整个集群的状态达成一致。Redis Cluster 正是使用 Gossip 协议来传播节点状态、槽位信息、故障标记等。
2.1 为什么选择 Gossip?
- 去中心化:没有中心节点,避免单点故障。
- 可扩展性:每个节点只需与部分节点通信,消息传播呈指数扩散,适合大规模集群。
- 容错性:部分节点故障不影响整体信息传播。
- 最终一致性:虽然不能立即全局同步,但经过若干轮传播后,所有节点状态趋于一致。
2.2 Gossip 消息类型
Redis Cluster 的 cluster bus 上主要传输以下几种消息:
- MEET:用于将新节点加入集群。
- PING:节点定期向其他节点发送,用于心跳检测和状态交换。
- PONG:对 PING 或 MEET 的响应,携带自身状态信息。
- FAIL:当节点判定某节点下线时,广播故障信息。
- PUBLISH:用于在集群中传播 Pub/Sub 消息。
- FAILOVER_AUTH_REQUEST / FAILOVER_AUTH_ACK:用于故障转移时的选举投票。
这些消息都携带了发送节点的关键信息,如节点 ID、IP、端口、槽位分配、集群配置纪元(epoch)等。
三、Gossip 协议的通信流程
3.1 周期性 PING
每个节点每秒会随机选择 5 个其他节点发送 PING 消息。选择策略是:优先选择最近未通信的节点,确保信息能覆盖整个集群。收到 PING 的节点会回复 PONG,并附带自己的状态信息。
3.2 消息携带的信息
PING/PONG 消息中会携带以下关键字段:
- 节点 ID:40 位十六进制字符串,唯一标识节点。
- 槽位位图:表示该节点负责哪些哈希槽。
- 集群配置纪元:用于解决冲突,纪元大的配置优先。
- 节点角色:主节点或从节点。
- 故障标记:如 PFAIL、FAIL。
3.3 故障检测与传播
Redis Cluster 的故障检测分为两个阶段:
- PFAIL(疑似下线):节点 A 在
cluster-node-timeout时间内未收到节点 B 的 PONG,则标记 B 为 PFAIL。 - FAIL(确认下线):当集群中超过半数的主节点都将 B 标记为 PFAIL 时,某个节点会将其标记为 FAIL,并通过 Gossip 广播 FAIL 消息。所有节点收到后更新本地状态。
3.4 故障转移
当主节点被标记为 FAIL 后,其从节点会发起故障转移:
- 从节点向所有主节点发送
FAILOVER_AUTH_REQUEST。 - 主节点收到后,如果满足条件(如未投票给其他从节点、主节点负责的槽位有效等),回复
FAILOVER_AUTH_ACK。 - 从节点收到超过半数主节点的 ACK 后,晋升为主节点,并接管原主节点的槽位。
- 新主节点通过 Gossip 广播自己的新角色和槽位信息,集群最终达成一致。
四、Gossip 协议的优缺点
优点
- 去中心化:无中心节点,鲁棒性强。
- 可扩展:节点数量增加时,消息传播仍能保持较高效。
- 容错:部分节点故障不影响整体。
- 最终一致:经过多轮传播,状态最终一致。
缺点
- 消息延迟:状态变更不能立即全局同步,存在窗口期。
- 网络开销:全连接网状结构,节点数多时连接数和消息量增加。
- 脑裂风险:网络分区时可能产生多个主节点,需要依赖多数派投票和
cluster-node-timeout缓解。
五、面试常见问题
-
Redis Cluster 的 cluster bus 端口是多少?
默认是客户端端口 + 10000,即 16379。 -
Gossip 协议在 Redis Cluster 中如何工作?
节点周期性随机选择节点发送 PING,携带自身状态;接收方回复 PONG。通过多轮传播,集群状态最终一致。 -
Redis Cluster 如何判断节点下线?
先标记 PFAIL,当超过半数主节点都标记 PFAIL 后,升级为 FAIL,并广播。 -
故障转移时如何选举新主节点?
从节点发起投票请求,获得超过半数主节点 ACK 后晋升为主节点。 -
Gossip 协议有什么缺点?
消息延迟、网络开销、脑裂风险。 -
为什么 Redis Cluster 不采用 Raft 或 Paxos?
Raft/Paxos 通常用于强一致场景,而 Redis Cluster 追求高性能和去中心化,Gossip 更适合其最终一致的设计目标。
六、总结
Redis Cluster 通过 cluster bus 实现节点间高速通信,借助 Gossip 协议完成状态同步、故障检测和故障转移。这种去中心化的设计使 Redis Cluster 具备良好的可扩展性和容错性,但也带来了消息延迟和网络开销。理解 cluster bus 和 Gossip 协议,不仅有助于面试,更能帮助我们在生产环境中更好地运维和调优 Redis Cluster。
未经允许不得转载:任鹏个人博客 » Redis 的 cluster bus 通信机制和 gossip 协议

