这是我参与「第四届青训营」笔记创作活动的第15天
概述
理想中的分布式系统
- 高性能:可拓展、低时延、高吞吐
- 一致性、易理解
- 容错、高可用
分布式系统
从打造KV开始
写
读
一致性模型
- 线性一致性(时间轴上的线性)
- 最终一致性(最终总会读到)
复制协议小结
共识算法
(对一个值达成共识,值本身没有顺序,但日常使用时常常打log,而log有顺序)
共识算法与一致性
- 共识协议不等于一致性
- 应用层面不同的一致性,都可用共识协议实现
- 简单的复制协议也可以提供线性一致性
- 一般讨论共识协议提到的一致性指的都是线性一致性
Raft
RSM(复制状态机)
我上完课程之后对Raft机制的整体理解(不一定正确)
- 如何保证(最终)一致性?client无法同时与多个节点对接,所以在节点之中要有一个
leader,其他都是follower.leader不断将消息再同步传达给follower。
出了错误怎么办?
-
由于leader也会定时向各个follower发送heartbeat(证明leader还在),所以如果leader挂了,其他follower发现leader没了,会成为candidate,并自发vote出一个新leader继续工作,保证了少数结点挂了不影响多数结点(类似于人类的群体组织方式)
-
关于vote:多数选举制,某个candidate向其他follower发出请求,获得多数同意即成为leader。 原则上是选择term最新的那个结点,因为它同步的消息是最新的。
-
如果是某个follower挂了或没跟上进度,就类似于这样:(注:图源于老师ppt)
leader可以通过term和index确认它掉队的地方,并且从那里开始使得它重新同步,不需要知道确切的value。
关于term
- 我认为term就是字面意思,时期(类似于古代的王朝)。将所有的行为理解为是随着时间轴而推演就很合理了。一个时期只需要一个leader,比如说这个leader在的时候term标记为1,换了个leader就标记为2。
现实远比理论要复杂得多得多得多
- (类似于人类社会的争权夺利)
共识算法的未来
- 多数分布式系统的底座
- delo中的虚拟共识
- 对外暴露一致的log作为接口,内部对于log可以有不同的实现