好玩的Raft动画演示,原理秒懂
来源:互联网 发布:分布式通信 java 编辑:程序博客网 时间:2024/04/30 13:07
关于Raft原理,许多朋友也许不是很明白原理,下面的地址是一个好玩的Raft动画,看完后能够很快的掌握Raft原理:
http://thesecretlivesofdata.com/raft/
动画中的一些概念和简要原理总结如下:
一、Raft原理
在Raft中,每个结点会处于下面三种状态中的一种:
1、follower:所有结点都以follower的状态开始。如果没收到leader消息则会变成candidate状态。
2、candidate:会向其他结点“拉选票”,如果得到大部分的票则成为leader。这个过程就叫做Leader选举(Leader Election)。
3、leader:所有对系统的修改都会先经过leader。每个修改都会写一条日志(log entry)。leader收到修改请求后的过程如下,这个过程叫做日志复制(Log Replication):
- 复制日志到所有follower结点(replicate entry)
- 大部分结点响应时才提交日志
- 通知所有follower结点日志已提交
- 所有follower也提交日志
- 现在整个系统处于一致的状态
三种角色的状态转换关系如下:
二、Leader Election
当follower在选举超时时间(election timeout)内未收到leader的心跳消息(append entries),则变成candidate状态。为了避免选举冲突,这个超时时间是一个150~300ms之间的随机数。
成为candidate的结点发起新的选举期(election term)去“拉选票”:
- 重置自己的计时器
- 投自己一票
- 发送 Request Vote消息
如果接收结点在新term内没有投过票那它就会投给此candidate,并重置它自己的选举超时时间。candidate拉到大部分选票就会成为leader,并定时发送心跳——Append Entries消息,去重置各个follower的计时器。当前Term会继续直到某个follower接收不到心跳并成为candidate。
如果不巧两个结点同时成为candidate都去“拉票”怎么办?这时会发生Splite Vote情况。两个结点可能都拉到了同样多的选票,难分胜负,选举失败,本term没有leader。之后又有计时器超时的follower会变成candidate,将term加一并开始新一轮的投票。
三、Log Replication
当发生改变时,leader会复制日志给follower结点,这也是通过Append Entries心跳消息完成的。前面已经列举了Log Replication的过程,这里就不重复了。
Raft能够正确地处理网络分区(“脑裂”)问题。假设A~E五个结点,B是leader。如果发生“脑裂”,A、B成为一个子分区,C、D、E成为一个子分区。此时C、D、E会发生选举,选出C作为新term的leader。这样我们在两个子分区内就有了不同term的两个leader。这时如果有客户端写A时,因为B无法复制日志到大部分follower所以日志处于uncommitted未提交状态。而同时另一个客户端对C的写操作却能够正确完成,因为C是新的leader,它只知道D和E。
当网络通信恢复,B能够发送心跳给C、D、E了,却发现“改朝换代”了,因为C的term值更大,所以B自动降格为follower。然后A和B都回滚未提交的日志,并从新leader那里复制最新的日志。
- 好玩的Raft动画演示,原理秒懂
- Raft动画演示
- 动画演示Raft
- 好玩的css3动画
- etcd raft算法动画
- 超好玩的msn自制动画头像
- 好玩的动画加载和自定义ProgressBar
- 属性动画(PropertyAnimation)好玩的粘性控件
- 一些好玩的前段动画插件
- 好玩的动画加载和自定义ProgressBar
- 轨迹动画演示的例子
- 演示动画怎么实现的
- ValueAnimator构造好玩动画
- 看了谷歌的视频演示秒懂平衡二叉搜索树--迷之旋转
- 如何用Swift实现一个好玩的弹性动画
- 【译】如何用Swift实现一个好玩的弹性动画
- 如何用Swift实现一个好玩的弹性动画
- 【金字塔原理】演示的逻辑
- [SMOJ2073]Bug
- uva-122 树的层次遍历
- web前端学习日记10
- Activity的生命周期
- 方法重写,抽象方法必须重写,抽象类。super.父类里面的方法调用方法。
- 好玩的Raft动画演示,原理秒懂
- HTML CSS:Meeting the Media
- SpringBoot+ActiveMQ多消息队列监听
- Activity的四种启动模式
- JStorm与Storm源码分析(八)--计时器工具-mk-timer
- 202. Happy Number
- 08-SpringBoot——Spring常用配置-事件
- shell脚本的8种字符串截取方法
- 接口