分布式系统的状态
Posted 白水baishui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式系统的状态相关的知识,希望对你有一定的参考价值。
文章目录
1. 观察全局状态
1.1. 全局状态定义
分布式系统可以看作是一系列协同工作的进程集合: P = { P 1 , P 2 , . . . , P n } P=\\{P1,P2,..., P_n\\} P={P1,P2,...,Pn}
这个进程是物理分布的,它们之间通过消息通信实现互操作。分布式系统的全局状态由局部状态集和消息通道状态集共同组成:
- 局部状态集
是指分布式系统中全部进程变量的集合; - 消息通道状态集
是指在消息传输中的全部消息序列的集合。
1.2. 观察分布式系统的全局状态的必要性
观察分布式系统的全局状态,有利于:
-
分布式无用单元收集
对象的引用情况表示为对象的一个状态,该状态包含在全局状态中;
-
分布式调试
例如,判断某个进程 p i p_i pi 的变量 x x x 和另一个进程 p j p_j pj 的变量 y y y 的差值大于 δ \\delta δ,就需要通过比较全局状态才能判定; -
死锁判定和程序终止判定
死锁和程序是一个全局状态谓词(函数),该状态谓词包含在全局状态中; -
检查点(Checkpointing)
检查点需要通过记录全局状态实现。
1.3. 观察系统全局状态的困难性
观察系统全局状态的困难性在于难以同步一个全局时间,如果所有进程有完全同步的时钟,那么就能让每个进程记录下它处于某个状态的时间,进而获得系统实际的全局状态。
一个可行的办法是从不同时钟记录的本地状态中汇总出一个有意义的一致全局状态。
一个正常执行的分布式系统,它的执行可以描述成系统全局状态的一系列变迁: S 0 → S 1 → S 2 → … S_0\\to S_1\\to S_2 \\to … S0→S1→S2→…系统通过保持全局状态的一致性逐步发展。为了描述这样一个全局状态,可以引入割集的概念。
1.4. 割集
在介绍割集之前,先说一下什么是进程历史。所谓进程历史,就是进程在执行的进程中发生的一系列事件: h i s t o r y ( p i ) = h i = < e 0 i , e 1 i , e 2 i , … > history(p_i) = h_i = <e_0^i, e_1^i, e_2^i, …> history(pi)=hi=<e0i,e1i,e2i,…>这样的话,全局历史就可以定义为多个进程历史的并集,设总共N个进程,则全局历史为: H = h 0 ∪ h 1 ∪ … ∪ h N − 1 H=h_0 \\cup h_1 \\cup…\\cup h_{N-1} H=h0∪h1∪…∪hN−1这时,定义割集 C C C为系统全局历史的一个子集,表示系统的在某一时刻的状态: C = h 1 c 1 ∪ h 2 c 2 ∪ … ∪ h N c n C=h^{c1}_1 \\cup h^{c2}_2 \\cup…\\cup h^{cn}_N C=h1c1∪h2c2∪…∪hNcn当所有进程都取最后一个状态时,即达到割集的边界,此时的割集代表了系统的当前(最后一刻)状态。
有了割集的概念之后,若对于割集中的每个事件,割集中都包含了它之前发生的事件,那么该割集就称为一致的割集,一致的割集对应的状态就称为一致的全局状态:
2. 快照算法
2.1. Chandy和Lamport的快照算法
2.1.1. 快照算法介绍
快照算法通过记录进程集的进程状态和通道状态来记录系统的状态,算法所记录的状态组合可能并没有在同一时间发生,但所记录的全局状态是一致的。
该快照算法基于四个假设:
- 不论是通道还是进程都没有故障;
- 通信是可靠的,发送的消息能被完整地接收到;
- 通道是单向的,并且消息是以FIFO的顺序传递的;
- 描述进程和通道的图是强连通的(在任两个进程之间有一条路径)。
快照算法的优点:
- 任一进程可在任一时间开始一个全局快照;
- 在照快照时,进程可以继续它们的执行,可以发送和接收正常的消息。
2.1.2. 进程 p i p_i pi的标记接收规则
p
i
p_i
pi 接收通道
c
c
c 上的标记消息(Marker Message):
\\quad
if (
p
i
p_i
pi还没有记录
c
c
c 的状态):
\\qquad
p
i
p_i
pi 记录
c
c
c 的进程状态;
\\qquad
将
c
c
c 的状态记成空集;
\\qquad
开始记录从接入通道上到达的其他消息;
\\quad
else:
\\qquad
p
i
p_i
pi 把
c
c
c 的状态记录成保留它的状态以来它所接收到的消息集合
2.1.3. 进程 p i p_i pi的标记发送规则
在
p
i
p_i
pi 记录了它的本地状态之后,对每个外出通道
c
c
c:
\\quad
在
p
i
p_i
pi 从
c
c
c 上发送任何其他消息之前,先发送一个标记消息;
2.1.4. 快照算法的执行过程
算法启动时,认为从一个不存在的通道上接收到了一个标记(初始化)。算法可以在进程本地记录状态;也可以让所有进程把它们记录的状态发送到一个指定的进程进行状态收集。
对每个进程来说,它负责记录它自身的进程状态,还负责记录它发送给每个外出通道的消息。
进程记录每个接收通道的状态为:在进程记录下自身的状态之后和在发送方记录下它自身状态(由通道中的标记标识“发送方记录自己状态”这个行为)之前到达的任何消息。
2.2. 快照算法的执行示例
假设现在有一应用程序的功能如下:
进程
p
1
p_1
p1 通过通道
c
2
c_2
c2 向
p
2
p_2
p2 发送商品订单,并以每个商品10美元附上付款。收到订单后,进程
p
2
p_2
p2 沿通道
c
1
c_1
c1 给
p
1
p_1
p1 发送商品。
那么就有接下来的动作:
全局状态 | 进程的动作 | 快照动作 | 记录下的全局状态 |
---|---|---|---|
S 0 S_0 S0 |
p
1
p_1
p1记录状态; p 1 p_1 p1发送 M M M |
p
1
p_1
p1=<$1000,0>; c 1 c_1 c1=< NULL> | |
S 1 S_1 S1 | |||
S 2 S_2 S2 |
p
2
p_2
p2收到
M
M
M,记录状态; p 2 p_2 p2发送 M M M |
p
2
p_2
p2=<$50,1995>; c 2 c_2 c2以上是关于分布式系统的状态的主要内容,如果未能解决你的问题,请参考以下文章 |