+++ title="Paxos算法详解" date="2023-05-02" +++ ## 前言 目前主流分布式共识算法有etcd使用的raft,zookeeper使用的zab,其思想或多或少受到paxos启发。paxos算法由Leslie Lamport在《The part-time parliament》论文中首次提出。 为描述该算法,Lamport虚构出一个paxos小岛,利用类比的手法提出共识算法,本文旨在理解该论文后并结合相关经验对该算法进行重新描述。 文章整体结构与论文相同: (1) 首先阐述Lamport提出的**三条约束**,由这三条约束推导出一致性。 (2) 在保证约束条件情况下,导出算法。 ## 术语 * *一致性*:一致性是一种状态。 * *活性*:共识算法能够保证最终达成一致性。 * *共识*:共识是过程(节点通过何种共识算法达成一致)。 * *决议*:分布式系统想要达成一致的值、操作等。 * *提议*:提出决议的过程。 * *投票*:对决议表示赞同。 * *未决决议*:已投票的决议,能否达成一致性未知。 * *已决决议*:通过共识算法达成一致性的决议。 * *节点*:参与共识算法的进程。 * *投票节点集*:对当前决议进行投票的节点。 * *法定投票节点集*:若法定投票节点集中所有节点对当前提议进行投票,则当前决议成为已决决议。 例: 存在一个256节点的集群,需要对集群管理密码进行统一配置,即所有节点密码与集群密码相同,存放在变量`password`中。一致性:任意一台功能正常节点密码相同;活性:修改密码过程能够完成,中止或者成功;共识过程:客户端进行密码修改,令`set password xxx`,发送给集群中主节点,主节点进行提议,提议后当前决议成为未决决议,集群其他节点进行投票,经过共识过程使决议成为已决决议,密码修改生效。 ## 条件 1. 非拜占庭环境,节点不会伪造信息,都尽力完成任务。 2. 消息在信道中可能存在丢失、重复、乱序。 3. 节点可能会发生故障(掉电,磁盘损坏等)。 ## 约束 所有轮次提议构成的集合需要满足下列三条约束: > 约束Ⅰ 决议的每一轮提议都有**唯一**提议号。 > 约束Ⅱ 任意两次提议的法定投票节点集都存在**至少一个**公共节点。 > 约束Ⅲ **任意**一次提议的决议与该提议法定投票节点集中**所有**节点已投票决议中具有最大提议号的决议一致。 注意:提议号可以进行大小比较,但是一般不反应时间先后顺序。
提议号 | 决议 | 法定投票节点集 |
---|---|---|
002 | 123 | 00 01 02 03 |
005 | abc | 00 01 02 04 |
114 | 123 | 01 03 04 |
127 | abc | 00 02 03 |
229 | abc | 01 02 03 |