分布式协议与算法实战——BasicPaxos(笔记)
在过去⼏⼗年⾥,Paxos算法基本上是分布式共识的代名词,因为当前最常⽤的⼀批共识算法都是基于它改进的。⽐如,Fast Paxos 算法、Cheap Paxos 算法、Raft 算法、ZAB 协议等等。
兰伯特提出的 Paxos 算法包含 2 个部分:
Basic Paxos 算法:描述细心造句
的是多节点之间如何就某个值(提案 Value)达成共识;
Multi-Paxos 思想:描述的是执⾏多个 Basic Paxos 实例,就⼀系列值达成共识。
Basic Paxos算法
三种⾓⾊
提议者(Propor):提议⼀个值,⽤于投票表决。在绝⼤多数场景中,集群中收到客户端请求的节点,才是提议者。这样做的好处是,对业务代码没有⼊侵性,也就是说,我们不需要在业务代码中实现算法逻辑,就可以像使⽤数据库⼀样访问后端的数据。
接受者(Acceptor):对每个提议的值进⾏投桃胶孕妇可以吃吗
票,并存储接受的值。 ⼀般来说,集群中的所有节点都在扮演接受者的⾓⾊,参与共识协商,并接受和存储数据。
学习者(Learner):被告知投票的结果,接受达成共识的值,存储保存,不参与投票的过程。⼀般来说,学习者是数据备份节点,⽐如“Master-Slave”模型中的 Slave,被动地接受数据,容灾备份。
注:⼀个节点(或进程)可以⾝兼多个⾓⾊。
⾓⾊的本质
提议者代表的是接⼊和协调功能,收到客户端请求后,发起⼆阶段提交,进⾏共识协商;
接受者代表投票协商和存储数据,对提议的值进⾏投票,并接受达成共识的值,存储保存;
学习者代表存储数据,不参与共识协商,只接受达成共识的值,存储保存。
达成共识的过程
在 Basic Paxos 中,兰伯特也使⽤提案代表⼀个提议。在提案中包括提案编号和提议值。为了⽅便演⽰,使⽤[n, v]表⽰⼀个提案,其中 n 为提案编号,v 为提议值。
准备(Prepare)阶段
(1)客户端 1、2 作为提议者,分别向所有接受者发送包含提案编号的。在准备请求中是不需要指定提议的值,只需要携带提案编号。
准备请求:
(2)当节点 A、B 收到提案编号为 1 的准备请求,节点 C 收到提案编号为 5 的准备请求后,将进⾏这样的处理:
由于之前没有通过任何提案,所以节点 A、B 将返回⼀个 “尚⽆提案”的响应。也就是说节点 A 和 B 在告诉提议者,之前没有通过任何提案,并承诺以后不再世界著名大学
响应提案编号⼩于等于 1 的准备请求,不会通过编号⼩于 1 的提案;节点 C 也将返回⼀个 “尚⽆提案”的响应,并承诺十二英文怎么读
以后不再响应提案编号⼩于等于 5 的准备请求,不会通过编号⼩于 5 的提案。
(3)当节点 A、B 收到提案编号为 5 的准备请求,和节点 C 收到提案编号为 1 的准备请求的时候,将进⾏这样的处山清水秀造句
理过程:
当节点 A、B 收到提案编号为 5一溜烟的意思
的准备请求的时候,因为提案编号 5 ⼤于它们之前响应的准备请求的
提案编号 1,且两个节点都没有通过任何提案,所以它将返回⼀个 “尚⽆提案”的响应,并承诺以后不再响应提案编号⼩于等于 5 的准备请求,不会通过编号⼩于 5 的提案。
当节点 C 收到提案编号为 1 的准备请求的时候,放鞭炮的简笔画
由于提案编号 1 ⼩于它之前响应的准备请求的提案编号 5,所以丢弃该准备请求,不做响应。
接受(Accept)阶段
⾸先客户端 1、2 在收到⼤多数节点的准备响应之后,会分别发送接受请求:
当客户端 1 收到⼤多数的接受者(节点 A、B)的准备响应后,根据响应中提案编号最⼤的提案的值,设置接受请求中的值。因为该值在来⾃节点 A、B 的准备响应中都为空,所以就把⾃⼰的提议值 3 作为提案的值,发送接受请求[1, 3]。
当客户端 2 收到⼤多数的接受者的准备响应后(节点 A、B 和节点 C),根据响应中提案编号最⼤的提案的值,来设置接受请求中的值。因为该值在来⾃节点 A、B、C 的准备响应中都为空(,所以就把⾃⼰的提议值 7 作为提案的值,发送接受请求[5, 苏杭特产
7]。
三个节点收到 2 个客户端的接受请求时,会进⾏这样的处理:
当节点 A、B、C 收到接受请求[1, 3]的时候,由于提案的提案编号 1 ⼩于三个节点承诺能通过的提案的最⼩提案编号 5,所以提案[1, 3]将被拒绝。
当节点 A、B、C 收到接受请求[5, 7]的时候,由于提案的提案编号 5 不⼩于三个节点承诺能通过的提案的最⼩提案编号 5,所以就通过提案[5, 7],也就是接受了值 7,三个节点就 X 值为 7 达成了共识。
如果集群中有学习者,当接受者通过了⼀个提案时,就通知给所有的学习者。当学习者发现⼤多数的接受者都通过了某个提案,那么它也通过该提案,接受该提案的值。
总结
Basic Paxos 是通过⼆阶段提交的⽅式来达成共识的。
除了共识,Basic Paxos 还实现了容错,在少于⼀半的节点出现故障时,集群也能⼯作。它不像分布式事务算法那样,必须要所有节点都同意后才提交操作,因为“所有节点都同意”这个原则,在出现节点故障的时候会导致整个集群不可⽤。也就是说,“⼤多数节点都同意”的原则,赋予了清咽利喉
Basic Paxos 容错的能⼒,让它能够容忍少于⼀半的节点的故障。
提案编号的⼤⼩代表着优先级,根据提案编号的⼤⼩,接受者保证三个承诺,具体来说:如果准备请求的提案编号,⼩于等于接受者已经响应的准备请求的提案编号,那么接受者将承诺不响应这个准备
请求;如果接受请求中的提案的提案编号,⼩于接受者已经响应的准备请求的提案编号,那么接受者将承诺不通过这个提案;如果接受者之前有通过提案,那么接受者将承诺,会在准备请求的响应中,包含已经通过的最⼤编号的提案信息。