Gossip
通常以随机的“对等选择”形式实现:以给定的频率,每台计算机随机选择另一台计算机,并共享任何消息。
一种比较原始的执行过程:
- 种子节点周期性的散播消息;
- 被感染节点随机选择N个邻接节点散播消息;
- 节点只接收消息不反馈结果;
- 每次散播消息都选择尚未发送过的节点进行散播;
- 收到消息的节点不回传散播;
整个传播过程可能需要一定的时间,但是理论上最终所有节点都会收到消息,因此它是一个最终一致性协议。
消息传播方式
- Anti-Entropy(反熵传播)
- Rumor-Mongering(谣言传播)
反熵传播(SI model)
每个节点周期性地随机选择其他节点,然后通过互相交换自己的所有数据来消除两者之间的差异。;所有参与节点只有两种状态:
- Suspective(病原):处于 susceptible 状态的节点代表其并没有收到来自其他节点的更新。
- Infective(感染):处于 infective 状态的节点代表其有数据更新,并且会将这个数据分享给其他节点。
缺点:每次节点两两交换带来非常大的通信负担。(因此,通常用于新加入节点的数据初始化)
谣言传播(SIR model)
仅传播新到达的数据,在某个时间点之后会被标记为removed,并且不再被传播。
所有参与节点有三种状态:Suspective(病原)、Infective(感染)、Removed(愈除)。
- Removed(愈除):其已经接收到来自其他节点的更新,但是其并不会将这个更新分享给其他节点。
通常用于节点间数据增量同步。
通信方式
两个节点之间的通信方式:
- Push:向A节点推送自己的信息;
- Pull:从A节点获取信息;
- PushAndPull:向A节点推送自己的信息,并从A节点获取信息;
优缺点
优点:
- 节点对等;
- 可扩展性:允许扩缩节点;
- 容错&故障检测
- 最终一致性
缺点:
- 消息延迟
- 消息冗余
- 拜占庭问题
QA
1.在一个庞大的集群中,对某个数据修改后,如何同步到其他节点?
- 谣言传播。
2.在一个去中心化的集群中,各节点都是对等节点。如何同步数据,使保证各节点数据达到一致?
- 新节点上线时,通过反熵拉取数据。数据更新时,通过谣言传播同步数据。
3.每次反熵都需要传输所有数据才能对比,有什么方案优化?
- 每次对比只传输增量数据进行对比;
- 对数据进行hash,先传输hash判断是否一致,再决定要不要传数据;
4.谣言传播何时停止?
- 提供一个概率或某个阈值。