ETCD系列之一:简介

1. ETCD是什么

ETCD是用于共享配置和服务发现的分布式,一致性的KV存储系统。该项目目前最新稳定版本为2.3.0. 具体信息请参考[项目首页]和[Github]。ETCD是CoreOS公司发起的一个开源项目,授权协议为Apache。

提供配置共享和服务发现的系统比较多,其中最为大家熟知的是[Zookeeper](后文简称ZK),而ETCD可以算得上是后起之秀了。在项目实现,一致性协议易理解性,运维,安全等多个维度上,ETCD相比Zookeeper都占据优势。

2. ETCD vs ZK

本文选取ZK作为典型代表与ETCD进行比较,而不考虑[Consul]项目作为比较对象,原因为Consul的可靠性和稳定性还需要时间来验证(项目发起方自身服务并未使用Consul, 自己都不用)。

  • 一致性协议: ETCD使用[Raft]协议, ZK使用ZAB(类PAXOS协议),前者容易理解,方便工程实现;
  • 运维方面:ETCD方便运维,ZK难以运维;
  • 项目活跃度:ETCD社区与开发活跃,ZK已经快死了;
  • API:ETCD提供HTTP+JSON, gRPC接口,跨平台跨语言,ZK需要使用其客户端;
  • 访问安全方面:ETCD支持HTTPS访问,ZK在这方面缺失;

3. ETCD的使用场景

和ZK类似,ETCD有很多使用场景,包括:

  • 配置管理
  • 服务注册于发现
  • 选主
  • 应用调度
  • 分布式队列
  • 分布式锁

4. ETCD读写性能

按照官网给出的[Benchmark], 在2CPU,1.8G内存,SSD磁盘这样的配置下,单节点的写性能可以达到16K QPS, 而先写后读也能达到12K QPS。这个性能还是相当可观的。

5. ETCD工作原理

ETCD使用Raft协议来维护集群内各个节点状态的一致性。简单说,ETCD集群是一个分布式系统,由多个节点相互通信构成整体对外服务,每个节点都存储了完整的数据,并且通过Raft协议保证每个节点维护的数据是一致的。

如图所示,每个ETCD节点都维护了一个状态机,并且,任意时刻至多存在一个有效的主节点。主节点处理所有来自客户端写操作,通过Raft协议保证写操作对状态机的改动会可靠的同步到其他节点。

ETCD工作原理核心部分在于Raft协议。本节接下来将简要介绍Raft协议,具体细节请参考其[论文]。
Raft协议正如论文所述,确实方便理解。主要分为三个部分:选主,日志复制,安全性。

5.1 选主

Raft协议是用于维护一组服务节点数据一致性的协议。这一组服务节点构成一个集群,并且有一个主节点来对外提供服务。当集群初始化,或者主节点挂掉后,面临一个选主问题。集群中每个节点,任意时刻处于Leader, Follower, Candidate这三个角色之一。选举特点如下:

  • 当集群初始化时候,每个节点都是Follower角色;
  • 集群中存在至多1个有效的主节点,通过心跳与其他节点同步数据;
  • 当Follower在一定时间内没有收到来自主节点的心跳,会将自己角色改变为Candidate,并发起一次选主投票;当收到包括自己在内超过半数节点赞成后,选举成功;当收到票数不足半数选举失败,或者选举超时。若本轮未选出主节点,将进行下一轮选举(出现这种情况,是由于多个节点同时选举,所有节点均为获得过半选票)。
  • Candidate节点收到来自主节点的信息后,会立即终止选举过程,进入Follower角色。

为了避免陷入选主失败循环,每个节点未收到心跳发起选举的时间是一定范围内的随机值,这样能够避免2个节点同时发起选主。

5.2 日志复制

所谓日志复制,是指主节点将每次操作形成日志条目,并持久化到本地磁盘,然后通过网络IO发送给其他节点。其他节点根据日志的逻辑时钟(TERM)和日志编号(INDEX)来判断是否将该日志记录持久化到本地。当主节点收到包括自己在内超过半数节点成功返回,那么认为该日志是可提交的(committed),并将日志输入到状态机,将结果返回给客户端。

这里需要注意的是,每次选主都会形成一个唯一的TERM编号,相当于逻辑时钟。每一条日志都有全局唯一的编号。

主节点通过网络IO向其他节点追加日志。若某节点收到日志追加的消息,首先判断该日志的TERM是否过期,以及该日志条目的INDEX是否比当前以及提交的日志的INDEX跟早。若已过期,或者比提交的日志更早,那么就拒绝追加,并返回该节点当前的已提交的日志的编号。否则,将日志追加,并返回成功。

当主节点收到其他节点关于日志追加的回复后,若发现有拒绝,则根据该节点返回的已提交日志编号,发生其编号下一条日志。

主节点像其他节点同步日志,还作了拥塞控制。具体地说,主节点发现日志复制的目标节点拒绝了某次日志追加消息,将进入日志探测阶段,一条一条发送日志,直到目标节点接受日志,然后进入快速复制阶段,可进行批量日志追加。

按照日志复制的逻辑,我们可以看到,集群中慢节点不影响整个集群的性能。另外一个特点是,数据只从主节点复制到Follower节点,这样大大简化了逻辑流程。

5.3 安全性

截止此刻,选主以及日志复制并不能保证节点间数据一致。试想,当一个某个节点挂掉了,一段时间后再次重启,并当选为主节点。而在其挂掉这段时间内,集群若有超过半数节点存活,集群会正常工作,那么会有日志提交。这些提交的日志无法传递给挂掉的节点。当挂掉的节点再次当选主节点,它将缺失部分已提交的日志。在这样场景下,按Raft协议,它将自己日志复制给其他节点,会将集群已经提交的日志给覆盖掉。

这显然是不可接受的。

其他协议解决这个问题的办法是,新当选的主节点会询问其他节点,和自己数据对比,确定出集群已提交数据,然后将缺失的数据同步过来。这个方案有明显缺陷,增加了集群恢复服务的时间(集群在选举阶段不可服务),并且增加了协议的复杂度。

Raft解决的办法是,在选主逻辑中,对能够成为主的节点加以限制,确保选出的节点已定包含了集群已经提交的所有日志。如果新选出的主节点已经包含了集群所有提交的日志,那就不需要从和其他节点比对数据了。简化了流程,缩短了集群恢复服务的时间。

这里存在一个问题,加以这样限制之后,还能否选出主呢?答案是:只要仍然有超过半数节点存活,这样的主一定能够选出。因为已经提交的日志必然被集群中超过半数节点持久化,显然前一个主节点提交的最后一条日志也被集群中大部分节点持久化。当主节点挂掉后,集群中仍有大部分节点存活,那这存活的节点中一定存在一个节点包含了已经提交的日志了。

至此,关于Raft协议的简介就全部结束了。

6. ETCD使用案例

据公开资料显示,至少有CoreOS, Google Kubernetes, Cloud Foundry, 以及在Github上超过500个项目在使用ETCD。

7. ETCD接口

ETCD提供HTTP协议,在最新版本中支持Google gRPC方式访问。具体支持接口情况如下:

  • ETCD是一个高可靠的KV存储系统,支持PUT/GET/DELETE接口;
  • 为了支持服务注册与发现,支持WATCH接口(通过http long poll实现);
  • 支持KEY持有TTL属性;
  • CAS(compare and swap)操作;
  • 支持多key的事务操作;
  • 支持目录操作

8. 结束

本文对ETCD作了一个简单的介绍,希望对你有帮助。

时间: 2024-10-25 14:14:09

ETCD系列之一:简介的相关文章

linux网络编程之socket(十三) epoll系列函数简介与select、poll的区别

一.epoll 系列函数简介 #include <sys/epoll.h> int epoll_create(int size); int epoll_create1(int flags); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);    

ETCD系列之二:部署集群

ETCD系列之二:部署集群 1. 概述 想必很多人都知道ZooKeeper,通常用作配置共享和服务发现.和它类似,ETCD算是一个非常优秀的后起之秀了.本文重点不在描述他们之间的不同点.首先,看看其官网关于ETCD的描述1: A distributed, reliable key-value store for the most critical data of a distributed system. 在云计算大行其道的今天,ETCD有很多典型的使用场景.常言道,熟悉一个系统先从部署开始.本

ETCD系列之三:网络层实现

ETCD系列之三:网络层实现 1. 概述 在理清ETCD的各个模块的实现细节后,方便线上运维,理解各种参数组合的意义.本文先从网络层入手,后续文章会依次介绍各个模块的实现. 本文将着重介绍ETCD服务的网络层实现细节.在目前的实现中,ETCD通过HTTP协议对外提供服务,同样通过HTTP协议实现集群节点间数据交互. 网络层的主要功能是实现了服务器与客户端(能发出HTTP请求的各种程序)消息交互,以及集群内部各节点之间的消息交互. 2. ETCD-SERVER整体架构 ETCD-SERVER 大体

PIC系列单片机简介

问题描述 一.引言 据统计,我国的单片机年容量已达1-3亿片,且每年以大约16%的速度增长,但相对于世界市场我国的占有率还不到1%.这说明单片机应用在我国才刚刚起步,有着广阔的前景.培养单片机应用人才,特别是在工程技术人员中普及单片机知识有着重要的现实意义. 当今单片机厂商琳琅满目,产品性能各异.针对具体情况,我们应选何种型号呢?首先,我们来弄清两个概念:集中指令集(CISC)和精简指令集(RISC).采用CISC结构的单片机数据线和指令线分时复用,即所谓冯.诺伊曼结构.它的指令丰富,功能较强,

消防辅助利器:“华平高空布控系统”系列装备简介

华平无线应急布控系统成功参与赣北消防实战演练,其前端"高空布控系统"系列装备由可拆解式登高车图像终端.可拆解式高喷车图像终端.便携式路由中心站共同组成,这套"高空瞄准镜"在高空火情精准侦察.降低危险性,缩短反应时间等方面均有出色发挥,优越的性能使其受到各方关注. 下面就从产品功能.主要特点等方面对这三款装备进行全面介绍. 一 可拆解式登高车图像终端 图1:可拆解式登高车图像终端 可拆解式登高车图像终端能够在不影响.不改变外观及内部电路的情况下,快速装配到消防登高车上

【书】《数据库面试笔试宝典系列》简介

[书]<Oracle数据库面试笔试宝典>相关内容 目录 目录 - 1 - 内容介绍 - 8 - 作者简介 - 8 - 序言 - 9 - 前言 - 10 - 上篇 面试笔试经验技巧篇 - 13 - 第1章 求职经验分享 - 13 - 1.1 踩别人没有踩过的坑,犯别人没有犯过的错 - 13 - 1.2 只要肯钻研,就能成大咖 - 14 - 1.3 普通DBA的逆袭经验 - 14 - 第2章 数据库程序员的求职现状 - 15 - 2.1 当前市场对于数据库程序员的需求如何?待遇如何? - 15 -

RDLC系列之一 简介和入门

一.简介 RDLC报表,通过Report Viewer Control来实现,制作微软RDLC报表由以下三部分构成:1.制作自己的DateSet集合(就是报表的数据集):2.制作自己的报表文件.rdlc文件,用于画做报表样式,里面有微软自带的导出和打印功能.制作显示报表的前台页面aspx文件,基本上就是插入一个ReportViewer然后关联上面的.rdlc文件,注意别忘了更新数据源和插入ScriptManager. 这种报表的易用性和可定制性,主要功能:       1.简单易用的控件,特别是

[Apache commons系列]DBUtils简介-3.示例代码

inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ). DbUtils是一个小型的类库,这里通过具体实例来说明如何使用DbUtils.示例分为3个类:DbUtilsExample演示了如何使用DbUtils 类:QueryRunnerExample 演示了如何使用QueryRunner .ResultSetHandler :User 类为一个JavaBean,对应于数据库中的表格.示例采用MySQL为数据库,使用JDBC4.0驱动(最

[Apache commons系列]DBUtils简介-2.核心类简介

inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ). DbUtils是一个小型的类库,不需要也不值得花太长的时间去熟悉每一个类.DbUtils核心其实只有三个类/接口,即QueryRunner .ResultSetHandler 和DbUtls (官方文档中写的是前两个).(来源:http://blog.csdn.net/inkfish)   一.下面先过一下DbUtils的几个包(package):(来源:http://blog.