浅入深出ETCD之【raft原理】
前言
这次我们来说说,有关于etcd原理的一些事情。之前我们已经了解到了etcd是一个分布式的k-v存储,那么它究竟是如何保证数据是如何复制到每个节点上面去的呢?又是如何保证在网络分区的情况下能正常工作下去?raft协议到底是什么?带着这些问题我们继续往下看。
raft选举策略
我们知道etcd使用raft协议来保证整个分布式的节点网络能正常的运转并且能正确的将数据复制到每个节点上面去。那么什么是raft协议嘞?
首先我们有这样一个背景:raft是想维护整一个网络,其中有一个领导人,这个领导人负责将收到的信息同步给网络中的其他所有节点,从而保证整个网络数据一致。
如果你有一定的英文基础,我建议直接查看下面这个网站,它用动画非常清楚的描述了raft选举的整个过程:http://thesecretlivesofdata.com/raft/
这个其实已经说明的超级棒了,如果你还看不懂,我下面会用最简单的几个要点来进行最简单的说明。
大多数理论
首先说明一个理论,叫做大多数理论,很简单,举个栗子:
- 有10个人,如果你将苹果给其中的6个人(大多数),那么你随机选择5个人,一定有一个人会有苹果。
在etcd中的应用:
- 选举中只要有大多数(超过半数的人给你投票)你肯定就是票数最多的了,不可能有人比你更多。
- 只需要将日志复制给大多数的节点,那么只要有一半的节点正常工作就能保证数据最新
选举状态
下面是一些选举过程中节点的状态
leader 表示选举最终产生的领导人
candidate 候选状态,表示当前正在参与选举
follower 表示选举最终自己不是领导人,那自己就是从属节点
选举过程与要点

- 所有节点一开始都是follower状态
- 当节点处于follower状态时,每个节点随机经过一段时间,如果没有收到leader的消息就会进入candidate状态(证明当前没有leader节点需要重新进行选举),如果收到信息就会继续保持follower状态
- 当节点处于candidate就会要求别人给自己投票,收到大多数的节点的投票那就转变为leader状态,否则要么是别的节点成为了leader,要么就是因为特殊情况导致这次选举失败重新进行选举
- 每次选举举办的时候有一个term,在每一个term中,每个节点只能投票一次
- 投票的时候必须投给当前数据至少和自己一样的节点,并且term大的优先
日志复制规则
etcd是通过日志复制来实现数据同步的

这个图网上也很多,说明的是日志复制的规则
每个节点都有一份自己的日志,有的节点多,有的节点少,日志最多的肯定是leader。
上图还有几个要点,我看别人没提到,我就提一下:
- 颜色代表term
- 第四行表示的这个节点,第一term下复制了两个日志就异常挂掉了
- 最终只有第三行这个follower和第一行的leader保持了同步
异常情况
raft之所以厉害因为即使出现一些特殊情况,整个网络在一定的时间之后也能自动恢复并正常工作。
一个节点的异常
首先最常见的情况就是一个节点出现异常,有可能是这个节点的服务器挂了,或者别的什么原因。
- 如果出现问题的这个节点是follower,那么没有关系,整个网络依旧能正常运行,当这个节点再次加入网络的时候也只需要同步后面的数据即可。
- 如果出现问题的是leader,有一点麻烦,因为网络中没有leader节点了,那么就会重新进行选举,重新找一个leader,当这个异常节点恢复之后发现当前网络中有leader了,而且term还比自己大,那么自己就退位称为follower。
网络分区
还有一种异常情况是由于网络导致的,网络出现异常,导致节点之间的通信存在异常,一部分节点与另一部分之间没有办法访问了。如下图所示:

上面三个follower没有办法与下面的节点进行通信。
- 当客户端再次请求leader发送数据的时候,leader发现没有办法将数据同步给给大多数节点,它只能给自己和旁边的一个,此时leader没有办法给客户端反馈。
- 上面三个节点由于收不到leader的消息,那么会认为网络中没有leader存在,会重新进行选举操作,因为当前上面有三个节点存在(只要有超过半数的节点参与选举就行),所以可以重新选举成功,选出新的leader告诉客户端,客户端就会重新发送数据到新的leader。
- 当网络恢复之后又会找到最新的leader从而将数据同步至最新的状态。
总结
总的来说,只要整个网络中存在大多数节点正常运行,那么etcd就是可用的,并且能够保证数据正确。当网络恢复之后也能将数据调整到最新的状态。
raft强大的地方在于它能自动的进行状态的变化,自动进行选举,并且选举遵循一定的策略,进而保证整个网络的正常运转。同时保证数据的一致性。
了解etcd的这个原理有助于我们后续的使用以及源码的阅读。
浅入深出ETCD之【raft原理】的更多相关文章
- 浅入深出ETCD之【简介与命令行使用】
前言 你知道etcd吗?随着k8s的使用广泛之后,etcd被非常多的人所知道,同时又因为它可靠的分布式特性被很多人喜欢.所以,我准备有几篇博文来记录一下,从基本使用到线上部署再到原理分析,做一个系列. ...
- 浅入深出ETCD之【集群部署与golang客户端使用】
前言 之前说了etcd的简介,命令行使用,一些基本原理.这次来说说现实一点的集群部署和golang版本的客户端使用.因为在实际使用过程中,etcd的节点肯定是需要2N+1个进行部署的,所以有必要说明一 ...
- 浅入深出之Java集合框架(下)
Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. ...
- 『浅入深出』MySQL 中事务的实现
在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇文章中,我们将对事务的实现进行分析,尝 ...
- 浅入深出之Java集合框架(上)
Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...
- 浅入深出之Java集合框架(中)
Java中的集合框架(中) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...
- 浅入深出Vue:环境搭建
浅入深出Vue:环境搭建 工欲善其事必先利其器,该搭建我们的环境了. 安装NPM 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版本的NodeJS Windows安装程序 下载下来后,直 ...
- 浅入深出Vue:工具准备之PostMan安装配置及Mock服务配置
浅入深出Vue之工具准备(二):PostMan安装配置 由于家中有事,文章没顾得上.在此说声抱歉,这是工具准备的最后一章. 接下来就是开始环境搭建了~尽情期待 工欲善其事必先利其器,让我们先做好准备工 ...
- 浅入深出Vue:工具准备之WebStorm安装配置
浅入深出Vue之工具准备(一):WebStorm安装配置 工欲善其事必先利其器,让我们先做好准备工作吧 导航篇 WebStorm安装配置 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版 ...
随机推荐
- 【Git】.DS_Store 是什么文件
一.为啥会注意到该文件 合并代码的时候,.DS_Store文件发生了冲突,然后进入到项目目录去看,果然存在该文件,就比较好奇该文件是干什么的. 二..DS_Store 是什么文件 .DS_Store( ...
- zabbix--自定义监控项vsftpd
Zabbix 自定义监控项之监控 vsftpd zabbix 提供了很多监控选择,功能丰富,我们还可以根据自定义来监控想要监控一些日常的服务等. 说明: 此处我们通过监控 ftp (自定义命令),实现 ...
- C语言几个术语: 数据对象,左值,右值
1. 数据对象 赋值表达式语句的目的是把值存储到内存位置上. 用于存储值的数据存储区域统称为数据对象. 2. 左值 左值是C语言的术语, 用于标识特定数据对象的名称或表达式. 对象指的是实际的数据存储 ...
- c语言实现基本的数据结构(四) 循环队列
#include <stdio.h> #include <tchar.h> #include <stdlib.h> #define MaxQueueSize 100 ...
- [TJOI2018]最长上升子序列
Link 动态维护LIS? 观察题目:在第 i 轮操作时,将数字 i 插入 插入的数字是当前最大的 如果答案与上次不同,新的LIS必以 i 结尾 以 i 结尾的LIS无法再伸长(因为比 i 小的都插入 ...
- discuz x3.3后台admin.php防止直接恶意访问
功能说明:admin.php是discuz默认的后台地址,正常情况下可以直接访问,为了防止某些恶意访问的情况,可以修改以下内容进行安全性能提升. 适用版本:Discuz!x1-x3.3 具体实施方案: ...
- hive删除数据(转)
转自:https://www.cnblogs.com/linn/p/6196293.html 按分区删除: ALTER TABLE test1 DROP PARTITION (dt='2016-04 ...
- DoubleArrayTrie
/** * DoubleArrayTrie: Java implementation of Darts (Double-ARray Trie System) * * <p> * Copyr ...
- ABAP_DEMO篇33 SUM和COLLECT的用法
ABAP程序内表中的数量和金额字段 经常会需要合计, SUM和COLLECT 语法都能实现对数量和金额字段的合计. 1. SUM语法 ABAP中SUM语句比不上EXCEL里的强大:SUM只能在loo ...
- cc2530的第二次实验,用按键控制流水灯
按键控制流水灯 具体想要实现按一下按键,然后单片机的三个灯会以流水灯的形式都亮一遍 实验相关寄存器 实验相关电路 宏定义 #define uint unsigned int #define uchar ...