分布式系统一致性算法
2021-01-22 06:15
标签:选择 cap 系统 声明 答复 统一 就是 特性 失败 CAP理论 分布式系统一致性算法 标签:选择 cap 系统 声明 答复 统一 就是 特性 失败 原文地址:https://www.cnblogs.com/cnhk19/p/12890478.html
一致性(Consistency)
可用性(Availability)
分区容错性(网络分区)Partition tolerance
CAP理论的特点,就是CAP只能满足其中2条
CA(放弃P):将所有的数据放在一个节点。满足一致性、可用性。
AP(放弃C):放弃强一致性,用最终一致性来保证。
CP(放弃A):一旦系统遇见故障,受到影响的服务器需要等待一段时间,在恢复期间无法对外提供服务。
2P理论(two phase commit)
二段提交(RDBMS(传统关系型数据库)经常就这种机制,保证强一致性)
提交步骤:
阶段1:提交事务请求(投票阶段,任何一个结点失败,不能继续进行提交)
阶段2:执行事务提交(commit、rollback。任何一个结点失败 rollback)
3P理论(three phase commit)
阶段1:是否可以进行事务提交
阶段2: 提交事务请求
阶段3:执行事务提交
怎么保证事务一定提交?
事务管理器将,所有数据结点list存储,循环执行操作,设立flag标记状态。
根据flag状态,执行操作或回滚。
BASE理论
基本可用(bascially available):在分布式系统出现,允许损失部分可用性(服务降级、页面降级)
软状态(soft state):允许分布式系统出现中间状态。而且中间状态不影响系统的可用性。
最终一致性(Eventually consistent):data replications经过一段时间达到一致性。
Paxos算法
Paxos算法是莱斯利·兰伯特(英语:Leslie Lamport,LaTeX中的“La”)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法。
Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就是Paxos,其它的算法都是残次品。
基于拜占庭将军问题解析:
分为以下两种角色:
proposer:参谋1,参谋2(提交者)
acceptor: 将军1,将军2,将军3(决策者)
1、先后提议的场景
参谋1发起提议,派通信兵带信给3个将军,内容为(编号1)
3个将军收到参谋1的提议,由于之前还没有保存任何编号,因此把(编号1)保存下来,避免遗忘;同时让通信兵带信回去,内容为(ok)
参谋1收到至少2个将军的回复,再次派通信兵带信给3个将军,内容为(编号1,进攻时间1)
3个将军收到参谋1的时间,把(编号1,进攻时间1)保存下来,避免遗忘;同时让通信兵带信回去,内容为(Accepted)
参谋1收到至少2个将军的(Accepted)内容,确认进攻时间已经被大家接收;
参谋2发起提议,派通信兵带信给3个将军,内容为(编号2)
3个将军收到参谋2的提议,由于(编号2)比(编号1)大,因此把(编号2)保存下来,避免遗忘;又由于之前已经接受参谋1的提议,因此让通信兵带信回去,内容为(编号1,进攻时间1)
参谋2收到至少2个将军的回复,由于回复中带来了已接受的参谋1的提议内容,参谋2因此不再提出新的进攻时间,接受参谋1提出的时间
2、交叉提交场景
1.参谋1发起提议,派通信兵带信给3个将军,内容为(编号1);
2.3个将军的情况如下
a)将军1和将军2收到参谋1的提议,将军1和将军2把(编号1)记录下来,如果有其他参谋提出更小的编号,将被拒绝;同时让通信兵带信回去,内容为(ok)
b)负责通知将军3的通信兵被抓,因此将军3没收到参谋1的提议
3.参谋2在同一时间也发起了提议,派通信兵带信给3个将军,内容为(编号2)
4.3个将军的情况如下
a)将军2和将军3收到参谋2的提议,将军2和将军3把(编号2)记录下来,如果有其他参谋提出更小的编号,将被拒绝;同时让通信兵带信回去,内容为(ok)
b)负责通知将军1的通信兵被抓,因此将军1没收到参谋2的提议
5.参谋1收到至少2个将军的回复,再次派通信兵带信给有答复的2个将军,内容为(编号1,进攻时间1)
6.2个将军的情况如下
a)将军1收到了(编号1,进攻时间1),和自己保存的编号相同,因此把(编号1,进攻时间1)保存下来;同时让通信兵带信回去,内容为(Accepted)
b)将军2收到了(编号1,进攻时间1),由于(编号1)小于已经保存的(编号2),因此让通信兵带信回去,内容为(Rejected,编号2)
7.参谋2收到至少2个将军的回复,再次派通信兵带信给有答复的2个将军,内容为(编号2,进攻时间2)
8.将军2和将军3收到了(编号2,进攻时间2),和自己保存的编号相同,因此把(编号2,进攻时间2)保存下来,同时让通信兵带信回去,内容为(Accepted)
9.参谋2收到至少2个将军的(Accepted)内容,确认进攻时间已经被多数派接受
10.参谋1只收到了1个将军的(Accepted)内容,同时收到一个(Rejected,编号2)
参谋1重新发起提议,派通信兵带信给3个将军,内容为(编号3)
11.3个将军的情况如下
a)将军1收到参谋1的提议,由于(编号3)大于之前保存的(编号1),因此把(编号3)保存下来;由于将军1已经接受参谋1前一次的提议,因此让通信兵带信回去,内容为(编号1,进攻时间1)
b)将军2收到参谋1的提议,由于(编号3)大于之前保存的(编号2),因此把(编号3)保存下来;由于将军2已经接受参谋2的提议,因此让通信兵带信回去,内容为(编号2,进攻时间2)
c)负责通知将军3的通信兵被抓,因此将军3没收到参谋1的提议
12.参谋1收到了至少2个将军的回复,比较两个回复的编号大小,选择大编号对应的进攻时间作为最新的提议;参谋1再次派通信兵带信给有答复的2个将军,内容为(编号3,进攻时间2)
13.将军1和将军2收到了(编号3,进攻时间2),和自己保存的编号相同,因此保存(编号3,进攻时间2),同时让通信兵带信回去,内容为(Accepted)
14.参谋1收到了至少2个将军的(accepted)内容,确认进攻时间已经被多数派接受。
————————————————
版权声明:本文为CSDN博主「吴风斌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wuxians/java/article/details/81275441