​【SWIM】SWIM:可伸缩的成员协议​:谁是我的伙伴?

news/2024/5/21 15:43:24/文章来源:https://blog.csdn.net/weixin_42319496/article/details/127158740

目录

什么是SWIM

一、理解协议名称

二、SWIM协议的构成

失效检测

信息传播

三、SWIM协议优化

传染式信息传播

用于失效检测的怀疑机制

轮流选择探测目标

四、总结

五、Serf的改进

参考文献:


转自:https://www.cnblogs.com/bugcai/p/13523060.html

什么是SWIM

定义:

SWIM(Scalable Weakly-consistent Infection-style Process Group Membership Protocol, 可伸缩的弱一致性传染式进程组成员协议),就是其中一种成员协议。

用途:

分布式系统中,一组节点,他们需要互相协作、互相发送消息。而要做到这一点,首先需要解决一个问题:谁是我的伙伴?

这就是成员协议要做的。

SWIM帮助分布式系统中的节点维护一个active节点的列表,同时当有节点加入、离开或失效时通知节点。

一、理解协议名称

可伸缩的弱一致性传染式进程组成员协议(Scalable Weakly-consistent Infection-style Process Group Membership Protocol),让我们将如此之长的协议名分解开来,逐一剖析一下,就能理解名字如此长的原因。

可伸缩(Scalable):在 SWIM 之前,大部分的成员协议使用心跳机制,每个结点每隔一段时间向集群中的每一个其他结点发送心跳消息。如果结点 N1 一段时间没有收到来自结点 N2 的心跳,它就会断定这个结点失效了。对于一个小型集群而言,这样做没问题;但是,随着集群中结点数量的增加,需要发送的心跳消息呈平方增长。如果有10个结点,每秒发送100条心跳消息问题不大;但是,对于1,000个结点,那就变成了每秒1,000,00条消息。因此心跳方式伸缩性上有问题。

弱一致性(Weakly-consistent):这意味着在一个给定的时间点,不同的结点会有不同的“世界观”。当然,他们最终将收敛到相同状态,但我们不要期待强一致性。

传染式(Infection-style):这就是通常所说的 流言(gossip) 或 传染病(epidemic)协议。这意味着一个结点只与一部分结点分享某个信息,然后他们再与另外一部分结点分享,直到整个集群都收到那条信息,就像谣言传播的方式一样。

成员(Membership):作为成员协议,我们要回答的一个基本问题就是:”谁是我的伙伴?“

二、SWIM协议的构成

心跳机制使用心跳消息解决了两个不同的的问题:探测到失效结点(即不再发送心跳的结点),以及维持集群中活跃结点(也就是发送心跳的结点)的列表。 SWIM 采用一种新的方式将这两个问题分解到不同组件上,因此他有 失效检测 和 信息传播 两个模块。

失效检测

集群中每一个结点随机选择一个结点(比如说,N2),然后向它发送  ping 消息,期待收到回复 ack。 ping 仅仅是一个探测消息,通常情况下将会收到 ack 消息并确认 N2 为活跃的。

当没有收到回复时,并不是立即将其标记为“挂了”,而是 借助 其他结点来试图探测它。随机从成员列表中选择 k 个其他结点,向它们发送 ping-req(N2) 消息

通过这种方式可以防止误报,比如因为某种原因  N1 没有收到来自 N2 的响应(或许是因为两者之间出现了网络拥塞),但实际上 N2 仍活着而且可以被 N4 访问。

如果该结点不能被这 k 个结点的任何一个访问到,那就可以被标记为“挂了”。

信息传播

当侦测到一个结点已经“挂了”后,协议将这个信息广播给集群中所有其他结点,每一个结点将会把  N2 从本地的活跃结点列表中删除。结点自愿离开或加入集群的信息可以采用类似的方式广播。

三、SWIM协议优化

以上所说的协议内容相当简单,不过针对协议健壮性和效率,在原始的 SWIM 论文中也提出了一些优化建议:

  • 对于信息传播组件,使用传染式的方式传播信息,而不是广播的方式

  • 对于失效检测,采用怀疑机制以降低误报率

  • 循环式的选择探测目标,而不是随机选择结点

接下来,我们将对上述改进点逐一剖析,理解其背后的原因。

传染式信息传播

在使用这个多播方式传播信息时,我们需要注意(至少)两个问题:

  • IP multicast,在大部分环境下都是禁用的(例如,Amazon VPC 环境)这时,你就只能使用效率非常低下的点对点方式了。

  • 即使你能用 IP multicast,通常也是 UDP 方式的,众所周知这是一种“尽最大努力”协议,意味着可能出现丢包情况,这样一来要维护一个可靠的成员列表就变得困难了。

SWIM 论文中推荐了一个更优雅的方案,不用再考虑广播的思路了,而是借助我们在失效检测中使用的三个消息:  ping,ping-req 和  ack ,让它们捎带上我们需要传播的信息。没有添加任何新消息,只是复用已存在的消息,让这些消息也传输成员更新信息。

用于失效检测的怀疑机制

这个优化是,在断言结点已经“挂了”之前,仅仅是怀疑。目的是为了尽量减少误报,因为即便多花一些时间来侦测失效结点,也好过将一个正常结点错误的标记为“挂了”。不过,这是一种权衡,可能在特定场景下,这没有什么意义。

具体的工作方式是这样的:当结点 N1 不论是通过直接的 ping ,还是间接的 ping-req 都无法收到来自结点 N2 的 ack 消息时,不是立即将  N2 判定为“挂了”,而是怀疑 N2 “挂了”,并将这个怀疑传播出去。

嫌疑结点仍被当作非故障结点,像其他结点一样不断的收到  ping 消息。如果有结点能收到来自 N2 的 ack 消息,则会被再次标记为活跃结点,并将这个”喜讯“传播出去。N2 自身也会收到怀疑它”挂了“的消息,并向集群中其他结点宣告这个怀疑是错误的。

如果在预定义的超时后仍没有收到来自 N2 的任何消息,那么就可以断言这个结点”挂了“,并将这个”噩耗“传播出去。

轮流选择探测目标

在最初的协议定义中,是以随机的方式选择一个被探测的结点,即随机的向一个结点发送 ping 消息并期待收到 ack 。尽管可以保证,最终能够探测到某个结点失效,但运气不佳的话可能要花费比较长的时间。解决这个问题的办法是,维护一份待探测结点的列表,然后循环遍历(round-robin)这些结点,并且新加入集群的结点被随机的插入列表中。采用这种方式,我们的失效检测将会是“有时限的”(time-bounded),最差情况下选中失效结点所需的时间也是固定的,即 探测间隔 * 结点数

四、总结

  • SWIM 是一个成员协议,它帮助我们知道那些结点在集群中,帮助我们维护一个不断更新的健康结点列表。

  • 它将 成员问题 分成两个部分:失效检测 和 信息传播。

  • 失效检测 随机地向结点发送 ping 消息,并期待收到 ack 消息;如果没有收到 ack ,将向  k 个结点发送 ping-req 消息,借助他们来间接的进行探测。

  • 失效检测 的一个优化是,首先是标记结点“有嫌疑”,在超时后再标记为“挂了”。

  • 对于 信息传播 的优化是,让失效检测消息( ping、ping-req 和 ack)捎带上 成员变化 信息,而不是使用 IP广播 机制。

  • 对于失效检测时间的优化是,采用轮流(round-robin)选择结点的方式,而不是随机选择。

因此,SWIM 协议具备如下优势:

  • 可伸缩性:失效发现时间、误报率以及每个成员所需的消息收发负载与集群大小无关。成员状态变更信息的传播与集群大小呈对数关系(log n)

  • 健壮性:协议是完全区中心化的,对于结点故障或网络分区具有容错能力。

  • 易于部署和维护:新成员联络任何一个现有成员即可加入集群;而成员离开时,无需任何特别措施即可维持集群健康。

  • 实现的简单性:协议中只定义了为数不多的状态和消息类型。而且点对点的结构,无需进行初始配置或在成员变更时进行维护。

五、Serf的改进

  • (+)添加使用TCP进行探测的方式

使用UDP的同时,也尝试使用TCP方式,以解决由于网络配置原因导致UDP路由有错误的场景。

  • (+)定期的通过TCP与随机选择的另一个成员进行全状态同步

加速收敛,特别有助于快速地从网络分区中恢复。

  • (+)专门的gossip层

除了让探测消息捎带外,也定期发出自己的gossip消息。 这使得gossip率能够独立于失效检测率进行调整,有必要的话可以比后者更高,从而加快收敛速度。(如200毫秒一次 gossip ,1秒一次 失效检测)

  • (*) 在一段时间内保留失效节点的状态

关于失效节点的信息可以通过 全状态同步 传递,从而提高收敛速度。

从0.8版开始,引入Lifeguard技术,将SWIM变成一种自适应的协议。

  • (*)Local Health Aware Probe (LHA-Probe)

每个成员有一个“结点自我意识”计数器(Local Health Multiplier),计数器的值越大,探测间隔和超时就越大。快速的将非健康结点对集群的影响降到最低。

计数器增减规则:

    • 成功的探测(对于直接或间接探测,在超时时间内收到 ack 消息):-1

    • 失败的探测:+1

    • 反驳对于自身的怀疑: +1

    • 未收到 nack:+1  (注:收到 ping-req 的成员,在80%超时时间,发一个 nack 消息给间接探测发起者)

探测间隔和超时调整规则:

ProbeInterval = BaseProbeInterval * (LHM(S) + 1)

ProbeTimeout = BaseProbeTimeout * (LHM(S) + 1)

BaseProbeInterval 设为 1 秒

BaseProbeTimeout 设为 500 秒

S 默认为 8

  • (*)Local Health Aware Suspicion (LHA-Suspicion) 

也称 叠罗汉(Dogpile)。对于怀疑确认,用动态时间代替固定的失效确认时间,当其他成员也产生相同的怀疑时,则时间呈对数减少。结果是,一个成员真的失效时,可以更快地得到确认;而降级结点,也会因为收不到确认而保持更长的超时,被怀疑结点因而有更多时间处理来反驳。

  • (+)伙伴机制(Buddy System)

代替捎带方式,直接通知受怀疑结点,以便其能更快速的反驳怀疑。

参考文献:

  1. Gossip Protocol
  2. Making Gossip More Robust with Lifeguard

  3. SWIM: Scalable Weakly-consistent Infection-style Process Group Membership Protocol

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_584852.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Netty网络编程实战1,搭建第一个Netty服务器

目录一、Netty是什么二、Hello Netty1、主程序类MyNettyServerTest2、初始化器MyNettyServerInitializer3、自定义处理器MyNettyServerHandler三、代码实例1、maven中加入netty-all2、主程序类MyNettyServerTest3、初始化器MyNettyServerInitializer4、自定义处理器MyNettyServ…

有序与无序(Order and disorder)

文章目录1. 有序的表征1.1 晶格周期性和 X 射线结晶度(Lattice periodicity and X-ray crystallinity)1.2 长程有序(Long-range order)2. 淬火无序(Quenched disorder)3. 退火无序(Annealed dis…

【U3D小游戏】愤怒的小鸟一项目创建与设置

前言 自己做一下小时候玩的风靡一时的愤怒的小鸟这个游戏,相信有很多人都在某一段时间沉迷过这个游戏吧~~ 一、项目创建与设置 1. 素材下载 素材我放在了网盘里面 链接:https://pan.baidu.com/s/1TJqUUAsgkyIJ1eXCyTRJlQ?pwdh25m 提取码&#xff1a…

解决TOKEN已过期,TOKEN加密的js逆向模拟

逆向目的 ‘{“code”:10004,“count”:null,“data”:null,“message”:“TOKEN已过期”}’ 逆向过程 网址 https://jzsc.jst.zj.gov.cn/PublicWeb/index.html#/company 翻页网址 打断点 翻页 在该断点之前,token参数已经生成,因此在call stack里从…

UVM实战笔记(三)

第三章. UVM基础 3.1 uvm_component与uvm_object component和object是UVM中两大基本的概念。 uvm_object是UVM中最基本的类,几乎所有的类都继承自uvm_object,包括uvm_component。 uvm_component有大量特性是uvm_object所没有的,一是通过在…

算法 - 最大矩阵和

目录 题目描述 输入描述 输出描述 用例 题目分析 算法实现 题目描述 给定一个二维整数矩阵,要在这个矩阵中选出一个子矩阵,使得这个子矩阵内所有的数字和尽量大,我们把这个子矩阵称为和最大子矩阵,子矩阵的选取原则是原矩阵…

Skywalking Swck Agent注入实现分析

项目地址: GitHub - apache/skywalking-swck: Apache SkyWalking Cloud on Kubernetes 项目简介: A bridge project between Apache SkyWalking and Kubernetes. SWCK is a platform for the SkyWalking user that provisions, upgrades, maintains SkyWalking relevant comp…

SpringBoot项目的pom.xml文件中maven-project-info-reports-plugin报红解决办法

今天在创建SpringBoot项目时发现导包是没有任何问题的,但是pom文件中maven-project-info-reports-plugin一直有报红,如下图所示:在该pom文件中引入maven-project-info-reports-plugin依赖包即可解决以上问题。<dependency><groupId>org.apache.maven.plugins<…

用open3d GUI做三维用户界面开发

文章目录窗口控件布局事件尽管open3d是一个三维数据处理库&#xff0c;其主页介绍中提到的功能&#xff0c;也都类似三维数据结构、三维数据处理算法、平面对齐重构这种专业需求&#xff0c;但是尽管主页没提&#xff0c;open3d内部起始隐藏着一个非常强大的图形界面工具&#…

免杀方法(七)c#xor加载器

c#是很流行的编程语言&#xff0c;也可以用它来做一个加载器运行shellcode,生成出来的 文件特别的小&#xff0c;可以很好的投递传输。 项目地址https://github.com/antman1p/ShellCodeRunner 下载项目解压用vs2019打开sln项目文件 生成exe文件 打开cb选择raw生成二进制payload…

【Java面试】5年去某东面试竟这题翻车 请你说一下你对服务降级的理解?

“请你说一下你对服务降级的理解”&#xff01; 这是一个工作5年的同学去京东面试的时候遇到的问题。 如果屏幕前的你不知道怎么回答这个问题&#xff0c;可以认真看完这篇文章。 大家好&#xff0c;我是Mic&#xff0c;咕泡科技的联合创始人。 下面我们来分析一下这个问题的考…

Spring中让人眼前一亮的11个小技巧

前言 我们一说到spring&#xff0c;可能第一个想到的是 IOC&#xff08;控制反转&#xff09; 和 AOP&#xff08;面向切面编程&#xff09;。 没错&#xff0c;它们是spring的基石&#xff0c;得益于它们的优秀设计&#xff0c;使得spring能够从众多优秀框架中脱颖而出。 除…

图像处理之空间滤波

1 原理 1.1 空间滤波简介 滤波器即只让一部分频率的波形通过来达到波形过滤目的的器件。空间域指一张图像像素平面一定范围内的像素域&#xff0c;相对的是时间域&#xff0c;即多帧图像之间的关系&#xff0c;主要在处理视频帧时描述。在图像处理中&#xff0c;滤波分为两种&…

Springboot+MyBatisPlus+Mysql+vue实现支付宝支付

文章目录前言一、支付宝沙箱环境准备二、开发环境搭建1.数据库脚本执行。2 依赖添加3 配置支付宝支付相关参数4. 配置支付宝客户端类三、支付宝支付api接口1.下单接口支付时序图2 支付通知回调处理订单3.支付失败关闭订单4.订单退款5、查询订单6.对账四.前端1.下单页面2.订单列…

做网赚的人至少一半人都在抖音搞钱!

在网上所有的网赚群体&#xff0c;想要赚到钱&#xff0c;第一点就是找到人多的地方&#xff0c;我记得夏天我们附近那里有一个小广场&#xff0c;每天晚上人很多&#xff0c;一个大爷什么也不卖就卖矿泉水&#xff0c;一提矿泉水能赚5元&#xff0c;一晚上能卖1提&#xff01;…

datetime模块

datetime模块 基础 datetime模块定义了两个常量 &#xff1a; datetime模块定义了两个常量说明datetime.MINYEAR表示datetime所能表示的最 小年份 &#xff0c;MINYEAR 1datetime.MAXYEAR表示datetime所能表示的最最大年份 &#xff0c;MAXYEAR 9999 datetime模块定义了下…

[C++基础]-入门知识

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接收失败&#xff0c;但我不能接收放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 目录 一 认识C …

【已解决】docker:访问tomcat报错HTTP状态404-未找到

​ 通过ip加端口形式去访问tomcat页面会出现404情况&#xff0c;这是因为随着tomcat的版本更新以后&#xff0c;我们需要进入tomcat容器里面修改一下文件&#xff0c;把原本的webapps删除&#xff0c;再把webapps.dist重命名为webapps&#xff0c;这种情况就可以得到解决&#…

开关电源学习(一) MP2315S简介

文章目录前言一、电容的作用二、电感的作用三、二极管的作用四、电路的拓扑结构五、同步和异步的区别总结前言 MP2315S 是一款内置功率 MOSFET 的高效率同步整流降压开关变换器。它是 MP2315 的下一代产品。它提供了非常紧凑的解决方案&#xff0c;在宽输入范围内可实现 3A 连…

【数据结构初阶】第五话 —— 单向队列的基本操作

文章目录什么是队列队列的结构1. 初始化队列2. 队尾入队列3. 队头出队列4. 获取队列头部元素5. 获取队列队尾元素6. 获取队列中有效元素个数7. 检测队列是否为空8. 销毁队列9. 总结接口函数贴图什么是队列 要弄明⽩什么是队列&#xff0c;我们同样可以⽤⼀个⽣活中的例⼦来说明…