03分布式
- lamport
- Vector
- global state
- snapshot快照
lamport
- 重点在发生顺序,实际时间和发生时间没关系
- Two distinct events a and b are said to be concurrent (denoted by a||b),就是判断不出来谁先谁后,没有因果和逻辑关系
-
-
- 两种算法题一般
- 第一种是多个机器按一定时间间隔做事情,然后某一个机器在某相对时间向另一个发送消息,另一个需要在此相对时间的下一个收到,然后判断时间上是否正确,如果时间大于发送过来的时间,则继续按原间隔,如果不是,则变成发送时间+1。因为这个题一般会说明发送消息会按时间间隔发送过去
-
-
- 第二个是
- 每个事件对应一个 Lamport 时间戳,初始值为0
- 如果事件在节点内发生,时间戳加1
- 如果事件属于发送事件,时间戳加1并在消息中带上该时间戳
- 如果事件属于接收事件,时间戳 = Max(本地时间戳,消息中的时间戳) + 1
- 这个就是说明每个事件和发送事件是分开的,想发送东西必须先在自己节点上算上这个事情,然后再给别人发
-
- 第一种是多个机器按一定时间间隔做事情,然后某一个机器在某相对时间向另一个发送消息,另一个需要在此相对时间的下一个收到,然后判断时间上是否正确,如果时间大于发送过来的时间,则继续按原间隔,如果不是,则变成发送时间+1。因为这个题一般会说明发送消息会按时间间隔发送过去
- 给定两个事件,不能从时间戳判断因果关系。a->b => C(a) < C(b);不可逆
Vector
- 和第二个情况的lamport很像,只不过加上了其他节点的时间戳
-
global state
- 在分布式系统中,全局状态(Global State)是指系统中所有参与者(节点、进程等)的局部状态的集合,以及它们之间的通信状态。全局状态的概念对于分布式系统的分析、故障诊断和一致性保证非常重要。全局状态有两个主要方面:
- 局部状态(Local State): 局部状态是每个参与者(节点、进程等)的本地状态。它包括了该参与者的所有信息,包括变量、数据结构、执行的代码、队列中的消息等。局部状态表示了一个参与者在某一时刻的快照。
- 通信状态(Communication State): 通信状态是描述分布式系统中消息传递的状态。它包括了消息发送和接收的信息,例如消息的发送队列、接收队列和消息传递的顺序。通信状态表示了消息在系统中的传递情况。
-
- 意思就是如果有不通信道之间的传输,发送方和接收方必须都割出来
snapshot快照
-
假设
- 通道和进程都不会失败,并且通信是可靠的: 这意味着无论是通道还是进程,它们都不会出现崩溃或故障,而且消息传递是可靠的,每条消息都会被完整地传递,且仅传递一次。
- 通道是单向的且提供FIFO有序消息传递: 这表示通道只能在一个方向上传递消息,并且消息的传递顺序是FIFO(先进先出)的,即按照消息发送的顺序来接收。
- 进程和通道的图是强连通的: 这意味着系统中的任意两个进程之间都存在一条路径,即可以通过通道相互通信。
- 任何进程都可以随时发起全局快照: 这表示任何一个进程都可以在任何时候启动全局快照,而不需要等待特定条件。
- 在捕获全局快照时,进程可以继续执行和发送接收正常消息: 即使在执行全局快照的过程中,进程仍然可以继续它们的正常操作,包括发送和接收普通消息。
这种系统的特点表明,它是一个强连通的、具有可靠通信的分布式系统,可以随时捕获全局状态快照,而不会中断进程的正常执行
-
需要两个规则确保获得快照
- Marker消息发送规则
- 指示系统进行快照,并且记录通信信道的状态
- 进程在确保记录自身状态后,发送任何其他消息之前,会向每个输出通道发送Marker信息
- Marker消息接受规则
- 进程收到来自信道的Marker消息时,
- 如果没记录自身状态,直接现在记录状态,记录通道为空集,打开记录其他输入通道上到达的消息的功能
- 如果记录了,那么进程记录信道的状态是这样的--自从上次保存状态以来接受道的消息的集合
- 进程收到来自信道的Marker消息时,
- Marker消息发送规则
-
Initiating a snapshot: 也就是开始创建 snapshot,可以由系统中的任意一个进程发起
- 进程 Pi 发起: 记录自己的进程状态,同时生产一个标识信息 marker,marker 和进程通信的 message 不同
- 将 marker 信息通过 ouput channel 发送给系统里面的其他进程
- 开始记录所有 input channel 接收到的 message
-
Propagating a snapshot: 系统中其他进程开始逐个创建 snapshot 的过程
-
对于进程 Pj 从 input channel Ckj 接收到 marker 信息:
- 如果 Pj 还没有记录自己的进程状态,则
- Pj 记录自己的进程状态,同时将 channel Ckj 置为空
- 向 output channel 发送 marker 信息
- 否则
- 记录其他 channel 在收到 marker 之前的 channel 中收到所有 message
- 所以这里的 marker 其实是充当一个分隔符,分隔进程做 local snapshot (记录进程状态)的 message。比如 Pj 做完 local snapshot 之后 Ckj 中发送过来的 message 为 [a,b,c,marker,x,y,z] 那么 a, b, c 就是进程 Pk 做 local snapshot 前的数据,Pj 对于这部分数据需要记录下来,比如记录在 log 里面。而 marker 后面 message 正常处理掉就可以了。
- 如果 Pj 还没有记录自己的进程状态,则
-
Terminating a snapshot: 算法结束条件
- 所有的进程都收到 marker 信息并且记录下自己的状态和 channel 的状态(包含的 message
-
感觉就是最后一个发生的进程的前面所有的进程都应该记录状态。一致性快照和一致性切一个道理