续 Day 17
使用 timestamp 是排序事件的好方法,我们曾在 2021 Day 11 - 顺序性事件的时间戳记 看过用 timestamp 做排序的例子,当时我们提到可以使用 逻辑时钟 (logical clocks) 来取代 日历钟 (time-of-day),逻辑时钟通常就是使用 counter 针对每个操作做累加(也就是序列号),透过序列号或 timestamp 你很轻松的就能知道全局顺序。
single-leader 类型的数据复制资料库很好实作序列号,leader 就帮每个写入计数就好了,那麽非 single-leader 类型的资料库该怎麽办呢?
在实务上替非 single-leader 资料库(multi-leader, leaderless)建置序列号有以下 3 种方法:
相比 single-leader 来看,这 3 个方法都有很好的可扩充性,然而,这些序列号不符合因果关系。
救星来了,马上要来介绍一个能在分散式系统产生有因果关系的序列号方法,Lamport timestamp,来自 1978 年由 Leslie Lamport 发表,这也是在分散式系统领域中被引用最多次的论文之一。
Lamport timestamp 提供有因果关系全局顺序的方式如下图 9-8, 每一个节点都有唯一的 ID,且每个节点都会计算已执行操作的数量,Lamport timestamp 资料就是个简单的 (counter, 节点 ID)
,2 个节点或许会有一样的 counter,但是加入节点 ID 後,就能是该 timestamp 成为唯一。
Lamport timestamp 基本上跟日历钟没啥关系,但它能提供全局顺序,如果你想比较 2 个 Lamport timestamp 大小,首先就看 counter 谁大,倘若 2 个 timestamp counter 相同,就以节点 ID 大小为主。
另外每个节点跟 Client 都要追踪最大 counter 值,所以每一个 request 都要包含目前所知的最大值,当一个节点接收 request 或回覆 response 时,若目前收到的最大 counter 值大於自已的值,要立马对齐自己 counter 值至最大值。
如上图 9-8, 当 Client A 从节点 2 接收到 counter 值为 5,然它会发送最大值 5 给节点 1,那时节点 1 counter 值 是 1, 所以它会加 5 变成 6,然後再回传回去。
因为最大 counter 值会在每一个操作中被携带,所以该方案能确保 Lamport timestamp 的排序与因果关系一致。
<<: # Day 9 Cache and TLB Flushing Under Linux (一)
「干部不强,我身上尽是汗水味; 干部太强,我身旁满是血腥味。」 年轻时候 待过的公司,共有三个部门...
今天开始,我们要进入物件导向的世界了,先前已经简单提过了,物件导向程序设计是一种以物件观念来设计程序...
前几天做了很多 AWS 服务使用 CDK 部署的介绍,今天我想来介绍一个满多人都有机会用到的 Blo...
本系列文之後也会置於个人网站 在「快速开始」的单元中,实际上已经完成了所有身份识别、身份验证、授权...
好快就过完三十天了,这系列文章也要结束了,还记得第一天的时候,希望可以涵盖一些主题,对应这三十天以来...