这是我参与「第五届青训营」笔记创作活动的第10天
Paxos共识算法
Paxos共识算法定义
Paxos 是一个协议族,用于解决分布式网络中的共识问题。Paxos 协议于 1989 年首次提交,以希腊 Paxos 岛上一个虚构的立法共识系统命名。根据 Paxos 的发明者莱斯利·兰波特 (Leslie Lamport) 的说法,“即使立法者不断进出议会厅,议会也必须正常运转。” 因此,Paxos 是在不可预知的条件下达成协议的隐喻。
Paxos 算法提供了一种机制,使分布式系统能够在网络分区或服务器故障的情况下以可预测的方式继续工作。只要客户端应用程序可以与分布式系统中的关键角色进行通信,那么分布式存储就可以像线程安全数据结构一样可预测地运行。
Paxos 通常用于需要持久性来复制大型数据集(例如文件或数据库)的地方。即使在某些有限数量的副本无响应期间,该协议也会尝试取得进展。Paxos 还提供了在组件出现故障或变得不可靠时删除或添加新副本的能力。
Paxos工作原理
Paxos 是一种算法,它使一组分布式计算机(例如,一组分布式数据库节点)能够通过异步网络达成共识。为了达成一致,一台或多台计算机向 Paxos 提出一个值。当大多数运行 Paxos 的计算机同意其中一个建议值时,就达成了共识。
一般来说,Paxos 从一个或多个提议的值中选择一个值,然后将该值广播给所有合作的计算机。一旦 Paxos 算法运行,所有计算机(或数据库节点)就提议的值达成一致,并且集群时钟向前。
Paxos 定义了几个不同的角色,这些角色必须合作才能达成共识;他们相互作用以共同商定提议的价值。这三个角色是:
- 提议者,他们接收来自客户的请求(值)并试图说服接受者接受他们提议的值。
- 接受者,接受提议者提出的某些提议值,并让提议者知道是否接受了不同的值。接受者的回应代表对特定提案的投票。
- 学习者,向所有参与节点宣布结果。
在实践中,单个节点可以作为提议者、接受者和学习者运行。事实上,Paxos 通常与需要共识的服务共存,每个节点承担所有三个角色。然而,为了理解协议,将它们视为独立的实体是有用的。
Paxos 通过投票的概念实现了它的许多属性。选票是与每笔交易相关联的有效唯一标识符。例如,在 NoSQL 数据库的情况下,例如,选票是基于 64 位时钟读数的 128 位 UUID、随机位序列和机器 ID。这使得所有选票都是独一无二的,并且可以按时间顺序排序。每个分区键都独立跟踪 Paxos 选票。这既是优势也是劣势。针对不同分区的事务之间缺乏协调会增加整体吞吐量和可用性,但不会提供相互顺序。因此,事务不能跨分区。
选票以及其他协议状态存储在所有副本的本地系统表 system.paxos 中。当事务完成时,大部分状态都会被删除。但是,如果交易中途失败,状态将保留一段预先配置的时间(默认设置为 10 天)。DBA 应该在它过期之前运行 nodetool repair。
执行事务的节点(也称为协调器)首先创建一个新选票,并要求拥有相应令牌范围数据的节点存储它。如果选票比他们已知的选票更旧,则副本拒绝存储选票,而如果协调器没有来自副本的大多数响应,则拒绝继续进行。这个多数规则确保一次只有一个事务修改数据,并且协调器在它建议新的一个之前是最新的最新更改。
一旦协调器收到大多数接受新值的承诺,它就会评估轻量级事务条件并向所有副本发送一个新行。最后,当大多数副本接受并在其 system.paxos 表中保留新行时,协调器指示它们将更改应用到基表。在任何时候,一些副本可能会失败。即使没有失败,副本也可能拒绝投票,因为他们已经向不同的协调员做出了承诺。在所有这些情况下,协调器都会重试,可能会进行新的投票。所有步骤完成后,协调器请求参与者从中间协议状态中修剪 system.paxos。修剪作为后台任务执行。