分布式共识算法——Gossip协议(图解)

Posted 杨 戬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式共识算法——Gossip协议(图解)相关的知识,希望对你有一定的参考价值。

文章目录

Gossip 协议

Gossip 协议概念

说到共识算法,大家首先想到的应该都是 Raft、Paxos、Zab 算法这类理解起来比较困难的强一致性算法。

但是还有一个弱一致性的共识算法比较好理解,Gossip 协议

与 Paxos 和 Raft 目标是强一致性不同,Gossip 达到的是最终一致性

官网的解释是这样的:A gossip protocol is a procedure or process of computer peer-to-peer communication that is based on the way epidemics spread.

翻译过来就是: Gossip 协议是基于流行病传播方式的计算机对等通信的过程或过程

它可以快速地将信息散播给集群中每个成员,散播速度为 𝑙 𝑜 𝑔 𝑓 ( 𝑁 ) 𝑙𝑜𝑔_𝑓 (𝑁) logf(N) ,其中 f 术语称为 fanout,代表每次随机传播的成员数,而 N 代表总共成员数。例如:

  • 𝑙 𝑜 𝑔 4 ( 40 ) ≈ 2.66 𝑙𝑜𝑔_4 (40)≈2.66 log4(40)2.66 ,也就是大约三轮传播,就可以让集群达到一致
  • 实际传播次数可能会高于此结果,因为随机时会随到一些重复的成员

Gossip,单词,意思是“流言蜚语”

Gossip 协议工作流程图解

学习网站:https://flopezluis.github.io/gossip-simulator/# Gossip 可视化

Gossip协议执行过程如下:

  • 种子节点周期性的散播消息 【假定把周期限定为 1 秒】。
  • 被感染节点随机选择N个邻接节点散播消息【假定fan-out(扇出)设置为6,每次最多往6个节点散播】。
  • 节点只接收消息不反馈结果。
  • 每次散播消息都选择尚未发送过的节点进行散播。
  • 收到消息的节点不再往发送节点散播:A -> B,那么B进行散播的时候,不再发给 A。
  1. 例如,图中红色节点有其它节点不知道的信息,它的传播方式如下

  1. 在红色节点能连通的节点中随机挑选 fanout 个(粗线所示)

  1. 把信息传播给它们(感染)

  1. 在这些已被【感染】的节点中,重复 2. 3. 两步,直至全部感染,即达到最终一致性

Gossip 协议原理

Goosip 协议的信息传播和扩散通常需要由种子节点发起。整个传播过程可能需要一定的时间,由于不能保证某个时刻所有节点都收到消息,但是理论上最终所有节点都会收到消息,因此它是一个最终一致性协议。

Gossip协议是一个多主协议,所有写操作可以由不同节点发起,并且同步给其他副本。Gossip内组成的网络节点都是对等节点,是非结构化网络。

消息类型

Gossip 协议的消息传播方式有两种:Anti-Entropy(反熵传播)和Rumor-Mongering(谣言传播)。

反熵传播是以固定的概率传播所有的数据。所有参与节点只有两种状态:Suspective(病原)、Infective(感染)。这种节点状态又叫做simple epidemics(SI model)。过程是种子节点会把所有的数据都跟其他节点共享,以便消除节点之间数据的任何不一致,它可以保证最终、完全的一致。缺点是消息数量非常庞大,且无限制;通常只用于新加入节点的数据初始化。

谣言传播是以固定的概率仅传播新到达的数据。所有参与节点有三种状态:Suspective(病原)、Infective(感染)、Removed(愈除)。这种节点状态又叫做complex epidemics(SIR model)。过程是消息只包含最新 update,谣言消息在某个时间点之后会被标记为 removed,并且不再被传播。缺点是系统有一定的概率会不一致,通常用于节点间数据增量同步。

通信方式

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

  • Push: 节点 A 将数据 (key,value,version) 及对应的版本号推送给 B 节点,B 节点更新 A 中比自己新的数据
  • Pull:A 仅将数据 key, version 推送给 B,B 将本地比 A 新的数据(Key, value, version)推送给 A,A 更新本地
  • Push/Pull:与 Pull 类似,只是多了一步,A 再将本地比 B 新的数据推送给 B,B 则更新本地

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

Gossip 协议优点

  • 扩展性高,传播次数不会受集群成员增长而增长过快
    • 例如: 𝑙 𝑜 𝑔 4 ( 80 ) ≈ 3.16 𝑙𝑜𝑔_4 (80)≈3.16 log4(80)3.16 ,集群实际成员翻了一倍,但传播次数几乎不变
  • 容错性好,即使某些节点间发生了故障无法通信,也不会影响最终的一致性
    • 例如:A 与 B 之间发生故障无法通信,但只要 A 与其他能连通 B 的节点通信,那么信息就一定会散播到 B
  • Robust(鲁棒性),即皮实,集群中的节点是对等的,即便一些节点挂了,一些节点新添加进来,也不会影响其它节点的信息传播

以上是关于分布式共识算法——Gossip协议(图解)的主要内容,如果未能解决你的问题,请参考以下文章

分布式共识算法——Raft算法(图解)

分布式共识算法——Raft算法(图解)

分布式共识算法——Paxos算法(图解)

分布式共识算法——Paxos算法(图解)

Tendermint 共识分析

Tendermint 共识分析