什么是 Gossip 协议

Gossip 协议,顾名思义,就像流言蜚语一样,利用一种随机、带有传染性的方式,将信息传播到整个网络中,并在一定时间内,使得系统内的所有节点数据一致。(最终一致性算法)

Gossip 的三板斧

直接邮寄(Direct Mail)

就是直接发送更新数据,当数据发送失败时,将数据缓存下来,然后重传。

直接邮寄虽然实现起来比较容易,数据同步也很及时,但可能会因为缓存队列满了而丢数据。也就是说,只采用直接邮寄是无法实现最终一致性的

反熵(Anti-entropy)

反熵指的是集群中的节点,每隔段时间就随机选择某个其他节点,然后通过互相交换自己的所有数据来消除两者之间的差异,实现数据的最终一致性

在实现反熵的时候,主要有推、拉和推拉三种方式。

1. 推

推方式,就是将自己的所有副本数据,推给对方,修复对方副本中的熵:

image.png

2. 拉

拉方式,就是拉取对方的所有副本数据,修复自己副本中的熵:

image.png

3. 推拉

这个方式就是同时修复自己副本和对方副本中的熵:

image.png

因为反熵需要节点两两交换和比对自己所有的数据,执行反熵时通讯成本会很高,所以我不建议你在实际场景中频繁执行反熵,并且可以通过引入校验和(Checksum)等机制,降低需要对比的数据量和通讯消息等。

谣言传播(Rumor mongering)

指的是当一个节点有了新数据后,这个节点变成活跃状态,并周期性地联系其他节点向其发送新数据,直到所有的节点都存储了该新数据.

image.png

如何使用 Anti-entropy 实现最终一致

在分布式存储系统中,实现数据副本最终一致性,最常用的方法就是反熵了。

数据缺失,分为这样 2 种情况:

  • 缺失分片:也就是说,在某个节点上整个分片都丢失了。
  • 节点之间的分片不一致:也就是说,节点上分片都存在,但里面的数据不一样,有数据丢失的情况发生。

缺失分片

第一种情况修复起来不复杂,我们只需要将分片数据,通过 RPC 通讯,从其他节点上拷贝过来就可以了:

image.png

分片间不一致

第二种情况修复起来要复杂一些。我们需要设计一个闭环的流程,按照一个顺序修复,执行完流程后,也就是实现了一致性了。

image.png

从图中你可以看到,数据修复的起始节点为节点 A,数据修复是按照顺时针顺序,循环修复的。需要你注意的是,最后节点 A 又对节点 B 的数据执行了一次数据修复操作,因为只有这样,节点 C 有、节点 B 缺失的差异数据,才会同步到节点 B 上。