Update ch09.md

This commit is contained in:
muniao 2023-01-08 15:50:44 +08:00 committed by GitHub
parent 1c18806c90
commit ade42f7223
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -304,7 +304,7 @@ CAP 最初被提出只是一个为了激发数据库取舍讨论的模糊的取
- 在[第五章](https://ddia.qtmuniao.com/#/ch05),我们在单主模型中提到,主副本最重要的作用就是确定**复制日志**replication log中的**写入顺序**order of writes然后所有从副本都要遵从该顺序。如果不存在唯一的主节点作为权威来协调该顺序则在并发的多个写入可能会产生冲突。参见[处理写入冲突](https://ddia.qtmuniao.com/#/ch05?id=%e5%a4%84%e7%90%86%e5%86%99%e5%85%a5%e5%86%b2%e7%aa%81)
- 在[第七章](https://ddia.qtmuniao.com/#/ch07),我们讨论了**可串行化**serializability即保证所有并发的事务像以某种顺序一样串行执行some sequential order。可以通过物理上真的串行执行来实现也可以通过并发执行但解决冲突加锁互斥或者抛弃执行来实现。
- 在[第八章](https://ddia.qtmuniao.com/#/ch08),我们讨论了在分布式系统中使用时钟(参见[依赖同步时钟](https://ddia.qtmuniao.com/#/ch08?id=%e4%be%9d%e8%b5%96%e5%90%8c%e6%ad%a5%e6%97%b6%e9%92%9f*),这也是一个试图对无序的真实世界引入某种顺序,以解决诸如哪个写入更靠后之类的问题。
- 在[第八章](https://ddia.qtmuniao.com/#/ch08),我们讨论了在分布式系统中使用时钟(参见[依赖同步时钟](https://ddia.qtmuniao.com/#/ch08?id=%e4%be%9d%e8%b5%96%e5%90%8c%e6%ad%a5%e6%97%b6%e9%92%9f这也是一个试图对无序的真实世界引入某种顺序以解决诸如哪个写入更靠后之类的问题。
**顺序性**ordering、**线性一致性**linearizability和**共识协议**consensus三个概念间有很深的联系。相比本书其他部分尽管这几个概念更偏理论和抽象但理解他们却有助于来厘清系统的功能边界——哪些可以做哪些做不了。在接下来的几小节中我们会对此进行详细探讨。
@ -413,7 +413,7 @@ CAP 最初被提出只是一个为了激发数据库取舍讨论的模糊的取
### Lamport 时间戳
虽然上面的几种方式产生的序列号不满足因果一致性,但却有一种相对简洁的方式可以做到—— ***Lamport 时间戳**。*它是由 Lesilie Lamport 在 1978 年提出的,是分布式领域被引用最多的论文之一。
虽然上面的几种方式产生的序列号不满足因果一致性,但却有一种相对简洁的方式可以做到—— **Lamport 时间戳**它是由 Lesilie Lamport 在 1978 年提出的,是分布式领域被引用最多的论文之一。
下图展示了 Lamport 时间戳的使用方法。在该系统中,每个节点有一个唯一的 **id** 和一个记录处理过多少个操作的计数器Lamport 时间戳是上述两者组成的二元组:`(counter, node ID)` 。不同的节点可能会有相同的 counter 值,但通过引入 node ID可以使所有时间戳都是全局唯一的。
@ -825,9 +825,9 @@ XA 事务解决了一些很现实而重要的难题:让异构的数据系统
每次当前的主节点被认为下线时(可能是宕机,也可能只是网络不通),所有认为该主下线的节点就会发起选举,以选出新的主节点。每次选举会使用一个更高的纪元编号,因此所有的纪元编号是全序且单调递增的。如果不同纪元中有两个节点都认为自己是主(比如之前的主节点并没有宕机),则具有较高纪元编号的主节点胜出。
在一个主节点被授权做任何事之前,它必须要确认不会有更权威的主节点(具有更高的纪元编号)会做出不同决策。那该一个主节点如何知道自己没有被其他节点“赶下台”呢?会议一下,我们在**[真相由多数派定义](https://ddia.qtmuniao.com/#/ch08?id=%e7%9c%9f%e7%9b%b8%e7%94%b1%e5%a4%9a%e6%95%b0%e6%b4%be%e5%ae%9a%e4%b9%89)**一节中讨论过的:分布式系统中,一个节点不能无脑相信自己的判断——因为**一个节点认为自己是主,不意味着其他节点也都认可这一点**。
在一个主节点被授权做任何事之前,它必须要确认不会有更权威的主节点(具有更高的纪元编号)会做出不同决策。那该一个主节点如何知道自己没有被其他节点“赶下台”呢?会议一下,我们在[真相由多数派定义](https://ddia.qtmuniao.com/#/ch08?id=%e7%9c%9f%e7%9b%b8%e7%94%b1%e5%a4%9a%e6%95%b0%e6%b4%be%e5%ae%9a%e4%b9%89)一节中讨论过的:分布式系统中,一个节点不能无脑相信自己的判断——因为**一个节点认为自己是主,不意味着其他节点也都认可这一点**。
因此,主节点在决策前需要首先从所有节点获得法定票数(参见[Quorum 读写](https://ddia.qtmuniao.com/#/ch05?id=quorum-%e8%af%bb%e5%86%99))。对于每个决策,主节点都必须将其作为提案发给其他所有节点,并且等待法定节点的同意。法定节点通常来说,会包含多数派节点,但也不绝对(**[Flexible Paxos](https://arxiv.org/abs/1608.06696)**介绍了一种不需要多数节点的放宽的 Paxos 算法)。如果法定节点的回复中没有任何更高纪元的,则当前主节点可以放心的认为没有发生新纪元的主选举,并可以据此认为他仍然“握有领导权”。从而,可以安全的对提案进行决策。
因此,主节点在决策前需要首先从所有节点获得法定票数(参见[Quorum 读写](https://ddia.qtmuniao.com/#/ch05?id=quorum-%e8%af%bb%e5%86%99))。对于每个决策,主节点都必须将其作为提案发给其他所有节点,并且等待法定节点的同意。法定节点通常来说,会包含多数派节点,但也不绝对([Flexible Paxos](https://arxiv.org/abs/1608.06696)介绍了一种不需要多数节点的放宽的 Paxos 算法)。如果法定节点的回复中没有任何更高纪元的,则当前主节点可以放心的认为没有发生新纪元的主选举,并可以据此认为他仍然“握有领导权”。从而,可以安全的对提案进行决策。
该投票过程非常像两阶段提交提交算法。最大的区别在于: