《蹲坑学kubernetes》之8-1:Etcd架构详解

Etcd是CoreOS团队于2013年6月基于Go语言发起的开源项目,它的目标是构建一个高可用强一致性的服务发现存储的分布式键值(key-value)数据库。主要用途是共享配置和服务发现。Etcd已经在很多分布式系统中得到广泛的使用。

图1:Kubernetes之Log

一、Etcd的提点有以下四点:

简单:基于HTTP+JSON的API让你用curl就可以轻松使用。安全:可选SSL客户认证机制。快速:每个实例每秒支持一千次写操作。可信:使用Raft算法充分实现了分布式。

二、Etcd的应用场景:

服务在分布式系统中“服务发现”也是比较常见的问题:在同一个集群环境中不同的应用或服务,如何能够找到对方并建立连接,来完成后续的行为。本质上来说,服务发现就是想要知道集群中是否有进程在监听udp或tcp端口,并能通过名字就可以查找和连接。而要解决服务发现的问题,需要满足如下三个方面,缺一不可。

强一致性、高可用的服务存储目录: 基于Raft算法的etcd天生就是这样一个强一致性高可用的服务存储目录【安全的记录集群中的应用或服务的信息(地址、端口等)】。注册服务和监控服务健康状态的机制:用户可以在etcd中注册服务,并且对注册的服务设置key TTL,定时保持服务的心跳以达到监控健康状态的效果。【能够完成新的应用或服务的注册添加进来,同样也能对现有的服务是否可用进行监控】查找和连接服务的机制: 通过在etcd指定的主题下注册的服务也能在对应的主题下查找到。为了确保连接,我们可以在每个服务机器上都部署一个Proxy模式的etcd,这样就可以确保能访问etcd集群的服务都能互相连接。【已有的服务当被使用能够被找到并能连接】

如图所示:

图2:服务发现

微服务协同工作架构中,服务动态添加。随着Docker容器的流行,多种微服务共同协作,构成一个相对功能强大的架构的案例越来越多。透明化的动态添加这些服务的需求也日益强烈。通过服务发现机制,在etcd中注册某个服务名字的目录,在该目录下存储可用的服务节点的IP。在使用服务的过程中,只要从服务目录下查找可用的服务节点去使用即可。

图3:微服务结构图

其他应用场景:

消息发布与定义(非高频)分布式锁分布式消息队列分布式进程心跳监控

三、Etcd主要分为四个部分:

图4:Etcd结构图

HTTP Server:用于处理用户发送的API请求以及其它etcd节点的同步与心跳信息请求。Store:用于处理etcd支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是etcd对用户提供的大多数API功能的具体实现。Raft:Raft强一致性算法的具体实现,是etcd的核心。WAL:Write Ahead Log(预写式日志):是etcd的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。WAL中,所有的数据提交前都会事先记录日志。Snapshot是为了防止数据过多而进行的状态快照;Entry表示存储的具体日志内容。

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

四、Etcd原理:

Etcd群集是一个分布式系统,由多个节点相互通信且构成一个整体对外提供服务,每一个节点存储了完整的数据,并且通过Raft协议保证每节点维护的数据是一致的。

图5:Etcd原理

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