文档章节

聊聊SWIM Protocol

go4it
 go4it
发布于 05/02 23:56
字数 977
阅读 16
收藏 0

本文主要研究一下SWIM Protocol

SWIM Protocol

SWIM的全称是Scalable, Weakly-Consistent, Infection-Style, Processes Group Membership Protocol

heartbeats

传统的诸如heartbeats这种membership protocols,每个node周期性地向网络中的所有其他节点发送heartbeat来表示自己是alive的,如果peer超过指定interval没有收到node的heartbeart则该node被认定为dead。这种方式适用于小型网络,其发送的heartbeart数量为O(n^2),当网络中有成千上万的node时则会造成巨大的网络负担;SWIM采用Infection-Style dissemination来解决这个问题

tasks

与传统的heartbeats相比,SWIM将整个过程分为Failure Detection及Membership update Dissemination两个task

Completeness与Accuracy

对于failure detection来,有几个衡量标准:

  • Completeness

是否每个failed node最终都会被检测到

  • Speed of failure detection

一个node从failed到被检测到failed的平均耗时

  • Accuracy

false positive rate,即一个node被误判为failed的概率

  • Message Load

在检测中每个node的network load是多少,是否均匀分布

Unreliable Failure Detectors for Reliable Distributed Systems一文中指出对于异步的网络来说,100%的Completeness与Accuracy无法同时保证,因而SWIM权衡之下选择了Completeness,同时尽可能减少false positive rate以提升Accuracy

Failure Detection

SWIM的failure detection过程分为两个部分,一个是direct ping,一个是indirect ping

  • direct ping

local node从alive nodes中随机选择N个node来进行detect;如果direct ping中有的node没有在timeout时间内返回ack则会进行indirect ping

  • indirect ping

local node从alive nodes中随机选择K个node来对direct ping目标node进行indetect ping,这K个node会把结果forwards给这个local node,最后local node检查如果这个K个node没有一个返回ack,则将该目标node标记为failed,然后通过Membership update Dissemination将该node的FAILED信息传播到网络中的其他node

Membership update Dissemination

Membership update Dissemination可以将messages分为JOINED、FAILED两类:

  • JOINED

当一个node加入到该网络时,需要通知其他node更新local membership新增该node

  • FAILED

当一个node被检测为failed时,需要通知其他node更新local membership移除该node

这个过程可以使用multicast来实现

改进

  • Infection-Style Dissemination multicast实现的Dissemination是不可靠的而且低效的,一个更加robust版本的SWIM采用Infection-Style的方式进行dissemination,即利用Failure Detection的ping机制,将需要dissemination的消息piggyback在ping/ack上,来实现类似gossip的消息传播,从而减少额外的单独信息传递开销

  • Suspicion Mechanism 为了更好地减少false positive rate以提升Accuracy,可以引入Suspicion Mechanism,即当local node检测到该node failed时将其标记为suspected;被标记为suspected的node在最终被确认为failed之前被当做是alive;其他node如果检测到该node是alive则对该node取消suspected,恢复alive;如果在指定时间该node没有被恢复为alive则被标记为failed

  • Time bound failure detection 随机选择node进行ping可能会造成一定的延时,可以使用round robin的方式来取代随机选择,当所有node都选择过了之后再重新shuffle该node list

小结

  • SWIM的全称是Scalable, Weakly-Consistent, Infection-Style, Processes Group Membership Protocol;与传统的heartbeats相比,SWIM将整个过程分为Failure Detection及Membership update Dissemination两个task
  • SWIM的failure detection过程分为两个部分,一个是direct ping,一个是indirect ping
  • Infection-Style的方式进行dissemination,即利用Failure Detection的ping机制,将需要dissemination的消息piggyback在ping/ack上,来实现类似gossip的消息传播,从而减少额外的单独信息传递开销

doc

© 著作权归作者所有

go4it
粉丝 90
博文 1125
码字总数 1057020
作品 0
深圳
私信 提问
分布式系统中的 SWIM 成员协议

我们假设你要建立一个类似于Cassandra的分布式数据库。你所使用的存储系统将在许多商业服务器上存储和处理大量的数据。换句话来说,也就是你所使用的存储系统要管理好这些数据需要运行在100...

oschina
2015/02/16
2.5K
0
聊聊dubbo的DubboSwaggerService

序 本文主要研究一下dubbo的DubboSwaggerService DubboSwaggerService dubbo-2.7.2/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/integration/swagger/Dubbo......

go4it
07/06
52
0
hive python udf

udfdata.txt: aa pingpong,swim,running ps:explode和collect_set 中文或者str时报错:'ascii' codec can't encode characters in position 61-62 reload(sys) sys.setdefaultencoding('utf8......

datacube
2016/07/21
39
0
聊聊reactor-netty的AccessLog

序 本文主要研究一下reactor-netty的AccessLog 开启access log 对于使用tomcat的spring boot应用,可以server.tomcat.accesslog.enabled=true来开启 对于使用jetty的spring boot应用,可以s...

go4it
04/04
36
0
Redis-Cluster-Gossip协议

优点: 协议本身简单,组网规模几乎不受限制,通信性能好 缺点: 不能提供传统的数据一致性服务,在传输中占用较多的网络流量 社区版redis cluster是一个P2P无中心节点的集群架构, 依靠gos...

Java搬砖工程师
03/19
259
0

没有更多内容

加载失败,请刷新页面

加载更多

采坑指南——k8s域名解析coredns问题排查过程

正文 前几天,在ucloud上搭建的k8s集群(搭建教程后续会发出)。今天发现域名解析不了。 组件版本:k8s 1.15.0,coredns:1.3.1 过程是这样的: 首先用以下yaml文件创建了一个nginx服务 apiV...

码农实战
3分钟前
1
0
【2019年8月版本】OCP 071认证考试最新版本的考试原题-第6题

choose three Which three statements are true about indexes and their administration in an Orade database? A) An INVISIBLE index is not maintained when Data Manipulation Language......

oschina_5359
6分钟前
1
0
阿里巴巴开源 Dragonwell JDK 最新版本 8.1.1-GA 发布

导读:新版本主要有三大变化:同步了 OpenJDK 上游社区 jdk8u222-ga 的最新更新;带来了正式的 feature:G1ElasticHeap;发布了用户期待的 Windows 实验版本 Experimental Windows version。...

阿里巴巴云原生
11分钟前
1
0
教你玩转Linux—磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题,Linux磁盘管理常用三个命令为df、du和fdisk。 df df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少...

xiangyunyan
14分钟前
3
0
js 让textarea的高度自适应父元素的高度

textarea按照普通元素设置height是没有作用的,可以这么来设置, 下面给上一段项目代码 JS代码: $.fn.extend({ txtaAutoHeight: function () { return this.each(function () {...

文文1
14分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部