分布式一致性算法是用于在分布式系统中确保数据一致性的算法。在分布式计算环境中,数据通常会分布在多个节点中,这些节点可能由于网络延迟、故障或其他原因而导致数据的不一致。分布式一致性算法就是为了确保分布式系统中的所有节点数据最终都能达到一致的状态。
1、初识Paxos算法
分布式一致性算法可以分为强一致性和弱一致性;Paxos是强一致性算法(强一致性是指在任何时刻系统中的任意节点都可以看到相同的数据,并且对数据的任何操作都会立即反映在系统的其他部分)
图片
上图中有三个节点,客户端1和客户端2要修改节点的值,那么Paxos算法可以保证所有的节点的value值都是一致的(要么所有节点都是value1,要么所有节点是value2,不会出现一部分节点是value1,另一部节点是value2)。
Paxos算法中涉及到三个角色,分别是提议者、接受者和学习者,这三个角色的作用如下:
(1)提议者:发起提案,只要提议者发的提案被半数以上接受者接受,提议者就认为该提案里的value被选定了。
(2)接受者:只要接受者接受了某个提案,接受者就认为该提案里的 value被选定了。接收者承诺不会接受比自己已通过的提案编号要小的任何提案。
(3)学习者:接受者告诉学习者哪个value被选定,学习者就认为那个 value被选定。
2、Paxos算法的工作流程
2.1 准备阶段
提议者是客户端,接收者是集群中的节点,下图是的客户端1和客户端2在准备阶段发送请求到集群的各节点上:
图片
在准备阶段提议者(客户端)向接受者(集群中各节点)发送请求时会带上自己需要提议的提案编号(如客户端1的提案编号是0,客户端2的提案编号是3),这一个阶段提议者不会带上具体的value值。
假设节点A和节点B先接收到了客户端1的请求,节点C先接受到客户端2的请求,并且节点A、节点B、节点C都是首次接收提案,那么三个节点对请求做出响应如下图所示:
图片
节点A收到了客户端1的请求后,由于节点A当前并没有接受任何的其他提案,所以节点A会响应客户端1的结果是尚无任何提案,同时节点A在返回尚无提案的时候也会做一个不会再响应任何的小于当前提案编号(当前的提案编号是0)的提案承诺。同理,节点B和节点C也是同样的过程。
客户端1完成与节点A和节点B的通信,但是还没有发请求给节点C,当客户端1发送请求给节点C的时候,节点C会作出响应,但是节点C已经响应了客户端2的提案(当前节点C提案的编号是3)客户端1的提案编号是0,由于3>0,根据之前的承诺(不会接受比当前提案小的请求),节点C不会响应客户端1的请求而是直接丢弃掉,如下图所示:
图片
客户端2完成与节点C的通信,随后与节点A、节点B进行通信,接收者承诺不接受小于当前提案编号的任何提案,由于客户端2的提案编号是3,3>0,所以客户端2请求过来之后节点A、节点B依然正常的响应,响应的结果是尚未提案,如下图所示:
图片
Paxos算法的准备阶段就完成了,因为客户端收到了集群中大多数节点的响应。
2.2 接收阶段
在准备阶段完成之后,接下来就是发送正式请求了,客户端会带上提案编号和对应的value值,客户端1就将自己的提案编号以及提案值发送到集群中的各节点,同样的客户端2也将自己的提案编号和提案值发送给各节点,发送完成之后集群中各节点就需要做出响应,如下图所示:
图片
客户端1的请求会被三个节点全部的抛弃,因为各节点已经约定不会接受比提案编号3小的提案编号,客户端2发送过来的请求会被正常的接受,这个时候就完成了节点中value值的同步。
如果有学习者,就将当前的这个结果通知给学习者,学习者发现大多数节点都通过这个提案,那么它也会通过这个提案,将这个值进行存储。
3、部分节点已接受提案,新提议者请求的处理
假设节点A、节点B已通过的提案编号为3的提案,节点C还没有接受提案,现在有客户端3携带提案编号6来请求,如下图所示:
图片
节点A、节点B会返回其接受的提案编号和提案值(如提案【3,xia】)给客户端3,节点C由于没有接受到提案,返回结果是尚无提案,如下图所示:
图片
客户端3会根据集群中响应的最大提案编号来重新设置value,也就是节点A、节点B已通过的提案的编号是3,value为xia;那么客户端3将提案内容中提案编号改成自己的编号,(【3,xia】修改为【6,xia】)修改完成之后客户端3再将这个结果发送给集群中的各个节点,如下所示:
图片
集群中的各节点收到客户端3的提案之后都会做出响应,由于客户端3中的提案编号为6,所以节点都会接受这个提案请求并且全部通过。
总结:
(1)Paxos是一种强一致性的分布式算法,用于确保分布式系统中的节点数据一致。
(2)Paxos算法主要有准备请求阶段和接受阶段,并且承诺不会接受比当前提案编号小的请求。