mirror of
https://github.com/DistSysCorp/ddia.git
synced 2024-12-25 20:30:39 +08:00
Update ch09.md
This commit is contained in:
parent
1c18806c90
commit
ade42f7223
8
ch09.md
8
ch09.md
@ -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/#/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/#/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)三个概念间有很深的联系。相比本书其他部分,尽管这几个概念更偏理论和抽象,但理解他们却有助于来厘清系统的功能边界——哪些可以做,哪些做不了。在接下来的几小节中,我们会对此进行详细探讨。
|
**顺序性**(ordering)、**线性一致性**(linearizability)和**共识协议**(consensus)三个概念间有很深的联系。相比本书其他部分,尽管这几个概念更偏理论和抽象,但理解他们却有助于来厘清系统的功能边界——哪些可以做,哪些做不了。在接下来的几小节中,我们会对此进行详细探讨。
|
||||||
|
|
||||||
@ -413,7 +413,7 @@ CAP 最初被提出只是一个为了激发数据库取舍讨论的模糊的取
|
|||||||
|
|
||||||
### Lamport 时间戳
|
### Lamport 时间戳
|
||||||
|
|
||||||
虽然上面的几种方式产生的序列号不满足因果一致性,但却有一种相对简洁的方式可以做到—— ***Lamport 时间戳**。*它是由 Lesilie Lamport 在 1978 年提出的,是分布式领域被引用最多的论文之一。
|
虽然上面的几种方式产生的序列号不满足因果一致性,但却有一种相对简洁的方式可以做到—— **Lamport 时间戳**。它是由 Lesilie Lamport 在 1978 年提出的,是分布式领域被引用最多的论文之一。
|
||||||
|
|
||||||
下图展示了 Lamport 时间戳的使用方法。在该系统中,每个节点有一个唯一的 **id** 和一个记录处理过多少个操作的计数器,Lamport 时间戳是上述两者组成的二元组:`(counter, node ID)` 。不同的节点可能会有相同的 counter 值,但通过引入 node ID,可以使所有时间戳都是全局唯一的。
|
下图展示了 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 算法)。如果法定节点的回复中没有任何更高纪元的,则当前主节点可以放心的认为没有发生新纪元的主选举,并可以据此认为他仍然“握有领导权”。从而,可以安全的对提案进行决策。
|
||||||
|
|
||||||
该投票过程非常像两阶段提交提交算法。最大的区别在于:
|
该投票过程非常像两阶段提交提交算法。最大的区别在于:
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user