分布式系统 Etcd 解析

随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商以及企业只能望洋兴叹 。此时,分布式系统的出现无疑给大家带来了些许振奋 。而后随着大数据、区块链技术以及云计算技术的蓬勃发展,将分布式系统推向新的高潮 。
据不完全统计,截止目前,几乎在全球的任何一家互联网企业,无论规模大小,或多或少都有使用到分布式技术 。基于不同的业务场景以及实现方案,有些可能注重计算,有些或许注重存储 。无论是基于具体哪种场景、模型,无不表明分布式系统在企业技术发展过程中的重要性以及必要性 。
在本文中,我将主要围绕 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.8Git SHA: 33245c6b5Go Version: go1.9.7Go 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【分布式系统 Etcd 解析】基于上述的命令行操作,我们可以看出,当创建某个 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 则表示存储的具体日志内容 。


推荐阅读