赞
踩
保证系统改变并提交之后,立即改变集群的状态
e.q.:Paxos、Raft、ZAB
2.弱一致性
也叫最终一致性,系统不保证改变并提交以后立即改变集群的状态,但是随着时间的推移最终状态是一致的。
e.q.: DNS,Gossip协议
Paxos 算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。一个典型的场景是,
在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点执行相同的操作序列,那么
他们最后能得到一个一致的状态。为保证每个节点执行相同的命令序列,需要在每一条指令上执
行一个“一致性算法”以保证每个节点看到的指令一致。 zookeeper 使用的 zab 算法是该算法的
一个实现。
在 Paxos 算法中,有三种角色:
Proposer(提议人):只要 Proposer 发的提案被半数以上 Acceptor 接受, Proposer 就认为该提案里的 value 被选定了。
Acceptor(接受人):只要 Acceptor 接受了某个提案, Acceptor 就认为该提案里的 value 被选定了。
Learners(学习人、提案接受者):Acceptor 告诉 Learner 哪个 value 被选定, Learner 就认为那个 value 被选定。
阶段一(准 leader 确定 ):
阶段二(leader 确认) :
ZAB( ZooKeeper Atomic Broadcast , ZooKeeper 原子消息广播协议)协议包括两种基本的模
式:崩溃恢复和消息广播
以上其实大致经历了三个步骤:
与 Paxos 不同 Raft 强调的是易懂(Understandability), Raft 和 Paxos 一样只要保证 n/2+1 节
点正常就能够提供服务; raft 把算法流程分为三个子问题:选举(Leader election)、日志复制
(Log replication)、安全性(Safety)。
Raft 把集群中的节点分为三种状态: Leader、 Follower 、 Candidate,理所当然每种状态负
责的任务也是不一样的, Raft 运行时提供服务的时候只存在 Leader 与 Follower 两种状态;
Leader(领导者-日志管理)负责日志的同步管理,处理来自客户端的请求,与 Follower 保持着 heartBeat 的联系;
Follower(追随者-日志同步)刚启动时所有节点为Follower状态,响应Leader的日志同步请求,响应Candidate的请求,把请求到 Follower 的事务转发给 Leader;
Candidate(候选者-负责选票)负责选举投票, Raft 刚启动时由一个节点从 Follower 转为 Candidate 发起选举,选举出Leader 后从 Candidate 转为 Leader 状态;
在 Raft 中使用了一个可以理解为周期(第几届、任期)的概念,用 Term 作为一个周期,每个 Term 都是一个连续递增的编号,每一轮选举都是一个 Term 周期,在一个 Term 中只能产生一个 Leader;当某节点收到的请求中 Term 比当前 Term 小时则拒绝该请求。
选举定时器:Raft 的选举由定时器来触发, 每个节点的选举定时器时间都是不一样的,开始时状态都为Follower 某个节点定时器触发选举后 Term 递增,状态由 Follower 转为 Candidate,向其他节点发起 RequestVote RPC 请求,这时候有三种可能的情况发生:
该 RequestVote 请求接收到 n/2+1(过半数)个节点的投票,从 Candidate 转为 Leader,向其他节点发送 heartBeat 以保持 Leader 的正常运转。
在此期间如果收到其他节点发送过来的 AppendEntries RPC 请求,如该节点的 Term 大则当前节点转为 Follower,否则保持 Candidate 拒绝该请求。
Election timeout 发生则 Term 递增,重新发起选举在一个 Term 期间每个节点只能投票一次, 所以当有多个 Candidate 存在时就会出现每个Candidate 发起的选举都存在接收到的投票数都不过半的问题,这时每个 Candidate 都将 Term递增、重启定时器并重新发起选举,由于每个节点中定时器的时间都是随机的,所以就不会多次存在有多个 Candidate 同时发起投票的问题。在 Raft 中当接收到客户端的日志(事务请求)后先把该日志追加到本地的 Log 中,然后通过heartbeat 把该 Entry 同步给其他 Follower, Follower 接收到日志后记录日志然后向 Leader 发送ACK,当 Leader 收到大多数(n/2+1) Follower 的 ACK 信息后将该日志设置为已提交并追加到本地磁盘中,通知客户端并在下个 heartbeat 中 Leader 将通知所有的 Follower 将该日志存储在自己的本地磁盘中。
相同点:
采用 quorum 来确定整个系统的一致性,这个 quorum 一般实现是集群中半数以上的服务器,
zookeeper 里还提供了带权重的 quorum 实现.
都由 leader 来发起写操作.
都采用心跳检测存活性
leader election 都采用先到先得的投票方式
不同点:
NWR值的不同组合会产生不同的一致性效果,当W+R>N 的时候,整个系统对于客户端来讲能保证强一致性。 而如果 R+W<=N,则无法保证数据的强一致性。 以常见的 N=3、 W=2、 R=2 为例:
N=3,表示,任何一个对象都必须有三个副本( Replica), W=2 表示,对数据的修改操作(Write)只需要在 3 个 Replica 中的 2 个上面完成就返回, R=2 表示,从三个对象中要读取到 2个数据对象, 才能返回
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SlTEOdV9-1657187954886)(C:\Users\Administrator\Desktop\1656751629674.png)]
Gossip 算法又被称为反熵(Anti-Entropy),熵是物理学上的一个概念, 代表杂乱无章,而反熵就是在杂乱无章中寻求一致,这充分说明了 Gossip 的特点:在一个有界网络中,每个节点都随机地与其他节点通信,经过一番杂乱无章的通信,最终所有节点的状态都会达成一致。每个节点可能知道所有其他节点,也可能仅知道几个邻居节点,只要这些节点可以通过网络连通,最终他们的状态都是一致的,当然这也是疫情传播的特点
分说明了 Gossip 的特点:在一个有界网络中,每个节点都随机地与其他节点通信,经过一番杂乱无章的通信,最终所有节点的状态都会达成一致。每个节点可能知道所有其他节点,也可能仅知道几个邻居节点,只要这些节点可以通过网络连通,最终他们的状态都是一致的,当然这也是疫情传播的特点
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。