序
本文主要研究一下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的消息传播,从而减少额外的单独信息传递开销
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。