Skip to content

算法Algorithm

SWIM探测与成员怀疑

SWIM membership protocol · SWIM failure detection

用轮次身份执行直接与间接探测,按原版SWIM的incarnation和Confirm优先级合并成员观察,并复算反驳丢失与有限传播边界。

形式陈述 ​

一个成员表,记录的是本地观察 ​

本页按Das等2002年SWIM原版的探测与怀疑规则给出有限教学状态机。它使用可出错的故障怀疑,各节点的表允许暂时不同。表中的“确认移除”是该协议的处理结果,不是其他节点已物理停机的证明。

先给固定且已经登记的进程实例身份集合。节点非Byzantine,发送者身份可信,消息允许丢失、乱序、重复;不模拟伪造、动态加入、旧实例重启或身份回收。节点只用本地单调时钟。分析轨迹里的统一时间由核验者排列,协议不读取别人的时钟或共享成员真值。

直接探测、间接探测与轮次身份 ​

每个节点以协议期间T开始一轮,选一个尚未确认移除的其他成员。疑似成员仍可被选。基本版从候选中均匀随机选择,随后:

  1. 发送PING,带起点、严格增长轮号和目标组成的身份(origin,round,target)
  2. 直接等待d<T。若无匹配ACK,向至多k个不同helper发PING-REQ;helper再PING目标,收到目标ACK后转给origin
  3. 期间结束仍无匹配ACK,生成目标当前incarnation的Suspect;收到旧轮ACK不能关闭当前轮

消息身份需贯穿转发。ACK既可以由目标直接送达,也可以由本轮选中的helper转交;转发只改变通信路径,不能另造一个新探测目标。在没有网络复制、每份请求只处理一次的这张消息图中,直接往返有两条消息;若进入间接阶段,每个helper至多产生请求、探测、目标回复和转发四条,因此最多2+4k条探测消息。丢失可能减少实际发送/交付数;重复投递及重新应答的开销另外计入,不能从同一轮号推出网络只产生这些包。[1,§3.1]

Alive、Suspect与原版Confirm ​

每个身份的记录有三种形态:Alive(i)、Suspect(i,deadline)、Confirm。i是非负incarnation,只有该身份本人能增加它。对尚未Confirm的记录,合并规则为:

  • 较大incarnation覆盖较小incarnation
  • 相同incarnation下,Suspect覆盖Alive;重复同一Suspect不重置期限
  • 本人收到针对自己当前incarnation的Suspect时,把i加1并发布Alive(i+1),从而反驳旧怀疑

接受一份新的Suspect时,本观察者设置自己的deadline=now+Δ。新Alive覆盖它便撤销怀疑;已排入执行队列的旧定时事件还要检查身份、incarnation及当前状态,不能只凭“时间到了”继续确认。

原版Confirm覆盖任意incarnation的Alive与Suspect。 本页将其表示为该进程实例的吸收终态,保留墓碑以拒绝后来的旧信息。即使Confirm(0)迟于Alive(1)到达,它仍会移除本次身份。重新加入需要另一次登记和新实例身份,本文不实现该流程。不能把这条2002年规则替换成某个现代实现的“先比较incarnation,再比较状态”,还声称两者相同。[1,§4.2,PDF7]

附带传播的预算 ​

最新观察可以放进PING、PING-REQ和ACK的附带区,每包最多b条,每条在本节点最多发送R次。附件按已发送次数少者优先,平局按本地插入序;新记录覆盖旧记录时,用新内容重新建立预算。一次发送即消耗预算,不能因为对方没有确认就假称这次未发生。

R有限意味着这些信息可能漏传。本文另外提供显式的完整状态反熵修复调用,把一份成员表按同一规则合并给另一节点;它是复用的修复工具,既要传真实状态,也要付大小成本,不是有限piggyback自动产生的可靠交付。

直觉

直路不通,先请第三人问一次 ​

A收不到B的回复,可能是B停了,也可能只是A与B之间的路径有问题。请C转问并把回复带回来,可以绕过部分路径故障。若C与A共享同一坏链路,这个帮助也可能失效;多一条路径降低某些误判,却不会消除沉默的歧义。

Suspect给仍能运行的B一个解释机会。incarnation让“我现在还在”带上高于旧怀疑的身份,避免迟到的旧包再次把新状态涂回去。Confirm则结束这次机会:一旦某处期限先到,原版规则宁可要求重新入组,也不任由旧实例反复复活。

探测轮次、反驳与确认终态
例子与边界

一份转发成功,一份旧ACK无效 ​

取T=8、d=2、k=1、Δ=12。A在时刻0开始轮1探B,直接PING丢失。2时A请C代问,3时C向B探测,4时B回复C,5时C把同一轮ACK转给A。A到8时结束轮1,不生成怀疑。

10时轮2再次探B,所有本轮直接/间接尝试均未得到回复。12时旧轮1的ACK重到,它携带(A,1,B),与当前(A,2,B)不同,必须忽略。若只检查“来自B”,这份旧证据会让一个新的失败轮次被错误关闭。

18时A将B0记成Suspect,截止30;19时C收到该怀疑,其截止31。两节点的本地期限不同是正常现象,传播不要求它们共享时钟或在同一时刻改变表。

及时反驳必须压住旧定时器 ​

20时B得知自己inc0被怀疑,增加为1并发布Alive1。A在22、C在24分别收到它,两边都恢复Alive1。27时重到Suspect0,因版本较小忽略。30/31时旧定时事件即使仍在调度队列里,也因记录已不是Suspect0而无效。

若收到相同Suspect0便不断把期限改成now+Δ,一条重复消息流可以把确认永远推迟。若不检查旧timer的版本,新Alive又可能在刚刚恢复后被陈旧回调删除。这两种错误一个破坏进展,一个破坏消息优先级。

反驳丢失后,活节点也可能被移除 ​

从18/19状态分出另一条执行:A在22得到Alive1,C始终未得到。C到31生成Confirm0,32时才收到Alive1。按照本页原版规则,C仍保留Confirm;它把Confirm0传给A以后,A也从Alive1转成Confirm。

B在整个过程中可以一直运行。确认传播使观察表趋同,却没有把B变成物理崩溃;更不允许应用因此绕过租约、投票配置或外部写入校验。

若Alive1和疑似期限都安排在31,先处理Alive可撤销Suspect0;先处理期限则进入吸收终态,之后Alive无效。终点要求交出两个次序的轨迹,不能把“时间戳相同”当作协议拥有的同步原子步骤。

消耗两次预算仍可能没有任何接收者 ​

令R=2、b=1,A的一条Confirm更新两次被附在出站包上,两包都丢失。A的发送预算已用尽,另一副本仍可能保存Alive;即使后来所有普通PING都成功,这条已退场更新也不一定再传播。

一次显式完整状态修复能把这份Confirm补给对方。将发送预算耗尽与墓碑删除混为一谈则很危险:仍在其他节点或在途消息中的旧Alive会再次被接纳。墓碑何时可回收属于已有成员/稳定性合同,本页不靠TTL自行丢掉。

推论与应用

随机探测的期望,需要一个固定概率模型 ​

另设共同目标集有n=5个身份,一个已经停止,其余m=4个正确节点每轮独立均匀从其他4人选一人。至少一人选中该停机目标的概率为

p=1−(1−1/(n−1))m=1−(3/4)4=175/256.

从第一份完全发生在停机之后的轮次开始,在轮间也独立的假设下,首次被选择的轮数为几何型,均值1/p=256/175。匹配轮次的回复不可能由已停目标新生成;怀疑等待与信息传播还要另外收费。这里没有把一个途中崩溃的半轮、过时成员表或暂停观察者混进同一随机试验。

单个观察者有放回选择可能任意久都不选某目标,所以期望有限不等于确定最坏界。原文§4.3改为遍历随机排列,到一轮遍历结束再洗牌;在冻结的q个候选中,同一目标两次出现的轮号差最多2q−1。q=4时上界7,可由“前一轮排第一、后一轮排最后”达到。

这只是再次发起探测的选择界。疑似等待、定时执行速度和全组传播并不因此自动得到相同上界;不能把7轮改写为“七轮后所有人都已知道真实成员”。

合并收敛与观察正确性分别核算 ​

忽略本地deadline数值,把非终态按(incarnation,Alive/Suspect)排序,再放一个最高Confirm;接收合并取更高记录。这一信息合并具有交换、结合、幂等性。deadline是第一次接受相应怀疑时的本地附属状态,重复消息不能重置它。

本人收到新怀疑后的incarnation增加是生成新信息,不是仅仅合并。假设这类新更新最终停止、Confirm墓碑保留,且反熵不断给所有持续成员提供时间上可达的成功传播路径,所有表才能最终吸收同一最高记录。单纯证明取最大值的代数性质,不会替消息提供这条传播路径。

即使最终全部吸收Confirm,这也只是对同一观察记录的收敛。虚假怀疑、最终准确性、共识的成员授权是另有条件的目标。

报文界不是完整实现的常数成本 ​

固定k和b时,在上述无复制的请求图模型中,每个发起轮的探测消息数及每包附带项数有常数上界。一个节点也可能同时被许多别人选为helper,故其一轮总处理量没有无条件的常数最坏界。

附件为清晰起见,用字典保存成员、数组生成当前候选,筛选需O(n);对U条待传播更新排序后选b条需O(1+U log(U+1)),还要计输出复制。疑似期限检查若扫描全部成员,单次推进为O(1+n);普通接收的单项比较才是期望常数字典工作。参考器在helper元组中核ACK来源还需O(1+k)时间。完整状态修复须访问发送端所有n条记录,不能隐藏在常数大小PING预算里。

活动探测保存至多k个helper,成员与待传播状态占O(n+U+k+1)个记录;可见日志另随消息/事件数增长。MemberView.timers为重放陈旧回调保留每次新Suspect的三元组,累计S条另占O(S)审计空间;实际expire扫描当前table,不消费这份历史表。本文没有真实socket、动态注册、认证实现或生产性能认证。完整事件、两种同刻次序与预算反例见沉默证据终点。

参考资料
  • [1] Abhinandan Das、Indranil Gupta、Ashish Motivala,SWIM: Scalable Weakly-consistent Infection-style Process Group Membership Protocol,DSN2002,pp.303–312。§3.1(PDF4–5)给探测、间接回复及轮次编号;§4.1(PDF6)给有限附带传播;§4.2(PDF6–7)给怀疑/本人incarnation与Confirm最高优先级;§4.3(PDF7–8)给洗牌轮询。本文固定身份集合、时间参数及同刻事件顺序,额外完整反熵为明示组合,不替原文有限传播添加无条件可靠性
关系图谱7 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系