【基础架构】分布式系统Ectd解析
原文:https://mp.weixin.qq.com/s?__biz=MzA4MjM3NzE5MQ==&mid=2649662420&idx=1&sn=479a9b6a7ffa7be08686c538bfc7e56f&chksm=879ca35cb0eb2a4ab916888529869d0e5454860aa02cc0a11cd0e77156a0a3250d96b67be3d8&scene=178&cur_album_id=1987595953092034565#rd
本文主要围绕Etcd这一个分布式K-V数据库为主,探讨一下分布式存储技术的核心原理以及源码实现。
一、Etcd简介(什么是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的相关操作以及目录情况,如下所示:
docker pull quay.io/coreos/etcd
docker run -it -d -p 2379:2379 -p 2380:2380 --name etcd quay.io/coreos/etcd
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
二、Etcd架构
基于上述架构图分层的形式,可以将etcd分为表现层、网络层、应用层和数据层。具体如下:
表现层:该层主要包含相关命令行操作工作,以及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节点以确认数据提交,最后进行数据的提交,再次同步。
三、ectd应用场景
etcd是一个高可用强一致性的键值数据库,在很多分布式系统架构中得到了广泛的应用,最经典的使用场景是服务发现。也可能有人问Zookeeper不香么?基于Zookeeper当前的业务使用场景,结合微服务体系及云原生K8s生态支持层面,Zookeeper存在以下相关缺陷:
1、复杂性,Zookeeper基于Paxos强一致性算法以复杂难懂闻名
2、生态发展滞后
3、笨重,Zookeeper基于Java语言开发
相比较而言,etcd已融入云原生生态领域,基于Go语言开发,高性能,基于HTTP作为接口使用简单、方便,使用Raft算法保证强一致性让用户易于理解。etcd在服务发现领域优势:
1、强一致性、高可用。基于Raft算法的Etcd是一个强一致性高可用的服务存储目录。
2、注册服务和监控服务健康状态的机制,用户可以在etcd中注册服务,并且对注册的服务设置key TTL,定时保持服务的心跳以达到监控健康状态的效果。
3、查找和连接服务的机制。通过在etcd指定的主题下注册的服务也能在对应的主题下查找到。