---
title: Gossip 协议
url: https://doc.liz6.com/distributed-systems/05-members-and-discovery/02-gossip-protocol
locale: zh
area: distributed-systems
tags:
- distributed-systems
- 成员与发现
date: 2026-06-30
modified: 2026-06-30
description: 随机选对端、互相交换最新信息——gossip 用"闲聊"的方式在 O(log N) 轮内把信息传播到整个集群。没有 leader、没有共识、没有单点,代价是收敛前集群状态暂时不一致。从成员传播到反熵修复,gossip 是去中心化分布式系统的信息高速公路。
---

# 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*
