ETCD注册中心

一、介绍

etcd是一个Go言编写的分布式、高可用的一致性键值存储系统,用于提供可靠的分布式键值存储、配置共享和服务发现等功能,具有以下特点

简单:

1、易使用:基于HTTP+JSON的API让你用curl就可以轻松使用;

2、易部署:使用Go语言编写,跨平台,部署和维护简单。

可靠:

1、强一致:使用Raft算法充分保证了分布式系统数据的强一致性;

2、高可用:具有容错能力,假设集群有n个节点,当有(n-1)/2节点发送故障,依然能提供服务;

3、持久化:数据更新后,会通过WAL格式数据持久化到磁盘,支持Snapshot快照。

快速:每个实例每秒支持一千次写操作,极限写性能可达10K QPS。

安全:可选SSL客户认证机制。

二、ETCD框架

从etcd的架构图中我们可以看到,etcd主要分为四个部分:

1、HTTP Server:用于处理用户发送的API请求以及其它etcd节点的同步与心跳信息请求。

2、Store:用于处理etcd支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是etcd对用户提供的大多数API功能的具体实现。

3、Raft:Raft强一致性算法的具体实现,是etcd的核心。

4、WAL:Write Ahead Log(预写式日志),是etcd的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。WAL中,所有的数据提交前都会事先记录日志。Snapshot是为了防止数据过多而进行的状态快照;Entry表示存储的具体日志内容。

三、Raft协议

3.1、基本概念

3.1.1、名词解释

Raft协议一共包含如下3类角色:

1、Leader(领袖):领袖由群众投票选举得出,每次选举,只能选出一名领袖;

2、Candidate(候选人):当没有领袖时,某些群众可以成为候选人,然后去竞争领袖的位置;

3、Follower(群众):这个很好理解,就不解释了。

然后在进行选举过程中,还有几个重要的概念:

1、Leader Election(领导人选举):简称选举,就是从候选人中选出领袖;

2、Term(任期):它其实是个单独递增的连续数字,每一次任期就会重新发起一次领导人选举;

3、Election Timeout(选举超时):就是一个超时时间,当群众超时未收到领袖的心跳时,会重新进行选举。

3.1.2、角色转换

这幅图是领袖、候选人和群众的角色切换图,我先简单总结一下:

1、群众 -> 候选人:当开始选举,或者"选举超时"时

2、候选人 -> 候选人:当"选举超时",或者开始新的"任期"

3、候选人 -> 领袖:获取大多数投票时

4、候选人 -> 群众:其它节点成为领袖,或者开始新的"任期"

5、领袖 -> 群众:发现自己的任期ID比其它节点分任期ID小时,会自动放弃领袖位置

6、备注:后面会针对每一种情况,详细进行讲解。

3.2、选举

3.2.1、领导人选举

为了便于后续的讲解,我画了一副简图,"选举定时器"其实就是每个节点的"超时时间"。

成为候选人:每个节点都有自己的"超时时间",因为是随机的,区间值为150~300ms,所以出现相同随机时间的概率比较小,因为节点B最先超时,这时它就成为候选人。

选举领导人:候选人B开始发起投票,群众A和C返回投票,当候选人B获取大部分选票后,选举成功,候选人B成为领袖。

心跳探测:为了时刻宣誓自己的领导人地位,领袖B需要时刻向群众发起心跳,当群众A和C收到领袖B的心跳后,群众A和C的"超时时间"会重置为0,然后重新计数,依次反复。

这里需要说明一下,领袖广播心跳的周期必须要短于"选举定时器"的超时时间,否则群众会频繁成为候选者,也就会出现频繁发生选举,切换Leader的情况。

领袖挂掉情况

作者:楼仔

链接:https://juejin.cn/post/7035179267918938119

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关推荐
lazy H15 分钟前
从入门到日常开发,一篇文章掌握 Git 核心操作
git·后端·学习·github
YOU OU7 小时前
Redis基础常识与命令
数据库·redis·缓存
Database_Cool_10 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
爱写代码的阿森10 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
Database_Cool_11 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白11 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
a11177612 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
窝子面12 小时前
手搓最简前后端协作-node
javascript·数据库
我的xiaodoujiao12 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest