Paxos
可靠分布式系paxos的直
2015-07-02 @drdrxp
背景
多个点一起完成一件事情.
分布式中唯一的一个问题某事达成一致.
Paxos: 分布式系的核心算法.
1. 问题
2. 复制策略
3. Paxos 算法
4. Paxos
问题
的需求:
持久性要达到:99.99999999%
可以用的基础设:
: 4% 坏率
器宕机时间: 0.1% 或更
IDC间丢包率: 5% ~ 30%
解决方案(可能)
多副本
x<n个副本坏不会数据
多副本的可靠性:
1 副本: ~ 0.63%
2 副本: ~ 0.00395%
3 副本: < 0.000001%
n 副本: = 1 - x^n /* x = 副本坏率 */
解决方案.
如何复制’?
除了副本数之外,:
可用性
原子性
一致性
...
的复制算法
主从异步复制
主从同步复制
主从半同步复制
多数派写(
Mysqlbinlog复制.
1. 主接到写.
2. 主写入本磁.
3. ‘OK’.
4. 主复制数据到从.
如果磁在复制前坏:
数据.
主从异步复制
Time
MasterClient Slave.1 Slave.2
Disk Failure
主从同步复制
1. 主接到写.
2. 主复制日志到从.
3. 库这时可能阻塞...
4. 端一直在等’OK’,直到
所有从返回.
一个失联节点造成整个系
不可用.
: 没有数据.
: 可用性降低.
Time
MasterClient Slave.1 Slave.2
主从半同步复制
1. 主接到写.
2. 主复制日志到从.
3. 库这时可能阻塞...
4. 如果1<=x<=n个从返回‘OK’
返回客‘OK’.
: 高可靠性.
: 高可用性.
: 可能任何从都不完整
需要 多数派写()
Time
MasterClient Slave.1 Slave.2
多数派写
Dynamo / Cassandra
端写入W >=N/2+1.
不需要主.
多数派:
W + R > N; R >= N/2+1
容忍最多(N-1)/2.
Time
Node.1Client Node.2 Node.3
多数派写. 后写入优胜
最后1次写入覆盖先前写
.
所有写入操作需要有1个全
序:时间
Time
Node.1Client Node.2 Node.3
: 高可靠性.
: 高可用性.
: 数据完整性有保.
多数派写..
多数派写... W + R > N
一致性:
一致性
:
非原子更新
脏读
更新问题
http://en.wikipedia.org/wiki/Concurrency_control
一个假想存
一个有3个存储节点的存集群.
使用多数派写的策略.
只存1“i”.
“i” 的每次更新对应有多个版本: i1, i2, i3…
个存支持3个命令:
get /* 最新的 “i” */
set <n> /* 置下个版本的i值为 <n> */
inc <n> /* “i” <n>,也生成1个新版本 */
将用个存来演示多数派写策略的不足,
以及如何用paxos解决问题.
一个假想存.实现
命令实现
"set" → 直接对应多数派写.
"inc" → (简单的事型操作):
1. 多数派取最新的 “i”: i1
2. Let i2 = i1 + n
3. set i2
X
set i2=3
X
get i
2
1
2
1
0
0
3
2
2
1
3
2
X
get i1=2
i2 = i1 + 1
3
2
2
1
3
2
set i2=3
OK
set i2=4
一个假想存..发问题
X
X
get i
2
1
2
1
0
0
3
2
2
1
3
2
5
3
2
1
5
3
X
get i1=2
i2 = i1 + 1
期待最X可以i3=5,
需要Y能知道X写入了i2。如何实现这个机制?
Y
get i1=2
Y
i2 = i1 + 2
3
2
2
1
3
2
时为了保正确,Y重新运行多数派 ,然后再行一次多数派写
1Y
X写入的
失。
一个假想存...
XY2“inc”操作后,了得到正确的i3
整个系i的某个版本(i2),只能有1次成功写入.
推广:
在存中,一个(1量的1个版本)在被认为确定
(端接到OK)之后,就不允被修改().
如何定被确定的”?
如何避免修改被确定的?
如何确定一个
X
Y
Any value set?
X
No
XX -
---
Any value set?
---
Y
Yes, Y gives up
X
XX -
XX -
方案: 每次写入一个前,先运行一次多数派,来确
(可能)已被写.
如何确定一个.发问题
X Y
Any value set?
X
No
Y
YX Y
XX -
---
Any value set?
---
Y
No
X
但是,XY可能同为还没有被写入,然后同开始
写。
更新
如何确定一个..
X
Any value set?
X
No
Y
YX Y
---
---
X
Y
---
Any value set?
多数派的同写入:X是最后的。
---
Y
No
多数派的同写入:Y是最后
X --
方案改:储节最后1次做写前,并拒
之前其他的写前的写入操作。
12只接受X的写入
23只接受Y的写入
如何确定一个...
使用个策略,一个(i的每个版本)可以被安全的存.
Leslie Lamport 写了个个算法的paper.
Paxos
Paxos是什么
一个可靠的存: 基于多数派.
每个paxos例用来存一个.
2RPC来确定一个.
一个确定后不能被修改.
确定指被多数派接受写入.
一致性.
Paxos
Classic Paxos
1(确定1)写入需要2RPC.
Multi Paxos
约为1RPC,确定1(1RPC做了合并).
Fast Paxos
没冲突:1RPC确定一个.
有冲突:2RPC确定一个.
Paxos: 行的条件
是可靠的:
没有数据失和错误
/* 需要用Byzantine Paxos */
容忍:
消息(点不可达)
消息乱序
Proposer: paxos.
Acceptor: 储节点,接受、理和存消息.
Quorum(Acceptor的多数派) : n/2+1Acceptors.
Round1包含2段:Phase-1 & Phase-2
1 (rnd):
单调递增;后写出;全局唯一(用于区分Proposer);
Paxos: 概念
Acceptor看到的最大rnd (last_rnd):
Acceptor识别哪个proposer可以写。
Value (v): Acceptor接受的.
Value round number (vrnd):
Acceptor接受的v候的rnd
被确定的
有多数(多于半数)Acceptor接受了.
Paxos: 概念.
Paxos: Classic - phase 1
X
rnd=1
X
last_rnd=0, v=nil, vrnd=0
last_rnd=0, v=nil, vrnd=0..
Phase 1
1,1, -
---
Proposer X Acceptor 1,2,3
Acceptor收到phase-1
如果求中rndAcceptorlast_rnd小,绝请
求中的rnd保存到本地的last_rnd.
从此Acceptor只接受last_rndphase-2求。
返回答,上自己之前的last_rnd和之前已接受的v.
Paxos: Classic - phase 1.
X
rnd=1
X
Phase 1
1,1, -
---
Proposer X Acceptor 1,2,3
Proposer收到Acceptor回的答:
如果答中的last_rnd大于出的rnd: 退出.
从所有答中选择vrnd最大的v:
不能改(可能)确定的
如果所有答的v都是空,可以选择自己要写入v.
如果答不多数派,退出
last_rnd=0, v=nil, vrnd=0
last_rnd=0, v=nil, vrnd=0..
Paxos: Classic - phase 2
X
v="x", rnd=1
X
Accepted
Phase 2
1,1, -
1,x
1
1,x
1
-
Proposer X Acceptor 1,2,3
v=x, vrnd=1
Proposer:
phase-2rnd和上一步决定的v
Paxos: Classic - phase 2.
X
v="x", rnd=1
X
Accepted
Phase 2
1,1, -
1,x
1
1,x
1
-
Proposer X Acceptor 1,2,3
v=x, vrnd=1
Acceptor:
rnd不等于Acceptorlast_rnd
phase-2求中的v写入本地,v已接受的
last_rnd==rnd 没有其他Proposer在此程中写入
其他
Paxos: 栗子 1: Classic, 无冲突
X
rnd=1
X
last_rnd=0, v=nil, vrnd=0
X
v="x", rnd=1
X
Accepted
Phase 1
Phase 2
1,1, -
---
1,1, -
1,x
1
1,x
1
-
Proposer X Acceptor 1,2,3
v=x, vrnd=1
Paxos: 栗子 2.1: 解决并写冲突
X
Y
rnd=1
X
Phase 1 for X
rnd=2
OK, forget X
Phase 1 for Y
Y
X
Y
v="x", rnd=1
Fail
v="y",rnd=2
OK
Phase 2
Y
round=1
round=2
Time
2,y
2
1,x
1
2,y
2
2,1,x
1
2,
2,1,x
1
2,
2,1, 2,
1,1, -
1,1, -
---
Paxos: 栗子 2.2: X不会修改确定的v
X
rnd=3
X
v="y",vrnd=2;
v="x",vrnd=1;
choose 'y'
Phase 1
X
v="y",vrnd=3
Phase 2
round=3
2,y
2
1,x
1
2,y
2
3,y
2
3,x
1
2,y
2
3,y
2
3,x
1
2,y
2
X
OK
3,y
3
3,y
3
3,y
3
X只能选择v=“y”,因它可能
是一个被确定的
Paxos..其他
Learner角色:
Acceptorphase-3 到所有learner角色,learner知道
一个被确定了.
多数Proposer就是1Learner.
Livelock:
多个Proposer发对1运行paxos候,可能会互
相覆盖方的rnd,然后提升自己的rnd再次尝试,然后再次
生冲突,一直无法完成
Multi Paxos
将多个paxos例的phase-1合并到1RPC
使得paxos只需要运行phase-2即可。
:
chubby zookeeper megastore spanner
Fast Paxos
Proposer直接phase-2.
Fast Paxosrnd0.
0它一定小于任何一个Classic rnd ,所以可以在出冲突安全的回退
Classic Paxos.
Acceptor只在v是空才接受Fast phase-2
如果成冲突,回退到Classic Paxos,开始用一个 rnd >
0来运行。
但是Fast Paxos Classic Paxos高效
Fast Paxos 的多数派
--- - -
0,x
0
-
0,x
0
0,x
0
0,y
0
0,x
0
X
fast rnd=0
X
phase 2
OK
Y
fast rnd=0
phase 2
2/5; Fails
-
0,y
0
? ?
如果Fast的多数派也是 n/2+1 = 3:
当上Y发现冲突,回退到Classic:
Y无法确定哪个是可能被确定下来的:x
0
or y
0
解决方法是未确定的不占据n/2+1点中的多数派,因此:
→ Fast 的多数派必> n*¾;
→ Fast Paxos里的被确定的条件是被 n*¾+1 Acceptor接受.
Fast Paxos 的多数派.
Q = n*¾
可用性降低,因Fast Paxos需要更多的Acceptor来工作.
Fast Paxos 需要至少5Acceptors,才能容忍1Acceptor
可用.
Fast Paxos 4/5 Y 发现冲突
--- - -
0,x
0
-
0,x
0
0,x
0
0,x
0
0,y
0
0,x
0
0,x
0
0,x
0
0,x
0
2,y
0
0,x
0
0,x
0
2,x
0
2,x
0
2,x
2
0,x
0
0,x
0
2,x
2
2,x
2
X
fast rnd=0
X
phase 2
OK
Y
fast rnd=0
phase 2
1/5; Fail
Y
classic rnd=2
phase 1
OK, "x"
Y
phase 2
OK, writes "x"
Y3Acceptor中看到2x
0
因此Y须选择 x
0
,因 x
0
可能
1个被确定的.
y
0
不可能是1个被确定的,因
即使剩下的2Y没有系到的
Acceptor都接受了y
0
,也不会达
(5*¾ ) 的多数派。
Fast Paxos 4/5 X Y 都冲突
--- - -
0,x
0
0,x
0
0,x
0
0,y
0
0,y
0
1,x
0
1,x
0
1,x
0
0,y
0
0,y
0
1,x
0
1,x
0
2,y
0
2,y
0
2,x
0
X
fast rnd=0
X
phase 2
Conflict
Y
fast rnd=0
phase 2
Y
Conflict
0,x
0
0,x
0
0,x
0
0,y
0
0,y
0
X
classic rnd=1
phase 1
Y
classic rnd=2
phase 1
X
OK, only "x"
Y
OK, choose "y"
Y
phase 2
2,y
2
2,y
2
2,y
2
2,y
2
2,y
2
X
fail in phase 2
Note
phase-2, Acceptor可以接受 rnd >= last_rnd
Q&A
Thanks
drdr.xp@gmail.com
http://drmingdrmer.github.io
weibo.com: @drdrxp