技术编程|分布式一致性算法,你确定不了解一下( 三 )
三阶段缺点: 数据不一致:参与者收到preCommit请求 , 此时如果出现网络分区 , 协调者与参与者之间无法进行正常网络通信 , 参与者在超时之后还是会进行事务提交 , 就会出现数据不一致 。
所以2PC、3PC各有优缺点 , 可根据实际业务场景进行选择 。 既然2PC、3PC都会产生数据不一致 。 下面我们来看一看分布式领域常用的一致性算法 。 Paxos算法
Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的基于消息传递且具有高度容错特性的一致性算法 , 是目前公认的解决分布式一致性问题最有效的算法之一 。Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致 。
Paxos以及下面的RAFT都假设不存在拜占庭将军问题 , 只考虑节点宕机、网络分区、消息不可靠等问题 。 属于CFT(Crash Fault Tolerance)算法 。
系统中有三种角色proposers , acceptors , 和 learners 。 可以一个节点多个角色 。
proposers 提出提案 , 提案信息包括提案编号和提议的 value;
acceptor 收到提案后可以接受(accept)提案 , 若提案获得多数派(majority)的 acceptors 的接受 , 则称该提案被批准(chosen);
learners 只能“学习”被批准的提案 。
多数派:指 n / 2 +1。 n为总节点数量 。
Paxos算法分为两个阶段 。 具体如下:
阶段一: Proposer选择一个提案编号N , 然后向半数以上的Acceptor发送编号为N的Prepare请求 。如果一个Acceptor收到一个编号为N的Prepare请求 , 且N大于该Acceptor已经响应过的所有Prepare请求的编号 , 那么它就会将它已经接受过的编号最大的提案(如果有的话)作为响应反馈给Proposer , 同时该Acceptor承诺不再接受任何编号小于N的提案 。例如:一个acceptor已经响应过的所有prepare请求对应的提案编号分别为1、2、 。。。。 5和7 , 那么该acceptor在接收到一个编号为8的prepare请求后 , 就会将编号为7的提案作为响应反馈给Proposer 。
阶段二 如果Proposer收到半数以上Acceptor对其发出的编号为N的Prepare请求的响应 , 那么它就会发送一个针对**[N,V]提案的Accept请求给半数以上的Acceptor 。 注意:V就是阶段一收到的响应中编号最大的提案的value** , 如果响应中不包含任何提案 , 那么V就由Proposer自己决定(任意值) 。 如果Acceptor收到一个针对编号为N的提案的Accept请求 , 只要该Acceptor没有对编号大于N的Prepare请求做出过响应 , 它就接受该提案 。
本文插图
注意:Proposer可以随时丢弃提案 , 并且提出新的提案;Acceptor也可以随时响应 , 接受编号更大的提案 。
思考:如果两个Proposer还处于第一阶段时 , 互相提出编号更大的提案?会发生什么?
这时候会出现“活锁”状态 , 陷入了无限死循环中(破坏了算法活性) 。
那需要怎么防止呢?
可以选出一个主Proposer , 只有主Proposer可以提出提案 。
至于怎么选择 , 不属于Paxos的范畴 , 可以参考RAFT使用竞选 , 谁快谁当选;也可以参考PBFT的依次成为leader等 。 RAFT算法
RAFT算法分为两个阶段:Leader选举 , 日志复制 。 也有三种角色 , 分别为:
Leader(领导者):负责发送要进行共识的数据 , 如果客户端发送的数据不是发送到Leader而是其他角色 , 其他角色会进行转发至Leader 。
Follower(追随者):参与共识的角色
Candidate(候选者):如果Follower没有收到Leader的心跳响应超过150——300ms , 会进行Leader选举 。
每个节点的身份都可以是以上三种中的其一 。
Leader选举阶段: 所有节点初始状态为Follower状态 , 此时没有Leader , 肯定会与Leader的心跳超时(一般150——300ms , 随机的 , 这样就是想谁先发出竞选 , 谁当选leader) , 此时Candidate就会发出leader竞选给其他节点(大家快选我啊 , leader挂掉了);其他节点收到竞选请求 , 会响应同意 , 当一个Candidate收到大多数(n/2 + 1)节点的回复 , 就成为leader 。 然后与Candidate保持心跳连接 。 Raft有个Term(任期)的概念 , 只有在发生Leader选举阶段 , term+1 , 表示新的leader产生 , 挂掉的节点 , 或者挂掉的leader重启后 , 会发现自己的term小于最新的 , 此时就会切换到日志复制 , 去同步之前丢失的消息 。 如果同时有多个Candidate发出竞选 , 并且都没有获得大多数投票 , 会一直进行竞选 , 直到选出leader
推荐阅读
- 摄像头|小米截胡中兴屏下摄像头技术,小米研发还是供应链技术?
- 马斯克|马斯克用活猪演示脑机接口技术:实时读取猪脑信息 心灵感应成真了
- 三防|带你了解三防手持终端的秘密
- 第三|原创 小米发布第三代屏下相机技术,或将在Mix 4上首秀?
- 海信|首个新兴显示技术分标委成立 海信牵头制定国标
- 中年|Python编程语言有什么独特的优势呢?
- |马斯克用活猪演示脑机技术,他希望今年年底前能在人体内植入
- 互联网的放大镜|小米截胡中兴屏下摄像头技术,小米研发还是供应链技术?
- 新机发布|原创 小米发布第三代屏下相机技术,或将在Mix 4上首秀?
- 技术|最新《中国禁止出口限制出口技术目录》发布,新增操作系统、密码芯片安全技术
