Chandy-Lamport分布式快照学习记录和Flink与实现分布式快照的机制

Snapshot Algorithm分布式快照算法是拿来干嘛的?在缺乏全局时钟或者全局时钟不可靠的分布式系统确定全局状态A snapshot algorithm is used to create a consistent snapshot of the global state of a distributed system. Due to the lack of globally sh...
摘要由CSDN通过智能技术生成

Snapshot Algorithm

分布式快照算法是拿来干嘛的?

在缺乏全局时钟或者全局时钟不可靠的分布式系统确定全局状态

A snapshot algorithm is used to create a consistent snapshot of the global state of a distributed system. Due to the lack of globally shared memory and a global clock, this isn’t trivially possible.

Global Snapshot

全局快照我们也可以理解为全局状态,主要用于在Failure Recovery。

我们把分布式系统简化为以节点表示的进程状态图,进程之间以消息队列进行通信。

这里的消息队列有两类input channel 和 output channel,channel可以看作是一个无限大的FIFO队列。

队列中收到的message都是有序无重复的。

C-L分布式快照算法通过记录每个进程的local state和input channel中有序的message作为一个局部快照。

那么global snapshot就是把所有进程的local snapshot全部合并起来

Chandy-Lamport

考虑一个分布式系统,这些进程运行在不同的物理机器。一个分布式系统全局状态就是进程的状态和队列中的message

在这里插入图片描述

考虑一个分布式系统,其中有两个节点,即两个进程再循环传递令牌。p和q,s0,s1对应的是两个状态。token可以理解为一个令牌,全局只有一个,进程之间通过消息队列发送令牌

s0表示进程不持有令牌,s1表示进程持有令牌。

两个进程之间的连线代表消息队列,token可能处于消息队列中,这时候两个进程状态都是s0,都没有令牌。

进程是有可能崩溃的
我们要保证进程崩溃重启之后,系统仍然能够正常运行,于是我们需要从某个检查点恢复程序的运行状态,这就需要定时把系统中在某个时间点的状态保存起来,也就是做一次snapshot

保存什么东西?

保存每个节点在当前的状态以及消息队列在当前的状态(消息队列的message)。

eg:

对上图来说,我们对右上角的状态做一个snapshot,保存的状态如下:

p s0
q s0
p->q token
q->p empty

但是由于pq是两个进程,时间不同步,例如p进程在发送token之后进行了快照存储,q在p发送token之前进行snapshot.

1.p在snapshot的时候由于p已经发送了token,现在token在q进程队列中,所以p进程保存快照的时候认定token既不在p也在p的接受队列
2.q在p发送之前快照,这时候token还在p手上,因此q进程认定token不在q也不在q进程的队列中

导致全局快照中token消失不见

解决办法
Marker-Receiving Rule

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值