文章目录
分布式系统的数据一致性理论
一、 问题引入
1. 数据一致性理论出现的背景(拜占庭将军问题)
拜占庭帝国国土辽阔,有5个将军带领军队守卫疆土,现面临战争,需要5个将军共进退,那如何才能让他们能够达成一起进攻或者撤退的共识?
那简单的方法是5个将军进行投票,每个将军派出信使将自己的意见传达给其他的几位将军。对于每个将军而言算上自己的票数,只要进攻票数超过2票即可进攻,反之则撤退。
但这时候可能会出现以下几种情况:
【5个将军中会不会有奸细?】
比如其中一位将军是奸细,另外4位将军中,两个同意进攻而另外两个同意撤退。那么奸细给同意进攻的两位将军传达进攻的消息,给另外的两位同意撤退的将军传达撤退的消息,那么将会产生一种情况即:两位同意进攻的将军将会发起进攻而两位同意撤退的将军会撤退。最终的战争必然会失败。
【信使会不会被暗杀或者谋反?】
信使不可靠也将导致战争的失败。
2. 分布式系统中的“拜占庭将军问题”
将“拜占庭将军问题”引入到计算机世界,一个将军代表着计算机节点,那么将问题简化一下,即:
a) 不考虑将军中存在奸细这种情况,即假定计算机只有宕机而不处理请求的情况,但不会发送伪造信息。
b) 信使不会被策反,即信道会受到噪声影响而发生错误或因为中断而无法传输消息。
那么最终就是,在信道不可信、服务器节点出现错误或宕机而无法通信的情况下,该如何保证分布式系统的数据一致性?
二、 Paxos算法
针对上述问题,我们来介绍一下Paxos算法。
在介绍Paxos算法之前我们需要了解一下Lamport在论文中提出的一个故事,即Paxos岛,大致情况是:岛上所有的法令都是由议会的议员表决通过的。议员都身兼其他职位,在表决法令的时候不一定会出席议会。但好在兼职议员互相之间高度信任,且被表决的提案都会被通过(不会有人反对)。那么当岛屿需要颁布一个法令的时候,会召集议员进行投票表决,当投同意票的议员数量超过总数的一半的时候,该法令将会被通过。
将这个故事抽象出来,Paxos算法中包含三个角色:Proposer、Acceptor、Learner。
Basic-Paxos算法
1. 这三个角色的功能
Proposer:提出议案,用于投票表决。每个议案会有一个议案编号,记为n。
Acceptor:参与议案决策,对每个议案进行投票,需要注意的是,该角色收到编号是k的提案后,会先拿该该议案的编号k与本身缓存的议案编号m对比,如果k小于m则不予响应;如果k大于m则予以响应,但不会再接收比k小的请求。
Learner: 不会参与决策,只会将最终达成一致的提案记录下来。
【注】:Proposer