“SWIM的有限传播账本给出直接反例:一条Confirm只附带两次,两包都丢失后,发送预算已经耗尽,另一表仍可Alive。显式完整状态修复才能补回该项;预算退场不能顺带删除保留的Confirm…”
形式陈述
一个成员表,记录的是本地观察
本页按Das等2002年SWIM原版的探测与怀疑规则给出有限教学状态机。它使用可出错的故障怀疑,各节点的表允许暂时不同。表中的“确认移除”是该协议的处理结果,不是其他节点已物理停机的证明。
先给固定且已经登记的进程实例身份集合。节点非Byzantine,发送者身份可信,消息允许丢失、乱序、重复;不模拟伪造、动态加入、旧实例重启或身份回收。节点只用本地单调时钟。分析轨迹里的统一时间由核验者排列,协议不读取别人的时钟或共享成员真值。
直接探测、间接探测与轮次身份
每个节点以协议期间T开始一轮,选一个尚未确认移除的其他成员。疑似成员仍可被选。基本版从候选中均匀随机选择,随后:
- 发送PING,带起点、严格增长轮号和目标组成的身份(origin,round,target)
- 直接等待d<T。若无匹配ACK,向至多k个不同helper发PING-REQ;helper再PING目标,收到目标ACK后转给origin
- 期间结束仍无匹配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人选一人。至少一人选中该停机目标的概率为
从第一份完全发生在停机之后的轮次开始,在轮间也独立的假设下,首次被选择的轮数为几何型,均值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)给洗牌轮询。本文固定身份集合、时间参数及同刻事件顺序,额外完整反熵为明示组合,不替原文有限传播添加无条件可靠性