etcd的raft选取机制
etcd 是一个分布式的k/V存储系统。核心使用了RAFT分布式一致性协议。一致性这个概念,它是指多个服务器在状态达成一致,但是在一个分布式系统中,因为各种意外可能,有的服务器可能会崩溃或变得不可靠,它就不能和其他服务器达成一致状态。这样就需要一种Consensus协议,一致性协议是为了确保容错性,也就是即使系统中有一两个服务器当机,也不会影响其处理过程。
为了以容错方式达成一致,我们不可能要求所有服务器100%都达成一致状态,只要超过半数的大多数服务器达成一致就可以了,假设有N台服务器,N/2 +1 就超过半数,代表大多数了。
raft协议核心要点:
Leader选举(Leader Election)
日志同步 (Log Replication)
- leader收到client的更新请求后,会讲更新的内容同步给所有follower。
集群状态的正确性 (Safety)
- 保证日志的一致性
- 保证选举的正确性
服务器状态:
leader
处理所有客户端交互,日志复制等,一个任期只有一个。follower
完全被动的选民,是只读的。candidate
候选人,可以被选举为新领导。
状态之间的转换:

任期(terms)

如上图,蓝色代表 Election 模式,绿色代表 Operation 模式
- 在每个任期内最多一个leader
- 有些可能没有leader
- 每一个服务会维护当前的任期值
- 每一个rpc请求中都会携带term值
- 如果一个peer实例拥有老的term值,则更新为最新的term值并状态变为follower
- 一旦一个服务选举为leader,就会进入 operation 模式
Leader选举
etcd服务启动后,会进入 follower 状态,leader 心跳超时后会进入选举状态。
选举总体流程图如下:

选举流程分解
初始状态都是Follower
S1 超时, 变为Candidate,开始选举, 发起投票请求
S1 变为Leader
S2 和 S3 同意投票给S1
Leader S1开始接受客户端写请求
- Leader接受到客户端写请求后,会将数据更新写入到log中
- 如果S2和S3收到客户端写请求,会将请求转发到Leader S1
- Leader会异步的将更新的log同步到Follower S2和S3
超过多数的Follower将数据成功同步到log后,Leader会将该条数据更新为Committed状态,Committed index会随着增长。
选举的正确性
- 在每一任期内,最多允许一个服务被选举为leader
- 在一个任期内,一个服务只能投一票
- 只有获得大多数投票才能作为leader
- 如果有多个candidate,最终一定会有一个被选举为leader
- 如果多个candidate同时发起了选举,导致都没有获得大多数选票时,每一个candidate会随机等待一段时间后重新发起新一轮投票(一般是随机等待150-300ms)
日志的一致性
1. 客户端写入数据到 leader:
- leader 将数据写入到 log
- leader将更新的数据广播到所有的followers
- 多数follower成功写入log后,leader会将该数据提交到状态机
- leader 把数据提交后,返回给client结果
- 在下一个心跳中,leader 通知follower更新已经提交的数据Crashed/slow followers ?
2. leader会一直重试同步数据到follower,直到成功
etcd的raft选取机制的更多相关文章
- etcd学习(5)-etcd的Raft一致性算法原理
ETCD的Raft一致性算法原理 前言 Raft原理了解 raft选举 raft中的几种状态 任期 leader选举 日志复制 安全性 leader宕机,新的leader未同步前任committed的 ...
- etcd学习(6)-etcd实现raft源码解读
etcd中raft实现源码解读 前言 raft实现 看下etcd中的raftexample newRaftNode startRaft serveChannels 领导者选举 启动并初始化node节点 ...
- Etcd中Raft joint consensus的实现
Joint consensus 分为2个阶段,first switches to a transitional configuration we call joint consensus; once ...
- Etcd中Raft日志复制的实现
Raft state of log commitIndex : A log entry is committed once the leader that created the entry has ...
- Zookeeper选取机制
1)半数机制:集群中半数以上机器存活,集群可用.所以Zookeeper适合安装奇数台服务器. 2)Zookeeper虽然在配置文件中并没有指定Master和Slave.但是,Zookeeper工作时, ...
- Zookeeper中的Leader选取机制
一.Zookeeper是什么? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应 ...
- ETCD核心机制解析
ETCD整体机制 etcd 是一个分布式的.可靠的 key-value 存储系统,它适用于存储分布式系统中的关键数据. etcd 集群中多个节点之间通过Raft算法完成分布式一致性协同,算法会选举出一 ...
- 彻底搞懂etcd raft选举、数据同步
etcd raft选举机制 etcd 是一个分布式的k/V存储系统.核心使用了RAFT分布式一致性协议.一致性这个概念,它是指多个服务器在状态达成一致,但是在一个分布式系统中,因为各种意外可能,有的服 ...
- etcd raft library设计原理和使用
早在2013年11月份,在raft论文还只能在网上下载到草稿版时,我曾经写过一篇blog对其进行简要分析.4年过去了,各种raft协议的讲解铺天盖地,raft也确实得到了广泛的应用.其中最知名的应用莫 ...
随机推荐
- Java高精度基础+开根
在焦作站的acm网络赛中遇到了一个高精度开根的水题--但是那时候WA了 后面学写java补题还T了orz 所以写一篇文章来记录一下java的大整数类型的基础和开根还有一点心得体会吧 首先给那一题的题面 ...
- Redis慢查询配置和优化
目录 一.介绍 二.参数配置 sql动态配置 配置文件设置 三.sql操作 四.优化 一.介绍 慢查询只记录redis执行时间,并不记录redis服务到客户端之间的网络问题. 超过多少毫秒的才被记录 ...
- 报表(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 好吧,今天这一篇,偷懒放水,不就是[报表]嘛,想看的话一个一个功能按钮点出来看就知道是咋肥四了,我就不一一截图了哈. 嗯, ...
- Linux下编译生成SO并进行调用执行
Linux下编译生成SO并进行调用执行 参考博客的博客: C编译: 动态连接库 (.so文件) - Vamei - 博客园 (cnblogs.com) C 多个动态库存在同名函数问题处理方法:-fvi ...
- 移动应用开发:Flutter
目录 前言 Flutter 介绍 移动应用开发:选择对比 原生开发 H5 技术 React Native Flutter 总结 参考 前言 "镜子镜子 告诉我,世界上最好的语言是什么&quo ...
- Java 数据类型:集合接口Map:HashTable;HashMap;IdentityHashMap;LinkedHashMap;Properties类读取配置文件;SortedMap接口和TreeMap实现类:【线程安全的ConcurrentHashMap】
Map集合java.util.Map Map用于保存具有映射关系的数据,因此Map集合里保存着两个值,一个是用于保存Map里的key,另外一组值用于保存Map里的value.key和value都可以是 ...
- socket模块实现基于UDP聊天模拟程序;socketserver模块实现服务端 socket客户端代码示例
socket模块 serSocket.setblocking(False) 设置为非阻塞: #coding=utf-8 from socket import * import time # 用来存储所 ...
- redis hash操作 list列表操作
HSET key 子key 子value 192.168.11.5:6379> HSET stu1 name 'zhangmingda'(integer) 1192.168.11.5:6379& ...
- 【JAVA今法修真】 第六章 天道无情,锁定乾坤
您好,我是南橘,万法仙门的掌门,刚刚从九州世界穿越到地球,因为时空乱流的影响导致我的法力全失,现在不得不通过这个平台向广大修真天才们借去力量.你们的每一个点赞,每一个关注都是让我回到九州世界的助力,兄 ...
- 【九度OJ】题目1467:二叉排序树 解题报告
[九度OJ]题目1467:二叉排序树 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1467 题目描述: 二叉排序树,也称为二叉查找树 ...