分布式一致性协议-Gossip

Gossip诞生背景

Gossip 最早由施乐公司(Xerox,现在可能很多人不了解施乐了,或只把施乐当一家复印产品公司看待,这家公司是计算机许多关键技术的鼻祖,图形界面的发明者、以太网的发明者、激光打印机的发明者、MVC 架构的提出者、RPC 的提出者、BMP 格式的提出者……) Palo Alto 研究中心在论文《Epidemic Algorithms for Replicated Database Maintenance》中提出的一种用于分布式数据库在多节点间复制同步数据的算法。从论文题目中可以看出,最初它是被称作“流行病算法”(Epidemic Algorithm)的,只是不太雅观,今天 Gossip 这个名字已经用得更为普遍了,除此以外,它还有“流言算法”、“八卦算法”、“瘟疫算法”等别名,这些名字都是很形象化的描述,反应了 Gossip 的特点:要同步的信息如同流言一般传播、病毒一般扩散

Gossip工作原理

Gossip工作原理相比之前的Paxos和Raft简单的多,一句话总结就是:消息在网络节点中(像病毒🦠人传人一样)传播,最终所有节点数据达成一致(所有人都被病毒感染。如下图:

img

再来简单理解一下它的工作流程:

  • 如果有某一项信息需要在整个网络中所有节点中传播,那从信息源开始,选择一个固定的传播周期(譬如 1 秒),随机选择它相连接的 k 个节点(称为 Fan-Out,扇出)来传播消息。
  • 每一个节点收到消息后,如果这个消息是它之前没有收到过的,将在下一个周期内,选择除了发送消息给它的那个节点外的其他相邻 k 个节点发送相同的消息,直到最终网络中所有节点都收到了消息,尽管这个过程需要一定时间,但是理论上最终网络的所有节点都会拥有相同的消息。

Gossip特性

基于Gossip的工作原理可以看出它的特点:

  • 可扩展性。任何一个节点无论什么时候下线或者加入,并不会破坏整个系统的服务质量,最终所有节点都会达成一致。
  • 去中心化。Gossip不像Paxos和Raft,它的节点没有角色之分,节点都是对等的,任何一个节点无需知道整个网络状况,只要网络是连通的,任意一个节点就可以把消息散播到全网。
  • 容错性。网络中任何节点的宕机和重启都不会影响 Gossip 消息的传播,因为传播的过程在不断的进行着,当前连接不上某个节点,等节点恢复以后也同样会被“传染”。
  • 一致性收敛。Gossip 协议中的消息会以一传十、十传百一样的指数级速度在网络中快速传播,系统状态的不一致最快可以在logN的时间复杂度内收敛到一致。
  • 简单。Gossip 协议的过程极其简单,即不断进行“病毒”传播。

Gossip缺点

与此同时也能发现Gossip的不足之处:

  • 短暂不一致。由于每次只随机选取k个节点进行传播,所以往往会需要多轮传播节点才能达成一致。在这个过程中必然会存在短暂的不一致。
  • 消息冗余。同样是由于随机选取发送消息的节点,也就不可避免的存在消息重复发送给同一节点的情况,增加了网络的传输的压力,也给消息节点带来额外的处理负载。

降低达到一致状态耗费的时间貌似和降低消息的冗余程度这两个目标是矛盾的:要减少耗费的时间,就需要每次选取更多的节点发送消息,这样消息的冗余也随之增加,反之也一样。

Gossip传播模式

针对Gossip的缺点,Gossip提供了两种传播模式:反熵(Anti-Entropy)传播传谣(Rumor-Mongering)传播

反熵传播

熵(Entropy)代表着事物的混乱程度。反熵的意思就是降低混乱程度,以提升网络各个节点之间的相似度为目标,所以在反熵模式下,会同步节点的全部数据,以消除各节点之间的差异,目标是整个网络各节点完全的一致。这个目标将使得整个网络中消息的数量非常庞大,给网络带来巨大的传输开销。

谣言传播

传播消息为目标,仅仅发送新到达节点的数据,即只对外发送变更的增量数据,这样消息数据量将显著缩减,网络开销也相对较小。

Gossip通信方式

Gossip 协议最终目的是将数据分发到网络中的每一个节点。根据不同的具体应用场景,网络中两个节
点之间存在三种通信方式:Push(推送模式)、Pull(拉取模式)、Push/Pull(推/拉模式)。

Push

节点 A 将数据 (key,value,version) 及对应的版本号推送给 B 节点,B 节点更新 A 中比自己新的数
据。
在这里插入图片描述

Pull

A 仅将数据 key, version 推送给 B,B 将本地比 A 新的数据(Key, value, version)推送给 A,A 更
新本地。
在这里插入图片描述

Push/Pull

在这里插入图片描述
如果把两个节点数据同步一次定义为一个周期,则在一个周期内,Push 需通信 1 次,Pull 需 2 次,Push/Pull 则需 3 次。虽然消息数增加了,但从效果上来讲,Push/Pull 最好,理论上一个周期内可以使两个节点完全一致。直观上,Push/Pull 的收敛速度也是最快的。

Gossip的应用

Gossip协议的主要用途就是信息传播和扩散:即把一些发生的事件传播到全世界。它们也被用于数据库复制,信息扩散,集群成员身份确认,故障探测等。适合于 AP 场景的数据一致性处理,常见应用有:P2P 网络通信、Apache Cassandra、Redis Cluster、Consul。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值