图解分布式一致性协议paxos 20150311
TRANSCRIPT
2015.03王先明
图解分布式⼀一致性协议Paxos
1分布式事务
2Paxos 算法
3Zab 应⽤用
分布式事务1
一台服务器提供数据服务
性能不足以提供服务?
服务器宕机? 服务器掉电?服务器断网? 服务器硬盘坏?
响应时间?吞吐量?
2. 数据镜像:所有的服务器上都有相同的数据
扩展数据服务常用手段
1. 数据分区:把数据分块分布在不同的服务器上
最经典的Case:“A帐号向B帐号汇钱”
6. 把余额结果写回B帐号中
1. 从A帐号中把余额读出来
2. 对A帐号余额做减法操作
3. 把余额结果写回A帐号中 4. 从B帐号中把余额读出来
5. 对B帐号余额做加法操作
Partition Tolerance
Consistency Availability
?
AC
ID
BASE
一致性级别
2. 单调一致性(monotonic consistency)
3. 会话一致性(session consistency)
1. 强一致性(strong consistency)
4. 最终一致性(eventual consistency)
5. 弱一致性(weak consistency)
网络延迟/分区恢复/补偿错误
并发更新
一致性为什么难
主从异步复制Client Slave. 1 Slave. 2Master
1. 写请求2. 写⼊入磁盘
3. 回应
4.1. 从主库复制到从库
4.2. 从主库复制到从库
5.1. 回应
5.2. 回应
主从同步复制Client Slave. 1 Slave. 2Master
1. 写请求2. 写⼊入磁盘
3.1. 从主库复制到从库
3.2. 从主库复制到从库
5. 回应
4.1. 回应
4.2. 回应
主从半同步复制Client Slave. 1 Slave. 2Master
1. 写请求2. 写⼊入磁盘
3.1. 从主库复制到从库
3.2. 从主库复制到从库
4. 回应
5.1. 回应
5.2. 回应
多数派写Client Node. 2 Node. 3Node. 1
1.1. 写请求
2.1. 回应
1.2. 写请求
1.3. 写请求
2.2. 回应
2.3. 回应
多数派写 - 并发更新X 2..1 nil..02..1 Y
get i
X 3..2 3..22..1set i+1
3..2 3..22..1 Yset i+2
X 5..3 5..32..1get i
i=5?
i=2
i=3
get ii=2
i=4
更新丢失
Paxos 算法2
两阶段提交
Cohort Cohort
QUERY TO COMMIT
Coordinator
Request
The flow of message with protocol (Two-Phase Commit )
An * next to the record type means that the record is forced to stable storage.
QUERY TO COMMIT
VOTE YES/NOVOTE YES/NO prepare*/abort*
COMMIT/ROLLBACK COMMIT/ROLLBACKcommit*/abort*
ACKNOWLEDGMENT ACKNOWLEDGMENT
prepare*/abort*
commit*/abort* commit*/abort*
三阶段提交
Cohort Cohort
canCommit?
Coordinator
Request
yes
haveCommitted
Uncertain Timeout cause abort
Committed
Soliciting Votes…canCommit?
yes Uncertain Timeout cause abort
preCommit
ack
preCommit
ack
Commit authorized Timeout cause abort
The flow of message with protocol (Three-Phase Commit )
An * next to the record type means that the record is forced to stable storage.
Prepare to commit Timeout cause abort
Prepare to commit Timeout cause abort
doCommitdoCommit Finalizing commit Timeout cause abort
Done CommittedhaveCommitted
拜占庭将军(Byzantine Generals)
2. 一般假设整个系统中发生故障的服务器(拜占庭服务器)不超过F台,且每个请求满足两个指标
1.1. 所有非拜占庭服务器使用相同的输入信息,产生一致的结果
1. 拜占庭容错系统是指在一个拥有N台服务器的系统中,整个系统对于每一个请求满足两个条件
1.2. 信息正确输入,那么所有非拜占庭服务器必须接受这个信息,并计算相应的结果
2.1. 安全性:任何已经完成的请求都不会被更改,且可以被之后请求看到
2.2. 活性:可以执行非拜占庭客户端的请求,且不会被任何因素影响导致不能执行
SUCCESSFAILURE网络服务3种状态之 SUCCESS | FAILURE
TIMEOUTNO!
NO!
NO!
网络服务3种状态之 噩梦般的TIMEOUT
那么,每个节点最后都能得到一致的状态
在分布式数据库系统中,假设1. 每个节点的初始状态一致
2. 每个节点都执行相同的操作序列
I WANT YOU
Proposers Acceptors
Phase 1
1) Choose new proposal number n 2) Broadcast Prepare(n) to all servers
3) Respond to Prepare(n): if n > maxN then
maxN = n return (acceptedN, acceptedV)
Phase 2
4) When responses received from majority: if any acceptedV returned then
replace v with acceptedV for highest acceptedN 5) Broadcast Accept(n, v) to all servers
6) Respond to Accept(n, v): if n >= maxN then
maxN = n acceptedN = n acceptedV = v return (maxN)
7) When responses received from majority: v is chosen
Acceptors must record maxN, acceptedN and acceptedV on stable storage (disk)
maxN=0
Paxos Basic - Phase1
0, nil 0, nil0, nilN=1
X
acceptedN=0acceptedV=nil
1, nil 0, nil1, nil
Proposer
X
Acceptor
maxN=1
maxN=0
3) Respond to Prepare(n): if n > maxN then
maxN = n return (acceptedN, acceptedV)
1) Choose new proposal number n 2) Broadcast Prepare(n) to all servers
maxN=0
4) When responses received from majority: if any acceptedV returned then
replace v with acceptedV for highest acceptedN 5) Broadcast Accept(n, v) to all servers
Paxos Basic - Phase2
0, nil 0, nil0, nil
X 1, any 0, nil1, any
Proposer
X
Acceptor
maxN=1
6) Respond to Accept(n, v): if n >= maxN then
maxN = n acceptedN = n acceptedV = v return (maxN)
7) When responses received from majority: v is chosen
maxN=0
acceptedN=1acceptedV=any
maxN=1
acceptedN=1
maxN=1
maxN=0
Paxo
s B
asic
- 并
发更
新
2, nil 2, nil1, any1X
maxN=2
acceptedN=1acceptedV=any1
maxN=1
Y
Proposer
0, nil 0, nil0, nilN=1
Proposer
X
Acceptor
maxN=0
X
acceptedN=0acceptedV=nil
1, nil 0, nil1, nil
maxN=1
maxN=0
1, nil 0, nil1, nil
maxN=1
N=2
Y
maxN=2
2, nil 2, nil1, nilacceptedN=1
acceptedV=nilacceptedN=2
acceptedV=nil
2, nil 2, nil1, any1
maxN=2maxN=1
maxN=2
2, any2 2, any21, any1
maxN=2maxN=1
Y
YacceptedN=2
acceptedN=2acceptedV=any2
P1 for X
P1 for Y
P2 for X
P2 for Y
3, any3 2, any23, any3
maxN=2maxN=3
Proposer CAcceptor A
maxN=3
2, any2 2, any23, any3
maxN=2maxN=1
Acceptor C Acceptor E
XtimeoutX
Proposer EProposer A
一条日志在 A/C 上持久化成功,已经形成多数派,然后C宕机
一条日志只在 A 上持久化成功,超时未形成多数派,然后C宕机
最终的状态都是 A 上有这条日志,E 上没有,怎么处理?
最大 Commit 原则
Zab 应⽤用3
Zookeeper 保证
2. 原子性:更新要么成功,要么失败,不会出现部分更新
3. 单一性:无论客户端连接哪个Server,都会看到同一个视图
1. 顺序一致性:按照客户端发送请求的顺序更新数据
4. 可靠性:一旦数据更新成功,将一直保持,直到新的更新
5. 及时性:客户端会在一个确定的时间内得到最新的数据
Zookeeper 服务过程Zookeeper Services
Follower Leader Follower
Client Client Client Client Client Client
write
read read read read read
Server Server Server
Zookeeper 状态同步
Leader Follower2. Leader确定同步点,发送同步消息
3. 完成同步点,通知Leader,并修改自己状态
1. Follower连接Leader,发送最大zxid
Zab广播模式
Follower Follower
Propose
Leader
Request
Commit
ACK
Propose
Commit
ACK
The flow of message with protocol
Zab广播模式Follower
Leader
Follower
Follower
Follower
FollowerClient
Zookeeper Ensemble
Server: Leader && Follower
1. request
6. response
2. request
5. Commit
4. ack
3. Propose
Zab广播模式
两阶段提交
VS.
(Two-Phrase Commit)
Follower 工作流程
向Leader发送请求 /接收Leader回应
接收Client请求
PING REVALIDATE SYNC/UPTODATE Proposal
Y判断是否写请求
返回结果给Client
开始
N
Leader 工作流程
开始
请求类型接收Learner请求,是否同步
恢复数据(恢复模式)
N
与Learner同步
Y
PING
REQUEST
ACK
REVALIDATE
加入处理队列
更新session时间(延长)
发起Leader
选举
保持与Follower的心跳
Y
是否有超过半数的Follower同意
Commit
是否有超过半数的Follower
N
Y
Zookeeper 谁是Leader?Zab 协议(Zookeeper Atomic Broadcast Protocol) 当任一Client通过某集群节点向集群发起读写请求时,该集群节点会向Leader节点发出投
票请求,如果投票通过(超过一半节点同意)则该请求被执行,否则该请求被驳回。通过Paxos
算法,Zookeeper的保持了数据模型的一致性,同时保持了任何操作的原子性。
Zab恢复模式Server1
Server2
X
Server3
C1
P1 P2
P1 P2
C1 P3 C2
P1 P2
P1 P2
Zab恢复模式Server1
Server2
Server3
X
P10000001 P10000002 C10000001
C1 P3 C2
P1 P2
P1 P2
C1 C2
P10000001 P10000002 C10000001
C1 C2
Paxos一致性Leader Server1
Follower Server2
Follower Server3
P1 <01, “/zk”>
P2 <02, “/a”>P3 <03, “/a/b”>
P1P1
P1 <01, “/zk”>
P1 <01, “/zk”>
< t , v >
Zxid
事务epoch counter
高32位 低32位
XX
Paxos一致性Leader Server1
Follower Server2
Leader Server3
P1 <01, “/zk”>
P2 <02, “/a”>P3 <03, “/a/b”>
P2i
P1 <01, “/zk”>
P2i <02, “/c”>
P1 <01, “/zk”>
P2i <02, “/c”>
< t , v >
Zxid
事务epoch counter
高32位 低32位
XXX
Paxos一致性Leader Server1
Follower Server2
Leader Server3
P1 <01, “/zk”>
P2 <02, “/a”>P3 <03, “/a/b”>
P3
P1 <01, “/zk”>
P2i <02, “/c”>P3 <03, “/a/b”>
P1 <01, “/zk”>
P2i <02, “/c”>
< t , v >
Zxid
事务epoch counter
高32位 低32位
X
Zab一致性Leader Server1
Follower Server2
Follower Server3
P1 <01, “/zk”>
P2 <02, “/a”>P3 <03, “/a/b”>
P1P1
P1 <01, “/zk”>
P1 <01, “/zk”>
< t , v >
Zxid
事务epoch counter
高32位 低32位
XX
Zab一致性Leader Server1
Follower Server2
Leader Server3
P1 <01, “/zk”>
P2 <02, “/a”>P3 <03, “/a/b”>
P2i
P1 <01, “/zk”>
P2i <10, “/c”>
P1 <01, “/zk”>
P2i <10, “/c”>
< t , v >
Zxid
事务epoch counter
高32位 低32位
XXX
Zab一致性Leader Server1
Follower Server2
Leader Server3
P1 <01, “/zk”>
P2 <02, “/a”>P3 <03, “/a/b”>
P3
P1 <01, “/zk”>
P2i <10, “/c”>
P1 <01, “/zk”>
P2i <10, “/c”>
< t , v >
Zxid
事务epoch counter
高32位 低32位
X
Leader 选举 - Basic Paxos
投票开始
N
Y
Y
N
投票结束
向集群(包括自己)发起询问
Y
N
第一次询问? 将自已(id, zxid)作为Leader推荐给集群
接收询问,验证是否自己发起?
获取对方id(myid),存入已询问列表,获取对方提议的Leader信息(id,zxid),存入当前投票记录表,统计选举结果,获取最大的zxid,并将zxid所示的Server作为下次推
荐的Leader
zxid是否有超过半数支持
将zxid所示的Server作为当前的Leader,并根据投票结果修改
自己状态
投票开始
Y判断是否已经选出Leader
N
将自已epoch+1,推荐自己(zxid,id)作为
Leader发送给集群进入下一个周期
投票结束
N
Y
判断自己当前epoch是否合法
更新自己epoch为对方推荐的zxid,epoch,id。
向对方发送ACK
N
Y
一个周期内是否收到其它节点回复
Leader 选举 - Fast Paxos
To Be Continued…
Thanks