vlambda博客
学习文章列表

Raft 一致性共识算法(一)—— 开篇

走马上任


你是一名非常靠谱的人才,准备入职 A公司做一名技术总监。

A公司是一家风生水起的创业公司,因行业压力和公司体量巨大,人员流动性非常高,并且项目需求变更和发版速度非常快。

所以经常会有员工做着做着就离职了,手上的项目无以为继,项目中断上线延期,高层对你颇有微词。

怎么办?

招兵买马


问题出现在项目的执行者没有备份,导致的项目风险非常大。

所以你决定招兵买马,通过适当的冗余备份来应对项目风险。

在经过一段时间的招聘之后,你招募了两名得力干将,小智和小障。

Raft 一致性共识算法(一)—— 开篇

现在实施一个项目,你可以将项目细节同时告诉小智和小障,等待他们一起回应确认可以做时,项目就可以按排期进行下去了。

这个时候无论小智还是小障离职,都不会对项目带来风险。

所以现在对风险容错的能力从无,演进到了可以接受一个人离职。

如果公司大环境没有改善,两个人一起离职的可能性也非常高,该怎么办呢?

再招募一个人,大脸猫。

Raft 一致性共识算法(一)—— 开篇

现在实施一个项目,你需要将项目细节同时告诉他们三个人,等待他们一起回应确认再继续进行。

这样对风险容错的能力就提升到了可以接受两个人离职。

由此可见,我们总可以通过增加冗余备份来应对更加极端的风险,但是带来了什么问题呢?

我们在布置项目时,需要等待他们一起确认细节通过,才能确定这个项目到底有没有风险,而一起确认细节通过这个过程可能会非常不稳定,

比如小智和小障一分钟内就可以理解这个项目细节,但是 大脸猫 需要一天,如果在保障允许两人离职的容错条件下,这个时间是必须要等待的。

Raft 一致性共识算法(一)—— 开篇

所以尽管风险控制住了,但是效率大大降低了,许多项目产生了积压,高层对你颇有微词。

怎么办?

快速交付


我们捋一下问题:允许两人离职,目前招募了三个员工,但是部分员工理解项目细节耗时过高,导致整体相应非常慢。

我们可以把问题简单化:理解项目耗时高等同于短暂离职。

既然又是离职问题,我们就又可以通过招人来解决(招更多的人,5个,10个..),但是也可以控制成本不招人,降低允许离职人数的标准。

为了使理解起来更简单,我们先选择后者,而是降低允许离职人数为只能容忍一人离职。

那现在实施项目应该怎么运作呢?

因为团队中有三个人,可以容忍一人离职,也就是同步项目细节的时候,只要有两个人及时回复相应就可以了,第三个人无论是离职还是响应慢,都不会对项目承担风险能力造成损坏,同时又保证了效率。

目前为止,事情进展的很顺利。但是出现了新的问题。

产品经理A要求首页增加一个标签,评审通过你开始布置项目,小智和小障给你响应确保没问题,成功排期,项目顺利实施。

产品经理B要求首页增加一个按钮,评审通过你开始布置项目,大脸猫和小障给你响应确保没问题,成功排期,项目顺利实施。

产品总监觉得首页出现按钮非常怪异决定下线,评审通过你开始布置项目,这时候大脸猫不干了离职了,小障给响应说没问题,他刚做过他了解背景,但是为了应对项目实施中的风险, 你必须要保障至少两个人回应,才能实施项目,大脸猫离职了,那就只能等待小智回复。

但小智之前没有做过,不清楚上下文,只能你再讲一遍上下文,把产品经理B要求首页增加一个按钮这个需求确认同步给小智,小智理解之后,才能继续进行。

但是这个过程你不仅需要和所有人沟通,而且要同步历史,如果需要沟通的人数继续增加为5个人,7个人,问题将更加严峻,也因为这些问题导致你成为了效率的绊脚石,高层对你颇有微词。

怎么办?

这就是一致性共识


照旧捋一下问题,你需要满足高可用和高效,招聘了一个团队。

但是又希望团队自治,队员自驱动,一件事情你只需要告诉一个队员就行,他会帮助你去落实,而不在乎团队规模有多大。

怎样选出这个负责人呢,选举的过程怎样保证自动自发呢,选举后你交代的事情怎么样保证同步呢,如何保证这些过程不会出错呢?等等等

如何去解决这些问题,这就是一致性共识要实现的事情。

在接下来的文章中,我会用故事+原理+代码实现的方式,为你讲明白Raft 一致性共识算法

涉及的主要篇章有

  • 复制状态机

  • 领导者选举

  • 日志复制

  • 安全保证

  • 从节点故障

  • 数据持久化

  • 时序和可用性

  • 领导者变更

  • 集群角色变更

  • 日志压缩

  • 客户端交互