gossip 协议以及SWIM

gossip 协议

解决消息在分布式集群中的传递,保证数据在各个节点的一致性。这种场景的一个最大特点就是组成的网络的节点都是对等节点,是非结构化网络,或者说是去中心化的,期想法也就是来源于传染病的流行。所以也被称为流行病协议(Epidemic Protocol)。

问题描述

一个简化的模型(用户展示算法)

一个集群(P)由 N 个节点狗狗成,节点之间能够互相传递消息,消息可能传递失败或者丢失。
假设每一个节点存存在一个值value,当这个值发生变化的时候(产生一个Update),通过交换消息这个值是复制给所有的节点的。可能value会存在多个更新操作,所以每个更新(Update)会对应一个时间戳(可能是一个逻辑时间戳)。

算法的目标是通过传播更新操作,最终保证所有的节点会拥有一致的结果(相同的value值)。
一个节点可以处于以下三个状态

• Susceptible (S 未感染的): 节点不知道有跟新存在;
• Infected (I 感染的): 节点知晓更新,并且会传播这个更新;
• Removed (R 免疫的/移除的): 节点知晓这次跟新, 不过不会参与传播这个更新

分类算法

逆熵算法 (SI模型) (当集群中存在不一致的情况,努力改变这种不一致)
anti-entrpy
  • 当前节点用节点p表示*
  • 推模型
    以间隔时间执行, 随机选取节点 q,发送 push 消息,推送当前的 value 给节点q。节点q 收到消息之后比较时间搓,并更新当前的数据值value。

  • 拉模型
    以间隔时间执行, 随机选取节点 q,发送 pull 消息(带上时间戳)给节点q。节点q 收到消息之后比较时间搓,如果自身的时间戳更大,则发送reply 消息返回节点自身的value 值。当p节点收到当前的value 值的时候则可以更新自己的value 值(需要比较时间戳)。

  • 推拉模型
    结合推模型和拉模型,定时发送消息传递自身的value值给随机选取的节点q,如果q 节点value值的时间戳更大, 则返回reply 消息(类似拉模型),否则更新自己的value值。

推拉模型有最快的传播覆盖率,但是会付出更多的通讯成本。

  • 广播消息 (SIR模型)

SI 模型中,消息轮询会永远运行,永远在保持集群中的节点一致。但是多数场景下更新是少量的,无限制的消息扩散大大提高了通讯的成本。以此为由SIR 模型被引入了,对比SI算法,节点多了一个 removed 状态。

SIR模型是基于推模型的(pull 模型也是可以的),当一个节点有更新发生时(第一个感染发生),其随机选取节点进行消息推送;未感染的节点收到消息之后变成了感染的节点,并且也开始传播(推送消息),最终在一个合适的时候所有的节点变成removed 状态。表示消息广播的过程的结束。和SI模型相比,SIR模型消息的传播是最终终止的。

其对应算法的关键点在于如何判断消息传播停止

主要的思路通过两个方面的因子确定停止传播的算法

  • When
    • 每次消息推送之后(push 之后)即判断消息是否可以停止传递。
    • 每次消息传递之后通过对应节点的反馈消息确定是否需要停止传递。
  • How
    • 通过消息传递的累计次数确定当前节点是否变为removed(免疫的)状态
    • 通过概率决定节点是否 (1/k)

两两组合可以实现免疫状态转换的算法。

SIR.jpg

现实中gossip 使用的情况

  • SIR / SR 模型的结合,SIR 在一些极限的情况下会有消息无法覆盖的情况(消息发送失败,消息丢失)所以往往采用SIR 和 SR 模型结合的方法,即使消息传递的失败,SR 模型依然能保证集群状态的一致性,同时SR的触发频率可以大大降低,避免多国的SR模型的过多的通讯开销。

  • 多值更新:每次push 所有的数据不可行,节点可以维护一个最近更新的update list,每次更新只传递最近更新的记录。(这个可以再了解一下)

  • 容错
    小范围的节点故障依然能够保障集群的可用性。

gossip 协议的优势

  • 可扩展性(Scalable)

gossip 协议是可扩展的,一般需要 O(logN) 轮就可以将信息传播到所有的节点,其中 N 代表节点的个数。每个节点仅发送固定数量的消息,并且与网络中节点数目无法。在数据传送的时候,节点并不会等待消息的 ack,所以消息传送失败也没有关系,因为可以通过其他节点将消息传递给之前传送失败的节点。系统可以轻松扩展到数百万个进程。

  • 容错(Fault-tolerance)

网络中任何节点的重启或者宕机都不会影响 gossip 协议的运行。

  • 健壮性(Robust)

gossip 协议是去中心化的协议,所以集群中的所有节点都是对等的,没有特殊的节点,所以任何节点出现问题都不会阻止其他节点继续发送消息。任何节点都可以随时加入或离开,而不会影响系统的整体服务质量(QOS)

gossip 协议与集群感知

SWIM: 可扩展成员协议(Scalable Weakly-consistent Infection-style Process Group Membership Protocol)

主要目的是解决维护一个集群列表

  • 在新的节点加入和离开的时候通知各个集群节点
  • 在集群中特定结点故障的时候感知并通知集群
  • 去中心化,支持水平扩展

实现方式 -- 心跳(heartbeat)

  • 判断特定的节点的存在状态
  • 维护集群成员列表
image

每一个集群中的节点会随机的选取某一个节点N2,发送一个ping message,期望能够收到一个ack的返回消息。如果在一定的时候内没有收到ack消息,则会向另一个节点N3发送 一个 ping-req 消息,当第三个节点收到这个消息的时候会尝试ping N2 如果收到ack 也会给 N1 ack 消息。

如果ping-req 依然没有收到ack 消息,则可以将某个节点标示为 suspect (怀疑状态),并使用gossip 协议广播这个(N2 is suspected)消息,如果N2依然存活,则在节点中广播(走gossip 协议)自己状态是依然存活。否则一定时间之后,N2被N1 标记为死亡状态,并转广播这个消息(走gossip 协议)

gossip 消息的传递可以通过 ping 消息传递,可以节省通讯开销。但是由于ping消息发送的间隔无法过低,可能会有消息延时的情况。

consul 中的集群感知

完成集群感知的包是 serf

使用TCP 连接,定期全量地更新状态。gossip 协议只是用来传播变化的消息,这两者都是最终一致的。

serf 分离了gossip 层和,错误检测。这样的目的是gossip 的触发周期可以更频繁,而健康检测的频率会更低,(主要是因为通讯成本的问题)。

流程是这样的:

  • 节点发送ping 消息,如果没有回应依照swim 算法会发送indirect ping ,请求另一个兄弟节点尝试再次ping消息,兄弟节点如果ping 失败之后会返回 nack 消息,这个消息会影响探测发起节点的awareness,这个逻辑是如果说自己ping另一个节点失败可能是自己的网络或者CPU负载较高,那这个时候就通过indirect ping去查询,如果没有收到nack 代表自己可能也会出问题了,这个时候就会提高下次的健康检查的超时时间(同时也降低自己健康检查的频率)

  • 动态的suspect 状态时常,动态的检测时常实现的逻辑是,当第一次发现suspect (可能是自己发现,也可能是别人发现)状态的时候,会使用一个较大的超时时间,下次每收到一个节点的suspect 广播就把suspect 的超时时间值调低。防止第一次自己误判断。

防止对于节点的误检测(Lifeguard):

  • 只是过高的CPU和 网络负载可能导致节点的假死,当一个探测的节点一致没有接收到 nack 消息,它会放慢自己错误探测的频率,直到下一个nack消息到来。

  • 怀疑状态的超时时间的动态调整,开始会有一个很长的怀疑状态超时时间,当别的节点同时广播同一节点的怀疑消息的时候,这个怀疑状态超时时间就会缩短,防止仅仅因为网络隔离造成的节点死亡误判。

redis 中的集群感知

redis 中使用 gossip协议来感知集群成员,以及做健康检测。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,813评论 0 5
  • Redis Cluster Redis Cluster是Redis官方在Redis 3.0版本正式推出的高可用以及...
    Springlin阅读 3,767评论 1 5
  • Gossip是什么 gossip 协议利用一种随机的方式将信息传播到整个网络中,并在一定时间内使得系统内的所有节点...
    一蓬蒿人阅读 542评论 0 0
  • 节点通信 通信流程在分布式存储中需要提供维护节点元数据信息的机制,所谓元数据是指:节点负责那些数据,是否出现故障等...
    linuxzw阅读 553评论 0 3
  • 安化广森林,峰重柘水深。 与君相别意,独奏伯牙琴。 同志当兄弟,天涯是近任。 为官多报国,再见醉言箴。
    飞哥判案阅读 386评论 0 3