Gossip 协议实现最终一致性
背景
有些系统对可用性比较敏感,例如监控主机和业务运行的告警系统,我们希望系统在极端条件(例如集群中只有一个节点可用)下也能正常运行。
根据 BASE 理论,我们需要实现最终一致性,那怎么样才能实现最终一致性呢?
我们可以采用 Gossip 协议来实现最终一致性。顾名思义,Gossip 协议就像流言蜚语一样,采用随机的、传染性的方式将信息传播到网络中,经过一定的时间后,所有副本的数据达成一致。
技术组成
Gossip 协议的三板斧:直接邮寄、反熵、谣言传播。
直接邮寄
直接邮寄指直接把更新数据发送给其他节点。如果数据发送失败,就把数据缓存下来,定时重传。
优点:实现简单,数据同步及时。
缺点:缓存失败数据的队列是有大小的,有可能因为队列满而丢失数据。所以,单单依赖直接邮寄是无法实现最终一致性的。
反熵
反熵指集群中的节点,每隔一段时间就随机选择某个其他节点,通过互相交换数据来消除数据差异,实现数据的最终一致性。总结一下,反熵是通过异步修复实现数据最终一致性的方法。
缺点:反熵需要节点之间两两交换和比对数据,通讯的成本比较高,不适合频繁执行。可以通过引入校验和checksum 等机制,来降低通讯的成本。
实现:实际中,我们希望在一个确定的时间范围内修复节点数据的不一致,所以我们通常是按一定的顺序修复节点数据的差异,而不是采用定义中所说的随机选择的方式。
谣言传播
谣言传播指一个节点有了新数据之后,就转为活跃状态,周期性地向其它节点发送新数据,直到所有节点都有了新数据。
优点:具有传染性,适合节点动态变化、节点数量比较多的分布式系统。
缺点:无法确定所有节点的数据何时达到一致。