← 中文资源

简体中文版本

Gossip 协议

Gossip 协议通过周期性的随机对等交换,在节点之间传播成员和状态信息,无需中央协调者即可收敛。

阅读英文原文

工作原理

每个节点维护本地视图:对等节点列表,包含心跳计数、状态和元数据版本。每轮 gossip 中,节点选择一个或多个对等节点(通常随机)并交换视图。如果对等节点计数高于本地,接收方采用它。如果在超时时间内没有收到某节点消息,就标记为可疑,之后标记为死亡。更新呈指数扩散,几轮后大多数节点都会知道。

变体在方向上不同。push 向对等节点发送更新;pull 请求对等节点的视图;push-pull 双向交换,收敛更快。SWIM 把直接探测、通过其他节点的间接探测和 gossip 传播分开,减少误判故障。

用途

Gossip 传播集群成员、节点元数据、模式版本和配置,支持故障检测,并帮助客户端发现哪些节点存活。有些系统用它传播计数器或路由表,但不用于事务数据。

Gossip 不是共识协议。两个节点可能暂时不一致,被判定死亡的节点可能仍在运行并处理请求。需要单一领导者或已提交值的系统,会在 gossip 之外使用共识。

权衡

Gossip 有韧性、去中心化,扩展性好,因为每个节点维持固定扇出。代价是收敛延迟、后台流量和概率性检测。误判可能把健康节点标记为死亡并触发不必要的再平衡。调整超时是在快速发现故障与容忍网络抖动之间取得平衡。

示例与误解

一个 100 节点集群中,一个节点的模式版本过旧。它每秒与三个对等节点 gossip,几秒内所有节点都获知新版本并更新元数据。如果该节点被分区,对等节点会在超时后将其标记为可疑,但在路由表收敛前,仍有节点可能把读请求路由给它。

误解是 gossip 保证一致性。它只保证在连通性和时间假设下的最终传播;它不对并发更新排序,也不阻止两个节点基于不同视图行动。