gossip是一个去中心化思路的分布式通信协议,主要用在分布式数据库系统中各个副本节点同步数据之用,这种场景的一个最大特点就是组成的网络的节点都是对等节点,是非结构化网络,这区别于结构化网络。

Gossip Protocol原本用于分布式数据库中节点同步数据使用,后来被广泛用于数据库复制、信息扩散、集群成员身份确认、故障探测等,应用实例有Redis集群、springcloud consul等。

问题
● 如何在多个不可靠、变化缓慢的网络中将多个节点实现并保持数据一致性的方法
目标
● 设计一种高效且强大的算法,并随着节点数量的增加而优雅地扩展。
算法考量因素
● 信息变更后,更新传播到所有节点所需的时间
●传播单个更新时生成的网络流量

执行过程:

Gossip 过程是由种子节点发起,当一个种子节点有状态需要更新到网络中的其他节点时,它会随机的选择周围几个节点散播消息,收到消息的节点也会重复该过程,直至最终网络中所有的节点都收到了消息。这个过程可能需要一定的时间,由于不能保证某个时刻所有节点都收到消息,但是理论上最终所有节点都会收到消息,因此它是一个最终一致性协议。

注意:Gossip 过程是异步的,也就是说发消息的节点不会关注对方是否收到,即不等待响应;不管对方有没有收到,它都会每隔 1 秒向周围节点发消息。异步是它的优点,而消息冗余则是它的缺点。

Gossip 的特点(优势)

1)扩展性

网络可以允许节点的任意增加和减少,新增加的节点的状态最终会与其他节点一致。

2)容错

网络中任何节点的宕机和重启都不会影响 Gossip 消息的传播,Gossip 协议具有天然的分布式系统容错特性。

3)去中心化

Gossip 协议不要求任何中心节点,所有节点都可以是对等的,任何一个节点无需知道整个网络状况,只要网络是连通的,任意一个节点就可以把消息散播到全网。

4)一致性收敛

Gossip 协议中的消息会以一传十、十传百一样的指数级速度在网络中快速传播,因此系统状态的不一致可以在很快的时间内收敛到一致。消息传播速度达到了 logN。

5)简单

Gossip 协议的过程极其简单,实现起来几乎没有太多复杂性。

Gossip 的缺陷

分布式网络中,没有一种完美的解决方案,Gossip 协议跟其他协议一样,也有一些不可避免的缺陷,主要是两个:

1)消息的延迟

由于 Gossip 协议中,节点只会随机向少数几个节点发送消息,消息最终是通过多个轮次的散播而到达全网的,因此使用 Gossip 协议会造成不可避免的消息延迟。不适合用在对实时性要求较高的场景下。

2)消息冗余

Gossip 协议规定,节点会定期随机选择周围节点发送消息,而收到消息的节点也会重复该步骤,因此就不可避免的存在消息重复发送给同一节点的情况,造成了消息的冗余,同时也增加了收到消息的节点的处理压力。而且,由于是定期发送,因此,即使收到了消息的节点还会反复收到重复消息,加重了消息的冗余。

Gossip协议机制

直接邮寄(Direct Mail)、反熵(Anti-entropy)和谣言传播(Rumor mongering)是实现最终一致性的常用三种方法。

●直接邮寄(Direct Mail)
每个节点更新都会立即从其变更节点邮寄通知到所有其他节点。

主要是当节点有数据更新便开始遍历节点池,遍历发送其他所有节点消息来通知自身节点数据的更新情况

好处:实现起来比较容易,数据同步也很及时
缺点:可能会因为A的缓存队列满了而丢数据,所以只采用直接邮寄是无法实现最终一致性的。

  1. 节点A发送数据给B成功。
  2. 节点A发送数据给D失败,但是节点A的缓存满了,发送的数据无法保存。
  3. 节点B和D数据不一致

●反熵(Anti-entropy) 熵:混乱的意思,反熵,就是反差异的意思

每个节点都会定期随机选择节点池中的一些节点,通过交换数据内容来解决两者之间的任何差异。

  1. 所有参与节点只有两种状态:Suspective(病原)、Infective(感染)
  2. 过程是种子节点会把所有的数据都跟其他节点共享,以便消除节点之间数据的任何不一致
  3. 缺点是消息数量非常庞大,且无限制;通常只用于新加入节点的数据初始化。

反熵是一种通过异步修复实现最终一致性的方法。

方式

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

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

● 推拉
就是同时修复自己副本和对方副本中的熵

对于反熵(anti-entropy) 这种方式,和直接邮寄(direct mail)相比的最大特点就是解决了消息丢失无法补偿容错导致的数据无法保持一致的致命问题。它通过单点的定时随机通知周边节点进行数据交互的方式保持各节点之间数据的一致性。这里需要注意的是,一致性的保持是在节点数据变更后一段时间内通过节点间的数据交互逐渐完成的最终一致,并且由于每个节点都定期广播数据到周边随机的一部分节点,因此在数据交互上是存在冗余和延迟的。

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

执行反熵时,相关的节点都是已知的,而且节点数量不能太多,如果是一个动态变化或节点数比较多的分布式环境(比如在 DevOps 环境中检测节点故障,并动态维护集群节点状态),这时反熵就不适用了。那么当你面临这个情况要怎样实现最终一致性呢?答案就是谣言传播。

●谣言传播(Rumor mongering)

  1. 所有的节点在最开始没有产生数据变更时都假设是未知状态,它是不知道任何谣言信息的
  2. 当节点收到其他节点更新数据通知时,相当于听到了一条谣言,并将其视为热门开始传播给周边节点
  3. 当某个节点谣言盛行时,它会定期随机选择其他节点,并确保另一个节点知道
  4. 当某个节点发现周边节点都知道这个谣言时,该节点将停止将该谣言视为热点,并保留更新,而不会进一步传播
    节点 A 向节点 B、D 发送新数据
    节点 B 收到新数据后,变成活跃节点,然后节点 B 向节点 C、D 发送新数据。

gossip 算法实现伪代码
Anti-Entropy(反熵) 和 Rumor-Mongering(谣言传播) 的实现伪代码


Gossip协议通过反熵传播(anti-entropy)和谣言传播(rumor mongering)两种机制进行实现并保证节点数据的最终一致性。

  1. 种子节点周期性的散播消息
  2. 被感染节点随机选择N个邻接节点散播消息
  3. 节点只接收消息不反馈结果,每次散播消息都选择尚未发送过的节点进行散播
  4. 收到消息的节点不再往发送节点散播,即单向不可逆,如A -> B,那么B进行散播的时候,不再发给 A

协议可以支持以下需求

  1. Database replication
  2. 消息传播
  3. Cluster membership
  4. Failure 检测
  5. Overlay Networks
  6. Aggregations (比如计算平均值、最大值以及总和)

总结
Gossip是一个去中心化的分布式协议,数据通过节点像病毒一样逐个传播,整体传播速度非常快,很像现在全球蔓延的新冠病毒(2019-nCoV)。
Gossip的信息传播和扩散通常需要由种子节点发起。整个传播过程可能需要一定的时间,由于不能保证某个时刻所有节点都收到消息,但是理论上最终所有节点都会收到消息,因此它是最终一致性协议。
Gossip是一个多主协议,所有写操作可以由不同节点发起,并且同步给其他副本。Gossip内组成的网络节点都是对等节点,是非结构化网络。

Gossip协议笔记--谣言、流行病协议相关推荐

  1. L2TP协议笔记2---L2TP主要协议报文分析

    五.L2TP的Tunnel和Session建立过程   ① 1(SCCRQ)Start-Control-Connection-Request       控制链接发起请求,由LAC或LNS向对端发送, ...

  2. 趣谈网络协议笔记-二(第十九讲)

    趣谈网络协议笔记-二(第十九讲) HttpDNS:网络世界的地址簿也会指错路 自勉 勿谓言之不预也 -- 向为祖国牺牲的先烈致敬! 引用 dns缓存刷新时间是多久?dns本地缓存时间介绍 - 东大网管 ...

  3. 趣谈网络协议笔记-二(第十八讲)

    趣谈网络协议笔记-二(第十八讲) DNS协议:网络世界的地址簿 自勉 勿谓言之不预也 -- 向为祖国牺牲的先烈致敬! 正文 DNS用于域名解析,但也不仅仅是用于域名解析,不仅仅是将域名转换成IP. 在 ...

  4. 趣谈网络协议笔记-二(第十七讲)

    趣谈网络协议笔记-二(第十七讲) P2P协议:我下小电影,99%急死你 自勉 逃离舒适区! 正文 一. P2P协议 整个篇章讲的就是这两个协议之间的区别.P2P协议就是迅雷下载数据时所用的协议, 众所 ...

  5. 趣谈网络协议笔记-二(第十六讲上)

    趣谈网络协议笔记-二(第十六讲上) 流媒体协议:如何在直播里看到美女帅哥? 自勉 给岁月以文明,而不是给文明以岁月!--<三体> 在触不到的獠牙上点火--就像不必仰望那星星就能够解决--就 ...

  6. 趣谈网络协议笔记-二(第十三讲)

    趣谈网络协议笔记-二(第十三讲) 套接字Socket:Talk is cheap, show me the code 前言 这只是笔记,是为了整理刘超大神的极客时间专栏的只是而存在的! 经常会在网络上 ...

  7. 趣谈网络协议笔记-二(第十二讲)

    趣谈网络协议笔记-二(第十二讲) TCP协议(下):西行必定多妖孽,恒心智慧消磨难 前言 哈哈哈,越当我看刘超的通俗讲解,我就越感觉自己的无能.每次当我看了讲解之后,每次当我感觉到这个东西原来是这么简 ...

  8. 趣谈网络协议笔记-二(第十一讲)

    趣谈网络协议笔记-二(第十一讲) TCP协议(上):因性恶而复杂,先恶后善反轻松 自勉 我似乎天性不擅长争斗,但是有些时候,我也必须砥砺前行. 强大是和平的前提,而善良不是. 前言 今天回到家里已经是 ...

  9. 趣谈网络协议笔记-二(第十讲)

    趣谈网络协议笔记-二(第十讲) UDP协议:因性善而简单,难免碰到"城会玩" 自勉 如果手上没有剑,我就无法保护你.如果我一直握着剑,我就无法抱紧你.--<Bleach> ...

  10. 趣谈网络协议笔记-二(第七,八,九讲)

    趣谈网络协议笔记-二(第七,八,九讲) 勉励 人生而自由,却无往不在枷锁(牢笼)之中. ------卢梭@<社会契约论> 为那些有形的牢笼感到庆幸吧. 为自己出生于这个时代感到庆幸吧,因为 ...

最新文章

  1. SQL some any all
  2. poj2456 Aggressive cows(二分查找)
  3. 小程序 报错errMsg: “hideLoading:fail:toast can‘t be found“ ?
  4. 709. 转换成小写字母 golang 字符串处理
  5. html四边形的的框怎么编写,html知识点之利用css四边形切角并且加上边框
  6. Java基础篇(04):日期与时间API用法详解
  7. 【opencv学习】【运动物体检测】
  8. 拒绝病毒威胁 为U盘请个“保护神”
  9. JAVA内存释放机制
  10. 程序员面试金典——4.1二叉树平衡检查
  11. [导入]ASP.NET AJAX 说明文档-客户端引用-全局命名空间-JavaScript 基础类型扩展-Array 类型扩展...
  12. 训练SnowNLP新模型
  13. 图片字节数组的获取,字节数组图片的保存
  14. leetcode 最佳买卖股票时机含冷冻期(Java)
  15. 数据可视化BI平台选型调研报告 Superset VS Redash VS Metabase
  16. 6-26 统计专业人数 (15分)
  17. eks安装kubectl
  18. PHP开发日志 ━━ php、javascript生成二维码的三种方法
  19. 【Unity 3D】常用插件DOTween、Haste、Exploder、KGFMapSystem介绍(图文解释)
  20. 寄生虫程序的设计思路

热门文章

  1. 机器人领域的SCI期刊和会议
  2. 如何在WPS中加入图表清单(类似生成自动目录)
  3. cc2430 外部中断
  4. 一分钟快速制作电子签名
  5. python模拟ios点击_使用Xcode + Python进行IOS运动轨迹模拟
  6. 中英文自动翻译(有道翻译、彩云小译)
  7. SECS/GSM 测试工具
  8. centos usb转网口_CentOS 6.5安装qf9700 USB网卡驱动
  9. WMI服务不存在或标记为删除解决方案
  10. 想用好低代码这把“双刃剑”,先搞清楚这三个问题|低代码系列(四)