静态网站开发实验报告/品牌设计
背景
拜占庭将军问题是分布式领域最复杂、最严格的容错模型。但在日常工作中使用的分布式系统面对的问题不会那么复杂,更多的是计算机故障挂掉了,或者网络通信问题而没法传递信息,这种情况不考虑计算机之间互相发送恶意信息,极大简化了系统对容错的要求,最主要的是达到一致性。
所以将拜占庭将军问题根据常见的工作上的问题进行简化:假设将军中没有叛军,信使的信息可靠但有可能被暗杀的情况下,将军们如何达成一致性决定?
Raft 的解决方案大概可以理解成 先在所有将军中选出一个大将军,所有的决定由大将军来做。选举环节:比如说现在一共有3个将军 A, B, C,每个将军都有一个随机时间的倒计时器,倒计时一结束,这个将军就会把自己当成大将军候选人,然后派信使去问其他几个将军,能不能选我为总将军?假设现在将军A倒计时结束了,他派信使传递选举投票的信息给将军B和C,如果将军B和C还没把自己当成候选人(倒计时还没有结束),并且没有把选举票投给其他,他们把票投给将军A,信使在回到将军A时,将军A知道自己收到了足够的票数,成为了大将军。在这之后,是否要进攻就由大将军决定,然后派信使去通知另外两个将军,如果在一段时间后还没有收到回复(可能信使被暗杀),那就再重派一个信使,直到收到回复。
Raft节点状态
每个节点有三种状态:Follower,Candidate,Leader。状态之间是互相转换的。
每个节点上都有倒计时,随机时间在150ms到300ms之间。
重置Timeout:
1、收到选举的请求
2、收到Leader的Heartbeat
在Raft运行过程中,最主要的两个活动:
1、选主 Leader Election
2、复制日志 Log Replication
选主Leader Election
第一种情况
第一步
1、每个节点都是Fallower
2、每个节点都有一个超时时间
第二步
1、当Follower节点超时后会自动转换到Candidate状态
2、转换为Candidate状态的节点会发起投票
3、发起投票后会让Term+1
4、Candidate状态节点会先给自己投一票,然后等待其他节点的投票
第三步
1、收到投票请求的节点,返回投票结果。
2、收到投票请求的节点,同步Term值(前提是发起请求的Term大于收到方Term的值)
3、收到投票请求的节点,记录发起请求的节点
4、投票过半数节点状态改变为Leader
第四步
1、Leader选举成功
2、Leader以心跳检测的方式给Follower节点发送请求,并更新Follower节点的时间
第五步
Follower返回健康情况
第六步重新选举Leader
当前Leader服务停止了重新选举Liader选举方法从第一步开始
第二种情况
当有四个节点时候的选举
第一步
超时后的状态转变,发送选举信息(超时时间是随机分配的所以存在结束时间相同的情况)
第二步
选举投票结果相同
第三步
结果相同的情况下回到第一步(直到选出Leader)
复制日志
首先要说明:复制日志是分两个步骤的:
1、数据先写入值日
2、日志提交
第一步
系统正常运行
第二步
客户端发送请求
注意:客户端只能给Leader发送请求
Leader节点收到客户端发的请求后将信息写入日志
第三步
Leader将请求信息发送给Follower节点
第四步
1、Follower节点收到Leader(数量过半)的信息后存入日志中
2、并返回给Leader收到信息
3、Leader收到Follower返回的信息后将日志提交
第五步
1、Leader给客户端返回消息
第六步
Leader给Follower发送保存请求,Folloer将日志保存
相关演示地址:http://thesecretlivesofdata.com/raft/
日志存储的演示地址:https://raft.github.io/raftscope/index.html
演示地址可以模拟各种不同的情况进行验证。