`

SWIM:可伸缩的成员协议

 
阅读更多

 

在一个分布式系统中,我们通常会有一组结点,他们需要互相协作、互相发送消息。而要做到这一点,他们首先需要回答一个简单的问题:谁是我的伙伴?
这就是成员协议要做的。它帮助这个系统中的每一个结点维护一个活跃结点的列表,同时当有结点加入、有意离开或失效时通知他们。SWIM(Scalable Weakly-consistent Infection-style Process Group Membership Protocol, 可伸缩的弱一致性传染式进程组成员协议),就是其中一种成员协议。

 

一、理解协议名称

成员协议看上去似乎很简单,可伸缩的弱一致性传染式进程组成员协议(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 。尽管可以保证,最终能够探测到某个结点失效,但如果运气不佳的话可能要花费比较长的时间。解决这个问题的办法是,维护一份待探测结点的列表,然后遍历这些结点,并且新加入集群的结点被随机的插入列表中。采用这种方式,我们的失效检测将会是“有时限的”(time-bounded),最差情况下选中失效结点所需的时间也是固定的,即 探测间隔 * 结点数。

 

四、总结

  • SWIM 是一个成员协议,它帮助我们知道那些结点在集群中,帮助我们维护一个不断更新的健康结点列表。
  • 它将 成员问题 分成两个部分:失效检测 和 信息传播。
  • 失效检测 随机地向结点发送 ping 消息,并期待收到 ack 消息;如果没有收到 ack ,将向  k 个结点发送 ping-req 消息,借助他们来间接的进行探测。
  • 失效检测 的一个优化是,首先是标记结点“有嫌疑”,在超时后再标记为“挂了”。
  • 对于 信息传播 的优化是,让失效检测消息( ping,ping-req 和 ack)捎带上 成员变化 信息,而不是使用 IP广播 机制。
  • 对于失效检测时间的优化是,采用轮流(round-robin)选择结点的方式,而不是随机选择。
 因此,SWIM 协议具备如下优势:
  • 可伸缩性:失效发现时间、误报率以及每个成员所需的消息收发负载与集群大小无关。成员状态变更信息的传播与集群大小呈对数关系(log n)
  • 健壮性:协议是完全区中心化的,对于结点故障或网络分区具有容错能力。
  • 易于部署和维护:新成员联络任何一个现有成员即可加入集群;而成员离开时,无需任何特别措施即可维持集群健康。
  • 实现的简单性:协议中只定义了为数不多的状态和消息类型。而且点对点的结构,无需进行初始配置或在成员变更时进行维护。

 

  • 大小: 7.8 KB
  • 大小: 9.2 KB
  • 大小: 10.8 KB
0
0
分享到:
评论

相关推荐

    SWIM:对等系统通信协议。 SWIM(可伸缩的弱一致性感染样式过程组成员身份协议)

    可扩展的弱一致性感染样式过程组成员身份协议 会员发现: 新对等方随机选择另一个对等方,并向其发送PING事件。 接收到ping事件后,接收对等方应以PONG消息作为响应,该PONG消息由发送对等方的本地视图组成,然后...

    SWIM-initial-draft:使用 Kompics 的可扩展弱一致性感染式组成员协议,可扩展到至少数百个对等点并通过 NAT 工作

    SWIM 是一种用于分布式系统中的组成员协议,它使用弱一致性模型,并且具有高度的可扩展性,能够处理数百个对等点。"Kompics" 是一个组件化并发系统编程框架,用 Java 语言编写,用于构建分布式系统。"通过 NAT 工作...

    stm8 swim协议解析

    根据文档UM0470《STM8 SWIM通信协议及调试模块用户手册》,SWIM协议的工作方式涉及到了几个关键的概念,包括调试系统概述、通信层、单线接口模块(SWIM)、操作模式、进入序列、位格式、高速和低速位格式、SWIM通信...

    swim 标准协议文件

    对于那些需要对STM8微控制器进行深入开发的专业人士来说,这份文档是不可或缺的参考资料,它不仅包含了必要的通信协议信息,还提供了丰富的技术细节和操作指导。通过这份文档,开发人员能够掌握如何高效地利用SWIM...

    STM8_SWIM:STM8的SWIM下载程序

    SM8_SWIM STM8的SWIM使用S3C6410下载程序驱动程序ko:stm8_swim.c stm8_swim.h main.c Make them to product swim.ko, and insmod swim.ko in mini6410 board.用户cli测试:swim_cli.c Using arm-linux-gcc -o swim_...

    distributed-group-membership-protocol:SWIM组成员身份协议(https的实现

    该项目实现了基于SWIM的故障检测器,该故障检测器以可伸缩的方式提供了完整且弱一致性的成员列表保证。 设计 在此MP中,我们将故障检测器模块实现为一组守护程序线程以及主应用程序线程。 除了主应用程序外,我们...

    membership:SWIM协议的Rust实现

    "可扩展弱一致性感染式过程组成员身份协议(SWIM)"是一种用于维护分布式系统中进程组成员关系的协议,它通过弱一致性和 gossip 协议来传播和确认状态信息。"这是一个学习Rust的宠物项目"表明这个实现主要是为了学习...

    m.swim:GRASS 7 SWIM预处理器

    GRASS7土壤和水综合模型(SWIM)预处理器 版本v1.5 文献资料 该文档位于此处: : 版本历史 即将发布 添加了m.swim.glaciers模块来创建SWIM-G输入文件 m.swim.hydrotopes countoursrast现在仅是输出文件,自定义...

    STM8 SWIM通信协议和调试模块用户手册

    - **SWIM:** 单线接口模块 #### 相关文档 - **STM8S Flash编程参考手册 (PM0051)** - **STM8L Flash编程手册 (PM0054)** --- ### 第一部分:调试系统概述 调试系统是STM8微控制器的重要组成部分,它支持多种...

    一个轻量级的库,使用SWIM流行病协议提供组成员发现,状态分发和故障检测。-Golang开发

    Smudge简介Smudge是SWIM(可伸缩的弱一致性感染样式成员资格)协议的Go的最低实现,用于群集节点成员身份,状态分发和故障检测。d Smudge简介Smudge是SWIM(可伸缩的Weakly-consistent)的极简Go实现。由Motivala等...

    Flippers:Java的SWIM协议实现

    在SWIM协议上的实现 白皮书可以在找到 笔记 要在本地测试UDP数据包的发送,请使用netcat实用程序。 通过nc -c localhost 8343连接到服务器,可以发送带有数据的UDP数据包。 在修改消息模板后重新生成protobuf消息...

    STM8_SWIM通信协议和调试模块.pdf

    SWIM是基于异步通信、高灌电流(最高可达8mA)、开漏、双向通信的单总线接口。当CPU正在运行时,SWIM支持非侵入式的读写访问,以实时访问RAM和外设寄存器。而在CPU停止时,SWIM还允许访问MCU的其他存储区域。 #### ...

    c02_swim:鱼

    标题 "c02_swim:鱼" 暗示我们关注的是一个名为 "c02_swim" 的项目,可能与编程或软件开发有关,而 "鱼" 可能是项目的一个代号或者主题元素。标签 "C" 表明这个项目主要使用 C 语言进行开发。然而,没有具体的描述,...

    swim:一个简单、简洁的网络爬虫

    swim是简约的设计。 那里有很多强大的爬虫; 这个的目标是提供一个简单、简洁的基础,很容易适应您的需求。 这是一个说明 API 的小片段。 import re import swim def process(body): for match in re.finditer(r...

    游泳:Scalabe弱一致性感染式过程组成员身份协议

    SWIM:Scalabe弱一致性感染式过程组成员身份协议 2 P2P(点对点)어플过程참여하는弱一致性한过程한정정가필요하다。 SWIM프세로세스구성원정보서비스를제공하는모듈이다。 SWIM令人心跳加速的不可扩展性。 전통적인...

    SWIM:重要性度量的场景权重(SWIM)-用于敏感性分析的R包

    SWIM-灵敏度分析软件包 SWIM软件包为来自随机模型的模拟场景提供权重,以使压力模型组件(随机变量)在新的场景权重下满足给定的概率约束(例如,风险度量的指定值)。 通过将相对熵相对于基线模型的约束最小化来...

    Swim:用于在Swift中编写HTML的DSL

    import Swim import HTML let myDocument = html ( lang : " en-US " ) { head { meta ( charset : " utf-8 " , content : " text/html " , httpEquiv : " Content-Type " ) } body ( customAttributes : [ " ...

    scalecube-cluster:ScaleCube Cluster是SWIM的轻量级Java VM实现

    它是一种高效且可伸缩的弱一致性分布式组成员身份协议,它基于集群中节点之间的八卦风格通信。 有关详细信息,请阅读SWIM文章上带有提炼笔记的。 它使用了,该在所有成员上提供了统一的预期网络负载。 对于在所有...

    swim:通过间隙填充估算和Landsat影像的随机森林分类器的月度地表水分类框架

    SWIM(地表水污染)分类框架该存储库包含代码,示例和验证数据,以重现Labuzzetta等人的论文发现。 (2021年)“通过Landsat影像的间隙填充估算和随机森林分类器进行的次月一次地表水分类框架。” 最重要的是, ...

    SWIM协议的GPIO模拟.pdf-综合文档

    SWIM协议是STMicroelectronics公司为其微控制器系列(特别是STM8微控制器)开发的一种串行接口协议,主要用于程序下载和调试。SWIM全称是Single Wire Interface Module,即单线接口模块,因其接口简化为单线而得名,...

Global site tag (gtag.js) - Google Analytics