Lamport Clock 学习
研究了下Lamport clock时钟,但是具体怎么应用例子还是没搞清楚,先暂时这样。
Lamport clock 是一种逻辑时钟。
什么是逻辑时钟? 相对于物理时钟来说,逻辑时钟更稳定。因为物理时钟可能会不准,例如有个节点的时间不准了,会导致顺序错乱,在分布式系统里,例如两个事件,a在b之前发生,a在节点1,b在节点2.如果通过节点1的物理时间快了,回导致a,b事件的顺序错乱,例如通过时间戳排序时。
在分布式的系统里,会有多个节点,如何让产生的id有序,例如每个节点发出的消息,怎么排序?
- 用机器的时间
- 可能会有时钟不准问题
- 用一个id生成器的节点,每个节点请求这个节点来获取id
- 单节点,不能fault-tolerant
- 写入流量高时会有性能问题
- 用UUID
- 可以全局唯一,但是不能排序
- Preallocated blocks of ID
- 每个节点分配一个id范围,例如节点a负责1-1000的id,节点b生成1001-2000范围的id。 还是全局无序的,节点内是有序的
- 逻辑时钟,例如lamport clock
Lamport clock 通过 一种算法,让分布式系统里发生的事件,可以知道顺序。
网络延迟,时钟偏差,异步通讯,很难决定事件的顺序。
为了解决这个问题,引入了逻辑时钟来保证时间的顺序。
1978年,Leslie Lamport 正式化了 逻辑时钟的概念,引入了happend-before 关系,用来决定是否一个事件因果的影响了另一个事件
用来给事件分配时间戳的,来确保事件的一致性顺序。
每个进程维护了一个计数器,每次有本地事件的时候,就会+1.
发送消息的时候,会把这个计数器的值一起带过去。 发送消息一般指什么。
接收的那个进程就更新时间戳成 收到的时间戳和自己的时间戳,里选择最大的一个,生成一个新的事件。
如果 时间戳 t1 < t2,说明 t1可能在t2之前。 但t1>t2时不能确定因果关系,因为可能有并发
例如两个节点 a节点插入了数据1,比节点插入了数据2。 两个事件没有关系?怎么用lamport lock? 要b节点,根据数据1插入了数据2,才有happend-before关系
如果需要稳定性全序,需要用(node,id) 这样作为时间戳。
例子
TODO