向量时钟与分布式快照

向量时钟

向量时钟是一个由所有节点的逻辑时钟所组成的向量。对于一个由 N N N个节点组成的分布式系统,每个节点的向量时钟都是一个 N N N维的向量,表示为 [ C 0 , C 1 , . . . , C n − 1 ] [C_0,C_1,...,C_{n-1}] [C0,C1,...,Cn1]

思想:让每个进程都能够知道系统中其他所有进程的逻辑时钟,这样就无须额外指定进程的优先级就能实现全序关系。

计算方法:
对于进程 i i i 来说, T i [ i ] T_i[i] Ti[i] 表示进程 i i i 本地的逻辑时间。
1.当进程 i i i 当有新的事件发生时, T i [ i ] = T i [ i ] + 1 T_i[i] =T_i[i] +1 Ti[i]=Ti[i]+1
2.当进程 i i i 发送消息时,会将它的向量时钟 T i T_i Ti 附带在消息中。
3.当进程 j j j 收到消息后,会更新本地的向量时间: T j [ k ] = m a x ( T j [ k ] , T [ k ] ) T_j[k] = max(T_j[k], T[k]) Tj[k]=max(Tj[k],T[k]) ,其中 k ∈ [ 1 , N ] k \in [1,N ] k[1,N](T是消息中附带的向量时间)。

T i < T j     ⇔     ∀ x : T i [ x ] ⩽ T j [ x ]    a n d    ∃ y : T i [ y ] < T j [ y ] T_i < T_j ~~~\Leftrightarrow~~~ \forall x:T_i[x] \leqslant T_j[x] ~~and~~\exists y:T_i[y] < T_j[y] Ti<Tj      x:Ti[x]Tj[x]  and  yTi[y]<Tj[y]

对于任意两个事件 a a a b b b a → b    ⇔    T i < T j a\rightarrow b ~~\Leftrightarrow~~ T_i<T_j ab    Ti<Tj

分布式快照

如何给系统"拍个快照",从而得到系统的全局状态,用于在故障发生时将系统恢复到过去的某个正常状态。

Lamport大师举过一个例子:一个满是候鸟的天空,场景大到无法用一张照片拍完,如何拍摄多张照片并把它们拼凑在一起形成完整的全景?

Chandy-Lamport算法
1.初始化:进程 P i P_i Pi记录自己的状态,广播 m a r k e r marker marker给其他进程,并开始记录入边的消息。

2.传播快照:进程 P j P_j Pj第一次收到 m a r k e r marker marker消息后,会记录下自己的状态,并开始记录其他入边的消息。进程 P j P_j Pj将管道 C i j C_{ij} Cij的状态记为空,将快照广播给其他进程。

3.终止快照:当所有入边都收到 m a r k e r marker marker消息时,快照记录完毕。

(一旦某个进程收到 m a r k e r marker marker,则接收 m a r k e r marker marker的管道就置为空,进程不再记录该通道的消息)

猜你喜欢

转载自blog.csdn.net/weixin_46878177/article/details/127648169
今日推荐