Paxos 简介1. Paxos 简介
Paxos 简介
清无
2012-10-19 Fri
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
2. Paxos 简介
Outline
1 Paxos 功能简介
2 Paxos 协议描述
3 生产实践中的问题
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
3. Paxos 简介
Paxos 功能简介
Paxos 协议功能
历史……忽略
描述在 proposer/acceptor/learner 3 种结
分布式一致性协议,
点角色之间的交互过程
容灾特性:不管碰到结点失效、
断网或是传输延迟,都能让分
布式系统的各个结点认同一样的 不可变“值”
这个“值”可以是任意数据或操作!
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
4. Paxos 简介
Paxos 功能简介
Paxos 协议执行的一般过程
通常每个结点都部署 proposer/acceptor 角色,
读/写比不太
大时不需要 learner 角色
一个 (或多个) 结点通过选举过程成为 leader
leader 结点发起提案,
请求其他结点接受某个值
leader 根据其他结点的反馈,
声明该值得到认可或是进行重
试
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
5. Paxos 简介
Paxos 协议描述
自然语言描述的 Paxos 协议 - 神会表决
假定每个牧师维护临时如下信息:
lastTried[p]: p 试图发起的最后一个表决的编号,
由 如果没有
发起过则记录 -∞
prevVote[p]: p 投票的所有表决中, 编号最大的表决对应的
由
p 的投票, 如果没有投过票则记录 -∞
nextBal[p]: p 发出的所有 LastVote(b,v) 消息中,
由 表决编号
b 的最大值。
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
6. Paxos 简介
Paxos 协议描述
自然语言描述的 Paxos 协议 - 神会表决
神会表决执行过程为:
牧师 p 选择一个比 lastTried[p] 大的表决编号 b, 设置
lastTried[p] 为 b,
然后发送 NextBallot(b) 消息给某些牧师。
在从 p 收到一个 b 大于 nextBal[q] 的 NextBallot(b) 消息后,
牧师 q 将 nextBal[q] 设置为 b, 然后发送一个 LastVote(b,v)
消息给 p, 其中 v 等于 prevVote[q]。(b<=nextBal[q] 的
NextBallot(b) 消息将被忽略)
在从某个多数集合 Q 中的每个成员都收到一个
LastVote(b,v) 消息后,牧师 p 发起一个编号为 b, 法定人数集
为 Q, 法令为 d 的新表决, 其中 d 的选择遵守 B3 条件。 然后
他发送一个 BeginBallot(b,d) 消息给 Q 中的每一个牧师。
B3 条件:对于每一轮表决 B,
如果 B 的法定人数集中的任
一个牧师在一个 轮的表决中投过票, B 的法令与所
有这些 轮表决中的最大的 次表决的法令相同
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
7. Paxos 简介
Paxos 协议描述
自然语言描述的 Paxos 协议 - 神会表决
在收到一个 b=nextBal[q] 的 BeginBallot(b,d) 消息后, 牧师
q 在编号为 b 的表决中投出他的一票, 设置 prevVote[p] 为这
一票, 然后发送 Voted(b,q) 消息给 p (b != nextBal[q] 的
BeginBallot(b,d) 消息将被忽略)
在 p 收到 Q 中每一个 q 的 Voted(b,q) 消息后 (这里 Q 是表
决 b 的法定人数集合, b=lastTried[p]),
他将 d(这轮表决的法
令) 记录到他的律簿上, 然后发送一条 Success(d) 消息给每
个 q。
一个牧师在接收到 Success(d) 消息后,
将法令 d 写到他的律
簿上。
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
8. Paxos 简介
Paxos 协议描述
伪代码表述的 Paxos 协议
神会协议的消息同形式化表述消息对应关系:
NextBallot -> prepare
LastVote -> promise
BeginBallot -> accept
Voted -> accept_ok
Success -> decided
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
9. Paxos 简介
Paxos 协议描述
伪代码表述的 Paxos 协议
proposer 逻辑:
§ ¤
PROPOSE(v)
choose b > lastTried
send PREPARE(b) to all
if PROMISE(na, va) from majority then
va = va with highest na, or choose own v otherwise
send ACCEPT(b, va) to all
if ACCEPT_OK(b) from majority then
save (b, va) to persist storage
send DECIDED(b, va) to all
¦ ¥
acceptor 逻辑:
§ ¤
PREPARE(n)
if n > nextBal
nextBal = n
reply PROMISE(prevVote.na, prevVote.va)
ACCEPT(n, v)
if n == nextBal
prevVote.na = n
prevVote.va = v
reply ACCEPT_OK(n)
DECIDED(n, v)
save (n, v) to persist storage
¦ . . . . . . . . . . . . . . . . ¥
. . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
10. Paxos 简介
生产实践中的问题
Paxos 生产实现 - Chubby/ZooKeeper
Google Chubby 实现 Paxos 算法时对其评价:
Paxos 算法伪代码表述也就一页纸,
但真正开发出生产可用
的 C++ 代码则需要额外实现很多特性和优化方法,这些方
法有不少都没有在文献中说明
容灾算法研究者习惯于证明简短算法 (一页纸的伪代码) 的
正确性。该方法无法应用于上千行代码的系统,因此要用不
同的方法来证明真实系统的“正确性”
容灾算法仅能容忍有限的一组精心挑选的故障。但真实世界
中,
软件面临广泛得多的故障形式,包括算法错误、实现 bug、
运维失误等等。生产级软件必须具备相应的健壮性,并仔细
设计运维过程
真实系统的功能很少能被精确描述,
实际上系统实现过程中
其功能要求也可能发生变化,
因此实现必须具备可塑性。系
统也可能由于对需求功能理解有误而“出错“
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
11. Paxos 简介
生产实践中的问题
Google Chubby 对 Paxos 的修改和补充
减少消息交互,
提升数据吞吐量
Multi-Paxos - master 身份无变化时不再重复第 1 段的
prepare/promise 过程
Master 身份租约 - master 身份不会被随时抢占, 无机器故障
时会维持一段指定的时间, 这样读取数据不需要发起新的表
决, 可以直接读取 master 本地数据
应对磁盘故障
磁盘文件校验和 - 检查由于磁盘问题造成的本地数据损毁
GFS 标记文件 - 用来在本地数据全部丢失时区分是由于磁盘
故障造成还是全新启动的空结点
Catch-up 机制 - 让因磁盘故障等原因较长时间未参与表决的
结点有机会将本地状态同步至最新
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
12. Paxos 简介
生产实践中的问题
Google Chubby 对 Paxos 的修改和补充
应对其他异常
Master 身份刷新 (Boosting) - master 定期发起完整的 Paxos
表决过程确保自己的提案序号最新, 降低特定故障模式下
master 身份振荡对系统吞吐量的影响
全局 epoch 计数 - 将 master 身份切换次数记录在全局的
epoch 计数中, 并将本地持久化存储的操作全部表达为基于
epoch 的 CAS 操作,避免在表决过程的两段之间产生难以检
测的 master 身份切换造成数据损坏
快照机制 - 避免 Paxos 同步的数据库操作日志无限膨胀, 加
快新增结点同步数据库的速度
提升可运维性
动态组成员 - 原始 Paxos 算法要求选举组内结点数量已知,
现实中这样难以运维, 动态组成员机制可以动态添加/删除选
举组内结点,易于运维。
意:动态 整选举组需要 外 心, 则可能 Paxos 对
法人 数量的要求造成系统无法 !
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
13. Paxos 简介
生产实践中的问题
That’s all!
. . . . . . . . . . . . . . . . . . . .
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..