分布式的共识理论怎么理解

155 阅读5分钟

1. 什么是共识

1.1 概念

共识是指在分布式系统中,多个节点对某个数据值或决策达成一致意见。

1.2 生活中的共识

生活中的共识问题很好理解,比如小李邀请小张明天一起聚个餐
小张问:“明天吃点什么呢”
小李说“牛排怎么样”
小张:“ok,就这么定了”
小李提议聚餐吃牛排,小张同意,小李与小张就明天聚餐吃牛排这个行为就达成了共识,并且会根据这个共识采取接下来的行动

1.3 数学术语

用数学术语来描述一下分布式系统的共识问题:
在一个包含 n个实例的分布式系统中,集合 {0,1,2,…,n−1}表示这些实例。每个实例i拥有一个初始值vi。这些实例之间可以相互通信。通过某种算法,使得即使部分实例出现故障,系统中的所有非故障实例仍能达成一致,选择出一个不可更改的最终决定值vf
该算法需要满足以下三个性质:

  1. 终止性(Termination):

    • 所有非故障的实例最终都会确定某一个值并终止算法执行。换句话说,算法不会无限期地执行下去,实例们都会在有限的时间内达成决议。
  2. 协定性(Agreement):

    • 所有非故障的实例最终选择的值vf必须是相同的。
  3. 完整性(Integrity):

    • 如果正确的实例都提议同一个值,那么所有处于认同状态的实例都会选择这个值

这些性质确保了在分布式系统中,即使面临部分节点故障或网络延迟等问题,系统仍然能够达成一个一致的决策,避免数据不一致的问题

2. 一致性和共识

一致性:
指的是在分布式系统中,多个节点在执行一系列操作后,通过遵循某些协议,确保它们对外部呈现的数据和状态保持一致。简单来说,就是确保所有节点上的数据是完全同步的,并且在某个提案(Proposal)上达成共识。
共识:
指的是多个节点在分布式系统中就某个状态或决定达成一致的过程。换句话说,一致性强调的是最终的状态是否一致,而共识则是实现这种一致性的手段

3. 为什么要达成共识

在分布式系统中,多个节点(如服务器、进程等)共同协作来完成任务,对外感觉就像是一个单机的服务。由于是分布式的环境,一定会存在网络问题,时钟问题,以及节点故障问题,这些问题都将导致系统出现各种各样的问题,其可靠性得不到保证。比如:

选主(Leader Election):
在需要一个主节点进行写操作的分布式数据库中,系统必须确保在所有节点之间达成共识,选出一个主节点。如果网络出现故障,可能会导致出现多个主节点的情况,这样会引发数据冲突和一致性问题。共识算法能够保证在这种情况下,系统能够选出唯一的主节点

原子提交(Atomic Commit):
在涉及多个节点或分区的分布式事务中,所有节点必须一致地决定是提交还是回滚事务,以保证事务的原子性。如果事务在某些节点上成功,而在其他节点上失败,系统就需要使用共识机制来确保所有节点做出统一的决定,要么全部提交,要么全部回滚

可见,共识是分布式系统正常运转的最基本保障,只有在共识的帮助下,分布式系统才能保证一致性,像单一节点一样工作,对外提供可靠的服务

4. 共识算法

共识算法也叫一致性协议算法,是用于在分布式系统中让多个独立的节点就某个决策或状态达成一致的一类算法。分布式系统中的每个节点都可能会因为网络分区、节点故障、延迟等问题,导致它们之间无法完全同步状态。因此,共识算法的目标是在这种不确定性和潜在的故障情况下,确保所有非故障节点最终能够就某个值或操作达成一致。 共识算法通常具备以下几个关键特性:

  1. 终止性 (Termination):

    • 所有非故障节点最终都会做出决定,不会陷入无限等待或无法达成一致的状态。
  2. 一致性 (Consistency):

    • 无论任何时间点,所有非故障节点做出的决定都是相同的,避免出现分裂或不一致的结果。
  3. 有效性 (Validity):

    • 如果所有节点提议相同的值,那么该值一定会被最终选定为共识结果

4.1 常见的共识算法

常见的共识算法包含以下几种:

  • Paxos:一种经典的共识算法,被认为是分布式一致性问题的基础解决方案
  • Raft:一种更易于理解和实现的共识算法,解决了Paxos的复杂性问题
  • Zab:ZooKeeper使用的原子广播协议,确保分布式系统中的状态一致性

接下来将分章节详细介绍这几种共识算法

交流学习

如果您觉得文章有帮助,点个关注哦。可以关注公众号:IT杨秀才,秀才后面会在公众号分享分布式:理论 》实战 》设计 》面试的系列知识。也会持续更新更多硬核文章,一起聊聊互联网那些事儿!