故障假设与故障检测器 Election algorithm
要点
- 熟悉故障检测器有助于了解分布式系统中故障的本质
- 如何判断进程何时已经崩溃
首先,为了便于理解及阐述,做如下假设:
- 每对进程都通过可靠的通讯连接(尽管底层网络组件可能出现故障,但进程使用能屏蔽故障的可靠通讯协议)。
- 进程故障不隐含对其他进程的通信能力的威胁(没有进程依赖于其他进程来转发消息)。
- 进程只在崩溃时出的故障(这个假定对与很多系统来说足够来)
WARNING: 一个可靠的通讯连接最终将消息传递到接收者的输入缓存区。在同步系统中,假设在必要的地方有硬件冗余,一遍底层出故障的时候,可靠通道不仅最终传递每个消息,而且是在指定时间内完成传递工作。
.名词诠释 [width=”100%”,options=”header,footer”] |==================== |中文|英文|定义 |网络分区|network partition|每个网络内的进程可以通信,但两对进程在路由故障的时候不可能通讯 |非对称的|asymmetric|从进程P到进程Q可以通讯,但反之则不行 |非传递的|-|从进程P可以到进程Q,进程Q可以到R,但从P到R则不行 |故障检测器|failure detector|是一个服务,用于处理有关某个进程是否已经出现故障的查询。通常由每个进程中的一个对象实现,此对象与其他进程的对应部分一起执行一个故障检测算法。 |不可靠故障检测器|unreliable failure detector|可能精确的反应进程是否出故障 |可靠故障检测器|reliable failure detector|精确的反应进程是否出故障 |====================
== 不可靠故障检测器
.产出结果 [width=”100%”,options=”header,footer”] |==================== |Unsuspected|表示检测器近期已经收到表明进程没有故障的证据 |Suspected|表示故障检测器有迹象表明进程可能已经出故障了 |==================== 上面这两种结果可能精确。例如:进程运行比预期的要慢
- 可能怀疑一个没有故障的进程。
- 检测器没有必要精确,大多属于不可靠故障检测器。
- 实现
- 每个进程P向其他所有进程发送消息”P is here”,每隔T秒发送一次,检测器用最大消息传输时间D秒作为评估值。
- 如果进程Q的本地故障检测器在最后一次T+D时间内没有收到”P is here”的消息,则向Q报告P是Suspected。
- 如果后来收到”P is here” 消息,则向Q报告P是OK。
如果为T和D选择了很小的值(1ms),故障检测器会多次怀疑非崩溃的进程,并且大部带宽都会被”P is here”消息占据。 如果为T和D选择很大的值(1d),那么会检测的进程会经常被报告为Unsuspected。
-
优化方案:动态设置网络延迟条件下的超时值(T+D),但检测器仍然是不可靠的,但检测精确的概率增加了
-
在同步系统中,可以使检测器变得更可靠,将D不再作为评估值,而是作为消息传输时间的界限。如果T+D内没有收到消息,则可以得出进程已经崩溃。
== 可靠故障检测器
- 要求是系统同步的,实际中的系统很少是同步的
.产出结果 [width=”100%”,options=”header,footer”] |==================== |Unsuspected|表示检测器近期已经收到表明进程没有故障的证据 |Failed|表示检测器确定程序已经崩溃 |====================
任何用于应对故障的实际系统都必须检测故障——不管多么不完美。但即使是不可靠,只要它具有良性结构,也能为发生故障时进程协调问题提供解决方案。 ———-