1. 概述
Google Chubby 的作者Mike Burrows:“There is only one consensus protocol, and that's Paxos”-all other approaches are just broken versions of Paxos
意即:世界上只有一种一致性算法,那就是Paxos(帕克索斯),所有其它一致性算法都是Paxos算法的不完整版!
Paxos是为了解决分布式环境下一致性的问题而提出的算法,因chubby而声名大噪。
作者Leslie Lamport由于首次发表关于paxos的论文“The Part-Time Parliament”晦涩难懂,于是2001年发表“Paxos Made Simple”
并在introduction中说道:
“The Paxos algorithm for implementing a fault-tolerant distributed system has been regarded as difficult to understand, perhaps because the original presentation was Greek to many readers [5]. In fact, it is among the simplest and most obvious of distributed algorithms.”
a. Only a value that has been proposed may be chosen,
b. Only a single value is chosen
c. A process never learns that a value has been chosen unless it actually has been.
例如,在分布式环境下,多台客户端都想要获取一把锁,如何解决锁的归属问题。
可以把问题抽象为在分布式环境下,如何给不确定的元素赋值的问题。
Google Chubby 的作者Mike Burrows:“There is only one consensus protocol, and that's Paxos”-all other approaches are just broken versions of Paxos
意即:世界上只有一种一致性算法,那就是Paxos(帕克索斯),所有其它一致性算法都是Paxos算法的不完整版!
Paxos是为了解决分布式环境下一致性的问题而提出的算法,因chubby而声名大噪。
作者Leslie Lamport由于首次发表关于paxos的论文“The Part-Time Parliament”晦涩难懂,于是2001年发表“Paxos Made Simple”
并在introduction中说道:
“The Paxos algorithm for implementing a fault-tolerant distributed system has been regarded as difficult to understand, perhaps because the original presentation was Greek to many readers [5]. In fact, it is among the simplest and most obvious of distributed algorithms.”
2. 问题
a. Only a value that has been proposed may be chosen,
b. Only a single value is chosen
c. A process never learns that a value has been chosen unless it actually has been.
例如,在分布式环境下,多台客户端都想要获取一把锁,如何解决锁的归属问题。
可以把问题抽象为在分布式环境下,如何给不确定的元素赋值的问题。
3. 解决方案
1)Master/slaver
优点:实现简单。
缺点:单点故障。
2)Multi-master
Multi-master指一个系统存在多个master
优点:解决了单点故障。
缺点:不易实现一致性
3)2PC
优点:实现简单。
缺点:所有参与者需要阻塞(block),throughput低;无容错机制,一节点失败则整个事务失败。
paxos算法和以上三种方式对比:
4. Paxos算法描述
概念:
instance(实例):一次Paxos算法执行。
proposal(议案):未经批准的决议称为议案
value(决议):被最终批准通过的议案中的value称为决议
角色:
Proposer(提案者):提出议案
Acceptor(批准者):审批议案
Leaner(学习者):学习决议
问题
定义好概念和角色后,可以更精确的定义问题:
1)决议(value)只有在被 proposers 提出后才能批准;
2)在一次 Paxos 算法的执行实例中,只批准一个 Value;
3)learners 只能获得被批准的 Value。
约束:
1)一个批准者必须接受他收到的第一个议案。
2) 提出一个编号为n具有值v的议案的前提是:存在一个多数派,要么他们中没有人批准过编号小于n的任何提案,要么他们批准的提案中编号小于n的最大的提案值是v
通过一个决议分为两个阶段:
prepare 阶段:
1)提案者选择一个议案编号 n 并将 prepare 请求发送给批准者中的一个多数派;
2)批准者收到 prepare 消息后,如果提案的编号大于它已经回复的所有 prepare 消息,则批准者将自己上次的批准回复给提案者,并承诺不再批准小于 n 的提案;
批准阶段:
1)当一个提案者收到了多数批准者对 prepare 的回复后,就进入批准阶段。它要向回复 prepare 请求的批准者发送批准的请求,包括编号 n 和根据约束2 决定的 value。
2)在不违背自己向其他提案者的承诺的前提下,批准者收到批准请求后即批准这个请求
算法保证在任何阶段被打断,都能保证最终的正确性。
参考:
paper:Paxos Made Simple
http://zh.wikipedia.org/zh-cn/Paxos%E7%AE%97%E6%B3%95
http://www.cnblogs.com/ychellboy/archive/2009/12/28/1634443.html
概念:
instance(实例):一次Paxos算法执行。
proposal(议案):未经批准的决议称为议案
value(决议):被最终批准通过的议案中的value称为决议
角色:
Proposer(提案者):提出议案
Acceptor(批准者):审批议案
Leaner(学习者):学习决议
问题
定义好概念和角色后,可以更精确的定义问题:
1)决议(value)只有在被 proposers 提出后才能批准;
2)在一次 Paxos 算法的执行实例中,只批准一个 Value;
3)learners 只能获得被批准的 Value。
约束:
1)一个批准者必须接受他收到的第一个议案。
2) 提出一个编号为n具有值v的议案的前提是:存在一个多数派,要么他们中没有人批准过编号小于n的任何提案,要么他们批准的提案中编号小于n的最大的提案值是v
通过一个决议分为两个阶段:
prepare 阶段:
1)提案者选择一个议案编号 n 并将 prepare 请求发送给批准者中的一个多数派;
2)批准者收到 prepare 消息后,如果提案的编号大于它已经回复的所有 prepare 消息,则批准者将自己上次的批准回复给提案者,并承诺不再批准小于 n 的提案;
批准阶段:
1)当一个提案者收到了多数批准者对 prepare 的回复后,就进入批准阶段。它要向回复 prepare 请求的批准者发送批准的请求,包括编号 n 和根据约束2 决定的 value。
2)在不违背自己向其他提案者的承诺的前提下,批准者收到批准请求后即批准这个请求
算法保证在任何阶段被打断,都能保证最终的正确性。
参考:
paper:Paxos Made Simple
http://zh.wikipedia.org/zh-cn/Paxos%E7%AE%97%E6%B3%95
http://www.cnblogs.com/ychellboy/archive/2009/12/28/1634443.html