Redis 的 cluster bus 通信机制和 gossip 协议

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 的故障检测分为两个阶段:

  1. PFAIL(疑似下线):节点 A 在 cluster-node-timeout 时间内未收到节点 B 的 PONG,则标记 B 为 PFAIL。
  2. FAIL(确认下线):当集群中超过半数的主节点都将 B 标记为 PFAIL 时,某个节点会将其标记为 FAIL,并通过 Gossip 广播 FAIL 消息。所有节点收到后更新本地状态。

3.4 故障转移

当主节点被标记为 FAIL 后,其从节点会发起故障转移:

  1. 从节点向所有主节点发送 FAILOVER_AUTH_REQUEST
  2. 主节点收到后,如果满足条件(如未投票给其他从节点、主节点负责的槽位有效等),回复 FAILOVER_AUTH_ACK
  3. 从节点收到超过半数主节点的 ACK 后,晋升为主节点,并接管原主节点的槽位。
  4. 新主节点通过 Gossip 广播自己的新角色和槽位信息,集群最终达成一致。

四、Gossip 协议的优缺点

优点

  • 去中心化:无中心节点,鲁棒性强。
  • 可扩展:节点数量增加时,消息传播仍能保持较高效。
  • 容错:部分节点故障不影响整体。
  • 最终一致:经过多轮传播,状态最终一致。

缺点

  • 消息延迟:状态变更不能立即全局同步,存在窗口期。
  • 网络开销:全连接网状结构,节点数多时连接数和消息量增加。
  • 脑裂风险:网络分区时可能产生多个主节点,需要依赖多数派投票和 cluster-node-timeout 缓解。

五、面试常见问题

  1. Redis Cluster 的 cluster bus 端口是多少?
    默认是客户端端口 + 10000,即 16379。

  2. Gossip 协议在 Redis Cluster 中如何工作?
    节点周期性随机选择节点发送 PING,携带自身状态;接收方回复 PONG。通过多轮传播,集群状态最终一致。

  3. Redis Cluster 如何判断节点下线?
    先标记 PFAIL,当超过半数主节点都标记 PFAIL 后,升级为 FAIL,并广播。

  4. 故障转移时如何选举新主节点?
    从节点发起投票请求,获得超过半数主节点 ACK 后晋升为主节点。

  5. Gossip 协议有什么缺点?
    消息延迟、网络开销、脑裂风险。

  6. 为什么 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 协议

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏