前言
paxos用于保证分布式系统中, 各个节点的数据一致性问题
算法的组成部分
在该算法中, 分为 提议者, 接收者, 学习者 三种角色
提议者: 其实就是客户端, 用来向分布式系统中发送数据
接收者: 其实就是分布式系统的节点, 它们不仅要接收提议者的数据, 还要保证每个节点的数据都一致
学习者: 用来做数据冗余, 可以看作是分布式系统中的 slave 节点
假设不使用任何数据一致性算法
因为要保证所有节点的数据一致, 所以提议者每次有新的数据时都要向所有的接收者发送一份.
首先假设接收者一旦接收到提议者的数据就保存下来, 如果此时有多个提议者在发送数据, 而且存在网络波动, 那么它们的数据到达的时间将是乱序的, 那么肯定会造成各个接收者上最后保存下来的数据不尽相同, 来自于各个提议者, 此时分布式系统就处于数据不一致的境地.
使用paxos算法
paxos算法, 为了解决分布式系统各个节点的数据一致性问题
提议者向接收者写数据的过程分为两个阶段, 准备 和 接收
准备阶段
各个提议者都产生一个编号发给各个接收者, 各个接收者都选最大的编号给予响应, 因为编号越大代表数据越新
接收阶段
发送了小编号的提议者自然没有收到接收者的响应, 那么瞬间就明白了自己的数据不是最新的, 也就是本次写数据失败.
而对于发送了最大编号的提议者, 它将会收到大部分接收者的响应, 也就是收到大部分节点说 "大, 你这个大, 我们存你的数", 然后这个最大编号提议者就把自己的值发送给所有的接收者
接收者一看, 是这个最大编号对应的值, 就保存下来, 此时所有提议者节点都保存了最新的值 , 它们的数据是一致的
最后学习者也默默地备份下这个值, 如果此时接收者中少数还没更新到最新值, 就由学习者发给它最新的值保存下来.
paxos流程的通俗理解
paxos算法能够保持所有节点数据一致性的本质在于, 第一次的响应是用来确定最后要用哪个值, 然后没说上话的提议者一看不是自己就不再写数据了, 第二阶段就只剩下被选中的提议者, 相当于它干掉了其他提议者, 最后把自己的值写到各个节点.
分成两个步骤的目的就是单独用第一个步骤确定最后要的, 到第二步时才真正进行写数据