本页目录

Gossip 协议

随机选对端、互相交换最新信息——gossip 用"闲聊"的方式在 O(log N) 轮内把信息传播到整个集群。没有 leader、没有共识、没有单点,代价是收敛前集群状态暂时不一致。从成员传播到反熵修复,gossip 是去中心化分布式系统的信息高速公路。

三类 Gossip

Gossip 的核心是"每个节点周期性随机选一个 peer 交换信息"。根据信息流向分为三种:

Push (Rumor Mongering)

节点有更新 → 主动推给随机 peer → peer 继续推。

适合"hot"更新(最近发生、需要快速传播)。如果更新没有被推够足够多次(rumor stops circulating),需要 fallback(anti-entropy)。

Pull

节点主动从随机 peer 拉最新信息。适合新加入或长时间未同步的节点——只需一次 pull 就能追上。

Push-Pull

双方交换摘要 → 各自拉对方有新于自己的更新。最有效——双方都受益,网络利用率最高。

Epidemic Broadcast

Epidemic 保证了概率性可靠:O(log N) 轮后所有节点收到消息,概率 ≈ 1。

收敛分析

每轮: 每个节点随机选 1 个 peer 做 push-pull
Round 1: 1 node → 2 nodes know
Round 2: 2 → 4
Round 3: 4 → 8
...
Round log₂(N): 所有 node 都知道

这假设完美传播(无限带宽, 无丢包)
实际中: fanout = O(log N) per round → 概率性覆盖

对比可靠广播

  • Reliable broadcast (如 Raft AppendEntries): O(N) 消息, 确定性可靠, 需要 leader
  • Epidemic gossip: O(log N) 消息 per node, 概率性可靠, 无 leader, 容忍节点故障/网络分区

Anti-Entropy + Merkle Trees

Gossip 可能丢消息(概率性)。Anti-entropy 用全量比较填补遗漏。

Merkle tree: 每个 leaf node = hash(data block), 每个 internal node = hash(children)。两节点比较 root hash → 相同则数据一致 → 不同则递归比较 children → 定位到具体不一致的 block → 只传输这些 block。

优势:不需要传输全部数据就能找到不一致的部分。BitTorrent, Cassandra, Dynamo 都用 Merkle tree 做 anti-entropy。

SWIM 的 Gossip 层

SWIM 的 ping/ping-req 层负责故障检测。检测结果(suspected/confirmed dead)通过 gossip 传播。这是 push gossip 的一条实例:只有 suspected/dead 这类罕见事件被传播。

参考

  • 论文⁠: "Epidemic Algorithms for Replicated Database Maintenance" (Demers et al, 1987)
  • 论文⁠: "SWIM" (Das et al, 2002 — section 4: Dissemination)

Keywords: gossip, push-pull, epidemic broadcast, anti-entropy, Merkle tree, SWIM, probabilistic reliable