Gossip 协议

Wu Jun 2020-01-05 05:43:49
Categories: > Tags:

Gossip的原始论文:《Efficient Reconciliation and Flow Control for Anti-Entropy Protocols

1 概述

1)特点
2)缺点
3)适用场景

Gossip 比较适合在没有很高一致性要求的场景中用于信息的同步。信息达到同步的时间大概是 log(N)。

2 通信方式

两个节点(A、B)之间存在三种通信方式:

在一个节点同步周期内,push需通信1次,pull需2次,push/pull需3次。从效果上来讲,push/pull最好,理论上一个周期内可以使两个节点完全一致。直观上也感觉,push/pull的收敛速度是最快的。

3 工作方式

Gossip节点的工作方式分两种:

一般采用Anti-Entropy模式,并由协调机制进行优化

协调机制

协调是在通信方式下的数据交换机制,主要讨论节点通信时,如何在有限的网络空间下,有效率地交换所有消息,达到最快的一致性。

1)精确协调(Precise Reconciliation)
2)整体协调(Scuttlebutt Reconciliation)

4 Cassandra中的实现

Cassandra实现了基于整体协调的push/push模式。

Gossip作用

Cassandra主要是使用Gossip完成三方面的功能:

启动流程

在 Cassandra 启动时,会启动 Gossip 服务,Gossip 服务启动后会启动一个任务 GossipTask,每秒钟运行一次,这个任务会周期性与其他节点进行通信。

  1. GossipTask 在 Gossip 启动后阻塞在 listenGate 变量上,当 Gossip 服务调用 listen 时才开始运行;
  2. 首先更新本节点的心跳版本号,然后构造需要发送给其他节点的消息 gDigests;
  3. 从存活节点中随机选择一个节点发送、从失效节点中随机选取一个发送。如果当前存活节点数小于种子数,向其中一个种子节点发送消息;
  4. 检查节点状态。

工作流程

每一秒钟,Gossiper 会随机选择集群内的一个节点,初始化和它之间的 Gossip 会话。每一轮 Gossip 需要三组数据;

  1. Gossip 初始化器选择一个节点发送一个 GossipDigestSynMessage;
  2. 当节点收到这个信息,它返回一个 GossipDigestAackMessage;
  3. 当初始化器从节点收到一个 ack 信息,它会发送给节点一个 GossipDigestAck2Message 以完成本轮 Gossip。