移动网络中稳定一致共识的紧界分析
在分布式系统中,稳定一致共识是一个关键问题,尤其是在存在各种故障的情况下。本文将深入探讨在崩溃故障、发送遗漏故障和一般遗漏故障下,稳定一致共识的可解性,并介绍一种解决崩溃和发送遗漏故障的算法。
崩溃故障下的稳定一致共识
在输入不固定且节点数量 $n$ 小于等于 $2t$($t$ 为可能出现故障的节点数量)的情况下,不存在解决稳定一致共识的协议。下面通过定理 1 来证明这一点。
定理 1
:若输入不固定且 $n \leq 2t$,则不存在解决崩溃故障下稳定一致共识的协议。
-
证明思路
:只需证明当 $n = 2t$ 时不存在这样的协议。假设存在协议 $P$,考虑系统 $G = G_0 \cup G_1$,且 $|G_0| = |G_1| = t > 0$。根据引理 4,存在可达配置 $C$,使得 $G_1$ 的配置 $C_1$ 是 0 - 价的。从 $C$ 开始执行协议 $P$,让 $G_0$ 中的所有节点将输入改为 1 后崩溃。此时所有节点的输入稳定为 1,根据共识的有效性,正确节点的输出最终应稳定为 1。但 $G_1$ 中的节点无法区分此执行与 $G_0$ 节点输入为 0 并崩溃的执行,所以它们最终输出 0,产生矛盾。
引理 4
:在无故障执行中存在某个配置 $C$,使得 $C_1$ 是 0 - 价的。
-
证明思路
:根据引理 2,无故障执行中达到的每个配置 $C$ 要么是 0 - 价的,要么是 1 - 价的。假设 $C_1$ 是 1 - 价的,考虑输入固定的执行 $F(I)$,系统最终会达到某个输出稳定的配置 $D$。假设 $D$ 的稳定输出值为 $v = 0$,但根据假设 $D_1$ 是 1 - 价的,这意味着在 $\alpha(D_1)$ 中存在一个执行 $\beta$,使得 $G_1$ 中的节点输出最终稳定为 1。另一方面,考虑从 $D$ 到某个点 $T$ 的无故障部分执行,它与 $\beta$ 相似,但 $G_0$ 中的节点不崩溃,且 $G_0$ 和 $G_1$ 中的节点不相遇。根据 $D$ 的定义,$G_1$ 中的节点在 $T$ 时刻输出 0,但它们无法区分此执行与 $\beta$,所以在 $T$ 时刻输出 1,产生矛盾。
发送遗漏故障下的稳定一致共识
对于发送遗漏故障,先考虑 $n \leq 2t$,$n \geq 4$ 且 $t \geq 2$ 的情况,再考虑 $n = 3$ 且 $t = 2$ 的特殊情况。这里使用二价论证和反证法,构造一个无故障执行,该执行满足局部公平性以及节点 $i$ 无限次向节点 $j$ 发送消息时,$j$ 无限次接收消息的条件,但违反了稳定条件。
引理 5
:$I_0$ 是 0 - 价的,$I_1$ 是 1 - 价的。
-
证明思路
:该引理由于稳定一致共识的有效性条件成立,证明因篇幅限制省略。
定义 $\theta(G_0)$(或 $\theta(G_1)$)为以下执行(称为分区执行):
1. 每个组中的所有节点仅与该组内的节点成功相遇一次。
2. $G_0$(或 $G_1$)组中的所有节点仅与 $G_1$(或 $G_0$)组中的所有节点相遇一次,但 $G_0$(或 $G_1$)到 $G_1$(或 $G_0$)的所有消息都不传递。
3. 确定地选择一对节点 $i$ 和 $j$,其中 $i$ 在 $G_1$(或 $G_0$)中,$j$ 在 $G_0$(或 $G_1$)中,且节点 $i$ 成功与 $j$ 相遇。
$\theta(C_0)$(或 $\theta(C_1)$)表示从 $C$ 开始的执行集合,其中无限次重复分区执行 $\theta(G_0)$(或 $\theta(G_1)$),并选择有效的节点对 $i$ 和 $j$,使得 $G_1$(或 $G_0$)中的每个节点无限次成功与 $G_0$(或 $G_1$)中的其他节点相遇。
引理 6
:考虑配置 $C$,其中 $C_0$ 是 $v$ - 价的,$C_1$ 是 $v’$ - 价的($v \neq v’$)。则在 $\theta(C_0)$ 中存在可达配置 $A$,使得:
1. $A_1$ 是 $v’$ - 价的。
2. 对于从 $A$ 开始的一次相遇,若发起者在 $G_0$ 中,接收者在 $G_1$ 中,则得到的配置 $B$ 的 $B_1$ 总是 $v$ - 价的。
引理 7
:考虑配置 $C$,其中 $C_0$ 是 $v$ - 价的,$C_1$ 是 $v’$ - 价的($v \neq v’$)。则在 $\theta(C_1)$ 中存在可达配置 $A$,使得:
1. $A_0$ 是 $v$ - 价的。
2. 对于从 $A$ 开始的一次相遇,若发起者在 $G_1$ 中,接收者在 $G_0$ 中,则得到的配置 $B$ 的 $B_0$ 总是 $v’$ - 价的。
引理 8
:对于 $n \leq 2t$,$t \geq 2$ 且 $n \geq 4$,不存在解决发送遗漏故障下稳定一致共识的协议。
-
证明思路
:只需证明当 $n = 2t$ 时不存在这样的协议。假设存在协议 $P$,构造一个无故障执行,其中存在无限序列的二价配置 $C_k$,这与稳定一致共识的稳定条件矛盾。
下面通过一个流程图来展示引理 8 的证明过程:
graph TD;
A[假设存在协议P] --> B[构造二价配置C0];
B --> C[假设已构造Ck];
C --> D{k为偶数?};
D -- 是 --> E[考虑β(C0k)执行];
D -- 否 --> F[考虑β(C1k)执行];
E --> G[选择节点对p,q];
F --> G;
G --> H[根据引理6得到配置A];
H --> I[构造部分执行γ1];
I --> J[得到配置D];
J --> K{D0是1 - 价?};
K -- 是 --> L[Ck+1 = D];
K -- 否 --> M[构造执行γ2];
M --> N[得到配置F];
N --> O[Ck+1 = F];
L --> P[继续构造Ck+2];
O --> P;
引理 9 :对于 $t = 2$ 且 $n = 3$,即使输入固定,也不存在解决发送遗漏故障下稳定一致共识的协议。(证明因篇幅限制省略)
定理 2
:若 $t \geq 2$ 且 $n \leq 2t$,即使输入固定,发送遗漏故障下的稳定一致共识也是不可解的。
-
证明思路
:该结果由引理 8 和引理 9 得出。
一般遗漏故障下的稳定一致共识
定理 3
:即使输入固定,存在一个节点受一般遗漏故障影响时,也不存在解决稳定一致共识的协议。
-
证明思路
:假设存在协议 $P$,根据二价论证,存在两个初始配置 $C$ 和 $C’$,仅某个节点 $i$ 的初始值不同,且 $I$ 是 0 - 价的,$I’$ 是 1 - 价的。考虑节点 $i$ 受一般遗漏故障影响的执行集合 $\alpha$,系统最终会达到输出稳定的配置 $D$,假设稳定输出值为 $v = 1$。选择节点 $j$,它在 $T$ 时刻输出 1。再考虑节点 $j$ 受一般遗漏故障影响的执行集合 $\beta$,系统会达到输出稳定的配置 $D’$,假设稳定输出值为 $v’$。通过构造一个部分执行,发现节点 $j$ 无法区分不同的执行,从而得出 $v’ = 1$。重复类似的无故障部分执行,会得到一个满足局部公平性和消息接收条件的无故障执行,但所有节点没有稳定输出 0,这与 $I$ 是 0 - 价的假设矛盾。
下面通过一个表格总结不同故障类型下稳定一致共识的可解性:
| 故障类型 | 条件 | 可解性 |
| ---- | ---- | ---- |
| 崩溃故障 | 输入不固定且 $n \leq 2t$ | 不可解 |
| 发送遗漏故障 | $t \geq 2$ 且 $n \leq 2t$,输入固定 | 不可解 |
| 一般遗漏故障 | 存在一个节点受一般遗漏故障影响,输入固定 | 不可解 |
移动网络中稳定一致共识的紧界分析
解决崩溃和发送遗漏故障的稳定一致共识算法
在前面讨论了不同故障类型下稳定一致共识的不可解性后,接下来介绍一种解决崩溃和发送遗漏故障的稳定一致共识算法。该算法主要考虑在输入可稳定的情况下,容忍 $t$ 个崩溃或发送遗漏故障,前提是节点总数 $n > 2t$($t \geq 1$)。
每个节点 $i$ 维护以下变量:
-
my_inputi
:表示当前输入端口的读数。
-
inputs[i][]
:一个矩阵,用于维护每个节点已知的输入值估计(
inputs[i][i]
保存节点 $i$ 已知的值)。
-
C_INPUTi[]
:一个数组,用于维护所有节点的一致输入值。
-
ci[]
:一个计数器数组,用于跟踪每个节点输入变化的次数,其中
ci[i]
用于跟踪本地输入的变化次数。
以下是该算法的详细代码:
Code for node i
Variables:
1 my_inputi, ci[], inputs[i][], C_INPUTi[]
Initialization:
2 for all k, j: inputs[i][k][j] = 0, C_INPUTi[k] = 0, ci[k] = 0
State update:
3 when inputs[i][i][i] != my_inputi
4 ci[i] = ci[i] + 1
5 inputs[i][i][i] = my_inputi
6 when node i encounters node j
7 i sends inputs[i][i][], ci[] to j
8 when node i receives inputs[j][j][], cj[] from j do
9 inputs[i][j][] = inputs[j][j][]
10 for all k != i:
11 if cj[k] > ci[k] then
12 ci[k] = cj[k]
13 inputs[i][i][k] = inputs[j][j][k]
Output:
14 for all j
15 if ∃v : |k : inputs[i][k][j] = v| ≥ n - t then C_INPUT[j] = v else C_INPUT[j] = 0
16 if ∃v : |k : C_INPUTi[k] = v| ≥ n - t then outputs v else outputs 0
下面通过一个表格来解释代码中各个部分的功能:
| 代码行 | 功能描述 |
| ---- | ---- |
| 1 | 定义节点 $i$ 维护的变量 |
| 2 | 初始化变量,将所有相关数组元素置为 0 |
| 3 - 5 | 当本地输入发生变化时,更新计数器和输入矩阵 |
| 6 - 7 | 当节点 $i$ 与节点 $j$ 相遇时,发送自身的输入矩阵和计数器数组 |
| 8 - 13 | 当节点 $i$ 收到节点 $j$ 的信息时,更新自身的输入矩阵和计数器数组 |
| 14 - 16 | 根据输入矩阵和一致输入数组的情况输出最终结果 |
接下来分析该算法的一些引理:
-
引理 10
:对于任意节点 $i$,
ci[i]
最终会稳定。
-
证明思路
:由于节点 $i$ 的输入只能改变有限次,
ci[i]
是有界的,且该变量不会减小,所以最终会稳定。
-
引理 11
:对于任意节点 $i$ 和 $j$,
ci[j]
最终会稳定。
-
证明思路
:若 $j = i$,根据引理 10 可知
ci[i]
最终稳定。若 $j \neq i$,根据引理 10,
cj[j]
最终会稳定到某个值 $c_j$,且对于任意 $k$ 有 $c_k[j] \leq c_j[j]$。在某个时间 $t$ 之后,
ci[j]
不会减小,所以最终会稳定。
-
引理 12
:对于任意节点 $i$ 和 $j$,
inputs[i][i][j]
最终会稳定。
-
证明思路
:由于节点 $i$ 的输入只能改变有限次,
inputs[i][i][i]
必然会稳定。对于 $j \neq i$,根据引理 11,
ci[j]
最终稳定,这意味着节点 $i$ 最终会停止更新
inputs[i][i][j]
。
下面通过一个流程图来展示引理 11 和引理 12 的证明逻辑关系:
graph TD;
A[引理10] --> B[ci[i]最终稳定];
B --> C{j = i?};
C -- 是 --> D[ci[j]最终稳定];
C -- 否 --> E[cj[j]最终稳定到cj];
E --> F[ck[j] <= cj[j]];
F --> G[ci[j]最终稳定];
B --> H[inputs[i][i][i]最终稳定];
G --> I[ci[j]稳定];
I --> J[inputs[i][i][j]最终稳定];
-
引理 13
:假设节点 $i$ 是正确节点,且
inputs[i][i][i]稳定到 $v_i$,则对于任意节点 $j$,inputj[j][i]最终会稳定到 $v_i$。-
证明思路
:根据引理 11,
cj[i]最终稳定,所以节点 $j$ 最终会停止更新inputj[j][i]。由于节点 $i$ 是正确的,且其输入稳定到 $v_i$,节点 $j$ 最终会与节点 $i$ 相遇,并将inputj[j][i]设置为 $v_i$。
-
证明思路
:根据引理 11,
-
引理 14
:如果节点 $j$ 和 $k$ 是正确节点,对于任意节点 $i$,若
inputj[j][i]稳定到 $v_j$,inputk[k][i]稳定到 $v_k$,则 $v_j = v_k$。-
证明思路
:若 $i = k$ 或 $j = k$,根据引理 13 可知该引理成立。若 $i \neq j, k$,分两种情况讨论。若 $c_k[i] \neq c_j[i]$,不妨设 $c_k[i] > c_j[i]$,由于 $j$ 和 $k$ 是正确节点,$j$ 和 $i$ 会无限次成功相遇,$k$ 收到 $j$ 的消息后会更新
ck[i]和inputsk[k][i],使得 $c_k = c_j$ 且 $v_k = v_j$。若 $c_k[i] = c_j[i]$,由于ci[i]只会在节点 $i$ 改变输入时增加,所以 $v_k = v_j$。
-
证明思路
:若 $i = k$ 或 $j = k$,根据引理 13 可知该引理成立。若 $i \neq j, k$,分两种情况讨论。若 $c_k[i] \neq c_j[i]$,不妨设 $c_k[i] > c_j[i]$,由于 $j$ 和 $k$ 是正确节点,$j$ 和 $i$ 会无限次成功相遇,$k$ 收到 $j$ 的消息后会更新
-
引理 15
:对于任意节点 $i$、$j$ 和 $k$,
inputs[i][j][k]在时间 $T$ 之后会稳定。- 证明思路 :该引理直接由引理 12 得出。
-
引理 16
:对于任意节点 $i$ 和 $j$,
C_INPUTi[j]在时间 $T$ 之后会稳定。-
证明思路
:根据引理 15,在时间 $T$ 之后,
inputs[i][k][j]最终会稳定。若存在某个值 $v$ 使得 $|k : inputs[i][k][j] = v| \geq n - t$,则将C_INPUTi[j]设置为 $v$,且该值不会再改变。若不存在这样的值,则将C_INPUTi[j]设置为 0,且该值也不会再改变。
-
证明思路
:根据引理 15,在时间 $T$ 之后,
-
引理 17
:假设节点 $i$ 是正确节点,且
my_inputi稳定到 $v_i$,对于任意节点 $j$,C_INPUTj[i]最终会稳定到 $v_i$。-
证明思路
:根据引理 13,对于每个正确节点 $k$,
inputsk[k][i]最终会稳定到 $v_i$。对于任意节点 $j$,在时间 $T$ 之后,它会收到所有正确节点 $k$ 的消息,使得inputsj[k][i] = v_i。由于至少有 $n - t$ 个正确节点,最终会满足代码中第 15 行的条件,节点 $j$ 的C_INPUTj[i]会等于 $v_i$。
-
证明思路
:根据引理 13,对于每个正确节点 $k$,
通过以上引理的证明,可以验证该算法在崩溃和发送遗漏故障下能够实现稳定一致共识。在实际应用中,该算法可以帮助分布式系统在存在一定故障的情况下,仍然能够达成一致的决策,提高系统的可靠性和稳定性。
超级会员免费看
3060

被折叠的 条评论
为什么被折叠?



