引言
上一篇文章讲了分布式同步网络算法中的BFS、最短路径、MST和MIS算法,这一篇文章将会将分布式系统中一个非常重要的问题-一致性。在单节点的环境中,一致性问题是比较容易解决的,像单节点的数据库,因为只有一个节点,也就不存在数据不一致的说法。
因为机器总会有概率出故障,如果仅仅是单节点应用,一旦机器发生故障,那么服务将不可用。为了提供高可用的应用,多节点部署应用成为一种解决方案,但是多节点部署应用也引发了一些问题,比如节点故障依然存在;并且因为多节点,导致节点间需要通信,因此系统存在通信故障,如果机器不是在自己机房内,可能要有Byzantine故障,这些问题都可能导致数据一致性问题。比如,在分布式数据库事务中,假设两个进程a,b需要通信来达成是一致(提交或者回滚),因为通信故障,a收到b的提交请求,但是b没有收到a的请求,此时a可能会提交,而b可能回滚,那么就出现数据不一致。
接下来的文章的结构是,第一部分是介绍在分布式同步网络中,如何在通信故障下解决一致性问题;第二部分介绍,如何在节点停止故障下解决一致性问题;第三部分介绍,如何在节点出现Byzantine故障下解决一致性问题。
####通信故障下一致性
协同攻击问题
- 定义:几个将军协同攻击问题,所有将军通过信使互相传递消息,经过图的直径轮后,消息会传递给各个将军,最后决议是否发起攻击,但是如果有消息丢失,那么将军无法达成一致。在计算机中,比如分布式数据库事务
- 决议满足的条件
- 一致性:没有两个进程决议不同的值
- 有效性:如果所有进程初始值为0,那么决议值只能是唯一的0;如果所有进程的初始值为1,那么决议值只能是唯一的1
- 终止性:所有进程最终为做出决议
协同攻击问题-随机化版
-
定义:对消息丢失做一定概率性假设,然后必须允许一定概率违反一致性和有效性
-
前提假设
- 每个进程有确定的起始状态
- 知协议在固定的r≥1r \ge 1r≥1轮终止,在rrr轮后,每个进程节点需要输出它的决议
- 消息的丢失不是随机发生,而是由“对手”决定的
-
通信模式
- (i,j,k)(i,j,k)(i,j,k)中(i,j)(i,j)(i,j)是图的一条边,k≥1k \ge 1k≥1,代表在k轮的从i发给j的消息
- 定义通信模式γ\gammaγ是good,一系列的(i,j,k)(i,j,k)(i,j,k)消息投递成功的
- 对于任意的对手B不一致的概率为,PrB{ some process decides 0 and some process decides 1}≤ϵPr^B\{some \ process\ decides\ 0\ and\ some\ process\ decides\ 1\} \le \epsilonPrB{ some process decides 0 and some process decides 1}≤ϵ
-
"对手"的作用
- 为图中每个节点分配input值
- 定义一个good的通信模式
-
RandomAttack算法
-
前提假设:为简单起见,假设图是n节点的完全图(完全图是指图中任意两个节点都有直接边连接)
-
定义通信模式
-
通信模式γ\gammaγ这里指的是消息的偏序关系,(i,k)(i,k)(i,k)代表i节点的k时刻,有如下关系
- 对于所有的1≤i≤n1 \le i \le n1≤i≤n和所有的0≤k≤k′0 \le k \le k^{\prime}0≤k≤k′满足(i,k)≤γ(i,k′)(i,k) \le_{\gamma} (i,k^{\prime})(i,k)≤γ(i,k′)
- 如果(i,j,k)∈γ(i, j, k) \in \gamma(i,j,k)∈γ,则有(i,k−1)≤γ(j,k)(i, k-1) \le_{\gamma} (j, k)(i,k−1)≤γ(j,k)
- 传递性,如果(i,k)≤γ(i′,k′)(i, k) \le_{\gamma} (i^{\prime}, k^{\prime})(i,k)≤γ(i′,k′)并且(i′,k′)≤γ(i′′,k′′)(i^{\prime}, k^{\prime}) \le_{\gamma} (i^{\prime \prime}, k^{\prime \prime})(i′,k′)≤γ(i′′,k′′)则有(i,k)≤γ(i′′,k′′)(i,k) \le_{\gamma} (i^{\prime \prime}, k^{\prime \prime})(i,k)≤γ(i′′,k′′)
-
定义levellevellevel,用levelγ(i,k)level_{\gamma}(i,k)levelγ(i,k)表示进程iii在1≤k≤r1 \le k \le r1≤k≤r的值,值的规则如下
- 如果k=0k = 0k=0,那么levelγ(i,k)=0level_{\gamma}(i,k) = 0levelγ(i,k)=0
- 如果k>0k>0k>0并且有j≠ij \neq ij=i使得(j,0)>γ(i,k)(j,0) >_{\gamma} (i, k)(j,0)>γ
-
-