您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

分布式系统 Etcd 解析

时间:2021-12-08 09:45:24  来源:  作者:架构驿站

随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商以及企业只能望洋兴叹。此时,分布式系统的出现无疑给大家带来了些许振奋。而后随着大数据、区块链技术以及云计算技术的蓬勃发展,将分布式系统推向新的高潮。

据不完全统计,截止目前,几乎在全球的任何一家互联网企业,无论规模大小,或多或少都有使用到分布式技术。基于不同的业务场景以及实现方案,有些可能注重计算,有些或许注重存储。无论是基于具体哪种场景、模型,无不表明分布式系统在企业技术发展过程中的重要性以及必要性。

在本文中,我将主要围绕 Etcd 这一个分布式 K-V 数据库为主,探讨一下分布式存储技术的核心原理以及源码实现。

首先,我们来了解下什么是Etcd ?

Etcd 是一个分布式的,一致的 Key-Value 存储,主要用于共享配置和服务发现。Etcd由 CoreOS 开发并维护,通过 Raft 一致性算法处理日志复制以保证强一致性。Raft 是一个来自 Stanford 的新的一致性算法,适用于分布式系统的日志复制,Raft 通过选举的方式来实现一致性,在 Raft 中,任何一个节点都可能成为 Leader。google 的容器集群管理系统Kubernetes、开源 PaaS 平台 Cloud Foundry 以及 CoreOS 的 Fleet 均已广泛使用Etcd。

正如上述所述,Etcd 是一个 K-V 存储,其 Etcd Server 采用树形的结构来组织储存数据,类似 linux 的文件系统,其也具备目录和文件的分层结构,我们称之为 Nodes 。下面我们了解下 Etcd Key 的相关操作以及目录情况,具体如下所示:

[administrator@JAVALangOutOfMemory ~ ]% Docker exec etcd /bin/sh -c "/usr/local/bin/etcd --version"
etcd Version: 3.3.8
Git SHA: 33245c6b5
Go Version: go1.9.7
Go OS/Arch: linux/amd64
[administrator@JavaLangOutOfMemory ~ ]% docker exec etcd /bin/sh -c "export ETCDCTL_API=3 ; /usr/local/bin/etcdctl endpoint health"
127.0.0.1:2379 is healthy: successfully committed proposal: took = 3.0925ms
[administrator@JavaLangOutOfMemory ~ ]% docker exec etcd /bin/sh -c "export ETCDCTL_API=3 ; /usr/local/bin/etcdctl put /luga/foo /luga/bar"
OK
[administrator@JavaLangOutOfMemory ~ ]% docker exec etcd /bin/sh -c "export ETCDCTL_API=3 ; /usr/local/bin/etcdctl get / --prefix "
/luga/foo
/luga/bar

基于上述的命令行操作,我们可以看出,当创建某个 Key 时,若不指定路径,则默认创建到根目录 “/” 下面,若指定目录的话,则创建的 Key 位于所指定的目录下。

我们现在了解下 Etcd 的架构,具体简要架构如下图所示:

分布式系统 Etcd 解析

 

基于上述架构图,基于分层的形式,我们可以将 Etcd 分为以下4层,依次为表现层、网络层、应用层、数据层。具体如下:

表现层

此层级主要包含相关命令行操作工具,以及 Restful 的 Api。客户端可以通过命令行或者是 Restful Api 的方式与 Etcd 集群进行通信。

网络层

此层级主要包含代理和 SDK ,ETCD 提供了基于三种协议的通信方式,分别为 HTTP、TCP以及 gRPC等。

应用层

应用层主要包含Raft协议、复制状态机、多版本并发控、Watch、K-V 数据存储、分布式事务等核心功能。强一致性算法的具体实现,是Etcd 的核心算法。

数据层

数据层主要涉及两部分内容:一部分为内存数据,一部分为磁盘数据。其中内存中维护的数据主要是 Key 与 Revision 之间的 B-tree 索引。磁盘里面存储的文件有三部分,一部分就是核心的数据文件,在 Snap下面的 db 文件中保存,还有就是 Raft 协议依赖的Wal 日志文件 和 Snap 快照文件。

针对架构图中的关键组件进行简要描述如下:

HTTP Server:接受客户端发出的 API 请求以及其它 Etcd 节点的同步与心跳信息请求。

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

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

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

通常情况下,一个完整的工作流主要涉及以下活动:一个用户的请求发送过来,会经由 HTTP Server 转发给 Store 进行具体的事务处理,如果涉及到节点数据的修改,则交给 Raft 模块进行状态的变更、日志的记录,然后再同步给别的 Etcd 节点以确认数据提交,最后进行数据的提交,再次同步。

那么,Etcd 主要应用于哪些场景呢?

通过官网定义,Etcd 是一个高可用强一致性的键值数据库在很多分布式系统架构中得到了广泛的应用,其最经典的使用场景就是服务发现。那么有人问了,Zookeeper不香吗?基于 Zookeeper 当前的业务使用场景,结合微服务体系及 云原生K8S 生态支持层面,综合对比分析, Zookeeper 仍存在以下相关缺陷,具体如下:

1、复杂性,Zookeeper 基于Paxos 强一致性算法也以复杂难懂而闻名于世,除此之外,ZooKeeper 的使用也比较复杂,需要安装客户端,而且官方只提供了 Java 和 C 两种语言的接口,其移植性及可扩展性有限。

2、生态发展滞后,无论是基于项目版本的更新还是所拥抱的生态,都表现的差强人意,尤其是在容器化生态中。

3、笨重,Zookeeper 基于Java 语言开发,面向企业级应用,故基于Java 生态体系时不时会引入大量的依赖,从而使得维护交往笨重。

相比较而言,Etcd 虽作为后起之秀,但其已经融入云原生生态领域,并且基于 Go 语言开发,高性能,基于 HTTP 作为接口使用简单、方便,使用 Raft 算法保证强一致性让用户易于理解。除此,基于 Etcd 所默认的持久化机制与安全机制使得其在云原生生态领域能够得到进一步的发展。

为什么 Etcd 在服务发现领域能够独占鳌头呢?具体主要涉及以下:

1、强一致性、高可用。基于 Raft 算法的 Etcd 就是一个强一致性高可用的服务存储目录。

2、注册服务和监控服务健康状态的机制。用户可以在 Eetcd 中注册服务,并且对注册的服务设置 key TTL,定时保持服务的心跳以达到监控健康状态的效果。

3、查找和连接服务的机制。通过在 Etcd 指定的主题(由服务名称构成的服务目录)下注册的服务也能在对应的主题下查找到。

那么,Etcd 如何保证数据一致性呢?

首先,Etcd 使用 Raft 协议来维护 Cluster 内各个 Nodes 状态的一致性。也就是说,Etcd Cluster 是一个分布式系统,由多个 Nodes 相互通信构成整体对外服务,每个 Node 都存储了完整的数据,并且通过 Raft 协议保证每个 Node 维护的数据是一致的。

其次,Etcd Cluster 中的每个 Node 都维护了一个状态机,并且任意时刻,Cluster 中至多存在一个有效的主节点,即:Leader Node。由 Leader 处理所有来自客户端写操作,通过 Raft 协议保证写操作对状态机的改动会可靠的同步到其他 Follower Nodes。具体可参考下 Etcd 算法机制,如下所示:

分布式系统 Etcd 解析

 

基于数据一致性问题,分布式系统中常见的三种一致性模型:

1、强一致性:当更新操作在某个副本上执行成功后,之后所有的读操作都要能够获得最新的数据。

2、弱一致性:当更新某数据时,用户读到最新的数据需要一段时间的延迟。

3、最终一致性:它是一种特殊的弱一致性,当某个数据更新后,在经过一个时间片段,所有后续的操作能够获得新数据,在这个时间片段内,数据可能是不一致的。

Raft 是分布式领域中的强一致性算法,当其中某个节点收到客户端的一组指令时,它必须与其它节点沟通,以保证所有的节点以相同的顺序收到相同的指令,最终所有的节点会产生一致的结果。

如何选举 Leader 节点?

针对 Etcd ,Raft 通过『领导选举机制』选举出一个 Leader,由它全权管理日志复制来实现一致性。一个 Raft 集群包含若干个服务器节点,每一个节点都有一个唯一标识 ID,并且在任何时刻,每一个服务器节点都处于下面三个状态之一:

1、Leader(领导人):Leader 处理所有的客户端请求,在通常情况下,系统中只有一个Leader 并且其他节点都是 Follower。

2、Follower(跟随者):Follower 不会发送任何请求,只是简单地响应来自 Leader

Candidate 的请求,如果一个客户端与 Follower 联系,那么 Follower 会把请求重定向至 Leader。

3、Candidate(候选人):如果 Follower 接收不到来自 Leader 的消息,那么它就会变成 Candidate 并发起一次选举,获得集群中大多数选票(超过 n/2+1)的候选人将成为新的Leader。

假设 Etcd Cluster 中有 3 个 Node,Cluster 启动之初并没有被选举出的 Leader。此时,Raft 算法使用随机 Timer 来初始化 Leader 选举流程。比如说上面 3 个 Node 上都运行了 Timer(每个 Timer 的持续时间是随机的),而 Node1 率先完成了 Timer,随后它就会向其他两个 Node 发送成为 Leader 的请求,其他 Node 接收到请求后会以投票回应然后第一个节点被选举为 Leader。成为 Leader 后,该 Node 会以固定时间间隔向其他 Node 发送通知,确保自己仍是 Leader。有些情况下当 Follower 们收不到 Leader 的通知后,比如说 Leader 节点宕机或者失去了连接,其他 Node 就会重复之前的选举流程,重新选举出新的 Leader。具体可参考如下所示:

分布式系统 Etcd 解析

 

针对如何判断写入是否成功?

Etcd 通常情况下默认为写入请求被 Leader 处理并分发给了其他的 “多数节点” 后,就是一个成功的写入。“多数节点” 的数量的计算公式是 Quorum=N/2+1,N 为总结点数。也就是说,Etcd 并发要将数据写入所有节点才算一次写,而是写入 “多数节点” 即可。

最后,我们来看下如何确定 Etcd Cluster 的节点数?

基于多数节点的计算公式,可以简单理解,Etcd Cluster 推荐最少节点数为 3 个,因为 1 和 2 个 Instance 的容错节点数都是 0,一旦有一个节点宕掉整个集群就不能正常工作了。

进一步的讲,当我们需要决定 Etcd Cluster 中 Instances 的数量时,强烈推荐奇数数量的节点,比如:3、5、7、…等,具体依据实际的业务场景进行决策。

因时间有限,源码解析以及剩余的部分内容暂未在本文中详述,后续将进行进一步的深入解析。



Tags:分布式系统   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  Tags: 分布式系统  点击:(23)  评论:(0)  加入收藏
分布式一致性算法概要随着各种高并发访问、海量数据处理等应用场景越来越多,为了应对这些使用场景,分布式系统应运而生。分布式系统得以发展,得益于诸多优点,比如:可以避免 单点...【详细内容】
2021-04-13  Tags: 分布式系统  点击:(238)  评论:(0)  加入收藏
分布式系统的经典理论分布式系统从诞生到现在已经有几十个年头了,其中伴随着一些很重要的基础理论,正是这些影响深远的基础理论,奠定了分布式系统的坚实基础,造就了分布式领域的...【详细内容】
2021-04-13  Tags: 分布式系统  点击:(262)  评论:(0)  加入收藏
分布式理论知识1、分布式系统架构1.1基础概念分布式 : 将一个单体项目分成很多个模块,各个模块协同工作,各个模块构成了分布式系统集群:针对单个模块或者单个系统在多台服务器上...【详细内容】
2021-01-28  Tags: 分布式系统  点击:(110)  评论:(0)  加入收藏
一致性问题一致性问题是分布式领域最重要、最基础的问题。一致性/Consistency,是说在有多个服务节点的情况下,执行一些列操作,在约定协议的保障下,使得他们对外的处理结果,能达...【详细内容】
2020-12-15  Tags: 分布式系统  点击:(149)  评论:(0)  加入收藏
在分布式系统,尤其是微服务系统中,一次外部请求往往需要内部多个模块,多个中间件,多台机器的相互调用才能完成。在这一系列的调用中,可能有些是串行的,而有些是并行的。在这种情况...【详细内容】
2020-12-11  Tags: 分布式系统  点击:(158)  评论:(0)  加入收藏
现如今可谓是微服务、分布式、IoT(物联网)横行的时代,作为一名开发者始终还是要保持一定的危机意识,特别是在日常的项目开发中,若是有机会接触到一些关于微服务、分布式下的应用...【详细内容】
2020-12-01  Tags: 分布式系统  点击:(114)  评论:(0)  加入收藏
分布式系统如何寻址?通过 RPC 框架,能够解决服务之间的跨网络通信问题,是微服务改造的基础。服务拆分之后,需要维护更多细粒度的服务,这样就涉及到 RPC 客户端服到服务端的 部署...【详细内容】
2020-11-04  Tags: 分布式系统  点击:(103)  评论:(0)  加入收藏
上一篇《CAP》写完之后,我又反复回看了多次,发现最后的一部分表达CAP、ACID、BASE、“BACP(自造)”关系时有一些问题,并且不是很严谨,但是无奈已经发送过的内容,无法支持修改,并且有挺多小伙伴都在私聊我确认细节,这里我来重...【详细内容】
2020-09-16  Tags: 分布式系统  点击:(46)  评论:(0)  加入收藏
介绍OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。OAuth...【详细内容】
2020-08-18  Tags: 分布式系统  点击:(65)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(3)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(8)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(20)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(16)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(16)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条