好玩的Raft动画演示,原理秒懂

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 关于Raft原理,许多朋友也许不是很明白原理,下面的地址是一个好玩的Raft动画,看完后能够很快的掌握Raft原理:http://thesecretlivesofdata.com/raft/动画中的一些概念和简要原理总结如下:image.png一、Raft原理在Raft中,每个结点会处于下面三种状态中的一种:1、follower:所有结点都以follower的状态开始。

关于Raft原理,许多朋友也许不是很明白原理,下面的地址是一个好玩的Raft动画,看完后能够很快的掌握Raft原理:

http://thesecretlivesofdata.com/raft/

动画中的一些概念和简要原理总结如下:

image.png

一、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也提交日志
  • 现在整个系统处于一致的状态

三种角色的状态转换关系如下:

image.png

二、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那里复制最新的日志。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
缓存 算法 NoSQL
来吧,自己动手撸一个分布式ID生成器组件(上)
来吧,自己动手撸一个分布式ID生成器组件(上)
来吧,自己动手撸一个分布式ID生成器组件(上)
|
运维 负载均衡 关系型数据库
来吧,自己动手撸一个分布式ID生成器组件(下)
来吧,自己动手撸一个分布式ID生成器组件(下)
来吧,自己动手撸一个分布式ID生成器组件(下)
|
9月前
|
Rust Dart 算法
55.3k star!开源算法教程,附带动画图解,学习算法不再苦恼!
55.3k star!开源算法教程,附带动画图解,学习算法不再苦恼!
109 0
|
前端开发 定位技术
前端学习笔记202305学习笔记第二十三天-地图单线程配置
前端学习笔记202305学习笔记第二十三天-地图单线程配置
121 0
前端学习笔记202305学习笔记第二十三天-地图单线程配置
|
9月前
|
存储 XML 缓存
前端知识笔记(三十九)———Base64图片是什么?原理是什么?优缺点是什么?
前端知识笔记(三十九)———Base64图片是什么?原理是什么?优缺点是什么?
142 0
|
vr&ar 图形学 索引
【Unity3D 灵巧小知识点】 ☀️ | Unity中如何使用代码切换场景
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
【Unity3D 灵巧小知识点】 ☀️ | Unity中如何使用代码切换场景
|
Web App开发 移动开发 前端开发
WebMatrix进阶教程(3):如何实现某种样式
Csdn.net近期将发布微软全新Web开发工具WebMatrix的进阶教程,帮助开发人员人士认识这一号称微软史上最强的Web开发工具。继上次发布的如何安装和使用微软全新开发工具WebMatrix 和 教您如何使用WebMatrix创建第一个网页 后。
1144 0
|
前端开发
#私藏项目实操分享# 【React工作记录六】如何实现一个图片的伪预览效果
#私藏项目实操分享# 【React工作记录六】如何实现一个图片的伪预览效果
110 0
Threejs入门进阶实战案例(4):addEventListener() 方法自适应窗口显示的方案
Threejs入门进阶实战案例(4):addEventListener() 方法自适应窗口显示的方案
141 0
|
6月前
|
存储 缓存 异构计算
PixiJS源码分析系列:第二章 渲染在哪里开始?
PixiJS源码分析系列:第二章 渲染在哪里开始?

热门文章

最新文章