6.1 什么是共识
受翻译影响,网上很多讨论 Paxos 或 Raft 的内容多使用“分布式一致性协议”或者“分布式一致性算法”这样的描述词语。例如,Google Chubby 系统的作者 Mike Burrows[1],他对 Paxos 的评价原话是:“There is only one consensus protocol...”,很多文章翻译成“世界上只有一种一致性算法...”。
虽然汉语中的“共识”和“一致”是一个意思,但它们在计算机工程中还是有明显的区别:
- 共识(consensus):所有的节点就某一项提议(如选举、分布式锁、全局 ID、数据复制等等)达成一致的过程及其算法;
- 一致(consistency):描述多个节点中存储的数据之间不自相矛盾,侧重于节点共识过程最终达成稳定状态的结果。
Paxos、Raft、ZAB 等等属于 consensus 算法,明显使用“共识”描述更准确,而 CAP 定理中的 C 和数据库 ACID 的 C 才是真正的“一致性” —— consistency 问题。
那么为什么要研究共识呢?这是因为在分布式系统中,为了消除单点风险,会使用一种名为“副本模式”的容错模型。副本容错模型的系统由多个节点组成,节点之间数据完全一致,可以保证在(≤ (N-1)/2)个节点故障的情况下,系统仍然能正常对外提供服务。
副本模型使用复制状态机实现不同节点的数据一致性,共识算法(Consensus Algorithm)是实现复制状态机最关键的角色。
复制状态机
复制状态机(Replicated State Machine)是指多台机器具有完全相同的状态,运行完全相同的确定性状态机。它让多台机器协同工作犹如一个强化的组合,其中少数机器宕机不影响整体的可用性。
如图 6-1 所示,使用复制状态机模型的工作流程:
- 客户端发起一个写请求。
- 共识模块执行共识算法进行日志复制,将日志复制至集群内各个节点。
- 日志应用到状态机。
- 服务端返回请求结果。
图 6-1 复制状态机工作过程 图片来源
实现共识有哪些难点?搞清楚这个问题从 Leslie Lamport[2] 发表的 Paxos 论文开始最合适不过。
总字数:730字