图解 ETCD|基本概念|组件架构|内部通信

ETCD 基本概念

术语描述备注
Raftetcd实现一致性的核心etcd有etcd-raft模块
FollowerRaft中的从属节点竞争leader失败
LeaderRaft中的领导协调节点Leader 节点协调整个集群
Candidate候选节点当Follower接受Leader节点的消息超时会转变为Candidate
NodeRaft 状态机的实例Raft 中涉及多个节点
Memberetcd实例,管理着对应的Node节点可处理客户端请求
Peer同一集群中的另一个Member其他成员
Clusteretcd集群拥有多个etcd Member
Lease租期关键设置的租期,过期删除
Watch检测机制监控键值对的变化
Term任期某个节点成为Leader,到下一次竞选的时间
WAL预写式日志用户持久化存储的日志格式
Client客户端向etcd发起请求的客户端

ETCD 核心架构

在这里插入图片描述

  • gRPC Server:etcd与其他etcd节点之间的通信和信息的同步
  • MVCC:多版本控制,etcd的键值对的每一次操作行为都会被记录存储。这些数据底层存储在BoltDB数据库中。
  • ETCD Server:对外接受和处理客户端的请求
  • Snapshot:快照,以防WAL日志过多用于存储某一时刻etcd的所有数据。
  • WAL:预写式日志,etcd中的数据提交前都会记录到日志中
  • Raft:数据一致性算法

ETCD 网关 和 gRPC-gateway

ETCD网关:构建etcd集群的门户

  • ETCD网关是一个简单的TCP代理,可将网络数据转发到ETCD集群中。
  • 网关是无状态且透明的,既不会检查客户端请求,也不会干扰集群响应,支持多个etcd服务实例。

如果同一服务器上的多应用程序访问的ETCD集群,每个应用程序仍然需要知道ETCD集群的广播客户端断点地址,如果发生etcd集群实例的变更,只需要网关更新其端点即可。

总而言之:为了自动传播集群端点更改,etcd网关在每台机器上都运行,为多个应用提供访问相同的etcd集群服务。

gRPC-Gateway:为非gRPC的客户端提供HTTP接口

HTTP的方式访问etcd服务端,需要考虑安全的问题,gRPC-Gateway中提供的API接口支持开启安全认证。
有的语言客户端不支持gRPC通信协议,此时就可以使用gRPC-Gateway对外提供HTTP API接口,通过HTTP请求,实现与gRPC调用协议同样的功能。

gRPC-proxy

可伸缩的 watch API

如果客户端监视同一键或某一范围内的键,gRPC代理可以将这些客户端程序(c-watcher)合并为链接到etcd服务器的单个监视程序(s-watcher),当watch事件发生时,代理将所有事件(s-watcher)广播到其(c-watcher)。
在这里插入图片描述

为了有效地将多个客户端监视程序合并为一个监视程序,gRPC代理在可能的情况下将新的c-watcher合并为现有地s-watcher,也有负载均衡的效果。

另外如果没有指定监视版本,gRPC代理将不能保证c-watcher从最近的存储修订版本开始监视。

可伸缩的 lease API

如果 ETCD 工作负载涉及很多的客户端租约活动,这些流可能会导致CPU使用率过高,为了减少核心集群上的流总数,gRPC代理支持将lease流合并

在这里插入图片描述
可以缓存请求的响应,这个功能可以保护ETCD服务器免遭恶意for循环中滥用客户端的攻击。

ETCD 组件架构

包名用途
auth访问权限
client/clientv3Go语言客户端SDK
embed主要是etcd的config
etcdmain入口程序
etcdctl命令行客户端实现
etcdserverserver主要的包
functional/hackCMD、Dockerfile 之类的杂项
integration和etcd集群相关
lease租约相关
mvccetcd的底层存储,包含Watch实现
pkg、proxyetcd使用的工具集合
raftraft算法模块
wal日志模块
scripts/security/tests/tools/version脚本、测试等相关内容

ETCD的交互总览

在这里插入图片描述

  • etcd Server:接收客户端的请求,在上述的etcd项目代码中对应etcd server包。etcd server中的raft模块,用于与etcd-raft库进行通信。
  • etcd Raft :etcd的raft库,raft库更重要的式负责与集群中的其他etcd server进行交互,实现分布式下的数据一致性。
    在这里插入图片描述

首先写数据到etcd节点中,然后当前的etcd节点与集群中的其他etcd节点之间进行通信,确认存储数据成功之后回复客户端。

在raft协议中写入数据的etcd必定式leader节点,如果客户端提交数据到非leader节点时,该节点需要将请求转发到etcd leader节点处理

在这里插入图片描述

etcd的gRPC通信接口

Client定义

type Client struct{
	Cluster  // 向集群里增加etcd服务端节点之类,属于管理员操作
	KV // 我们主要使用的功能,即操作K-V
	Lease // 租约相关操作,比如申请一个TTL=10s的租约
	Auth // 管理ETCD的用户和权限 属于管理员操作
	Watcher // 观察订阅,从而监听最新的数据变化
	Maintenance // 维护etcd,比如主动迁移etcd的leader节点,管理员操作
	UserName string // 认证的用户名
	Password string // 认证的密码
}

etcd的核心API

  • KV Service :创建、更新获取和删除键值对
  • Watch Service :监视键的更改
  • Lease Service : 实现键值对过期客户端用来续租保持心跳
  • Lock Service : etcd提供分布式共享锁支持
  • Election Service :暴露客户端选举机制

读写过程概述

读请求

客户端通过负载均衡选择一个etcd节点,发出读请求,API接口层提供Range RPC方法,etcd服务端 拦截gRPC 读取 请求后调用相应的处理器处理请求。

  1. etcdctl会创建一个clientv3库对象,选取一个合适的etcd节点
  2. 调用KV Server模块的Range RPC方法,发送请求
  3. 拦截器拦截,主要做一些校验和监控
  4. 调用KV Server模块的Range接口获取数据

线性读:线性读是相对串行读来讲的概念,集群模式下会有多个etcd节点,不同节点可能存在一致性问题,串行读直接返回状态数据,不需要与集群中其他节点交互,这种方式速度快,开销小,但是会存在数据不一致的情况。

线性读需要集群成员之间达成共识,存在开销,响应速度相对满,但是能保证数据的一致性 etcd默认读模式是线性读。

etcd中的查询请求,查询单个键或一组键以及查询数量,到底层实际会调用Range keys方法。

在这里插入图片描述

  1. 在 treeIndex 中根据BTree快速查询该键对应索引项keyIndex,索引项中包含Revision
  2. 据查询到的版本号信息Revision,在Backend的缓存Buffer中用二分查找,如命中则直接返回
  3. 若缓存中不符合条件,在BlotDB中查找(基于BlotDB的索引),查询后返回键值对信息

写请求

客户端通过负载均衡选择一个etcd节点发起写请求etcd服务器拦截gRPC写请求,涉及校验和监控后,KV Server 向 raft模块发提案,内容为写入数据命令,经网络转发,当集群中多数节点达成一致,持久化数据后,状态变成MVCC模块执行提案内容。

  1. 客户端通过负载均衡算法选择一个etcd节点,发起grpc调用。
  2. etcd server 收到客户端请求。
  3. 经过gRPC拦截,Quota 校验,Quota 模块用于校验etcd db文件大小是否超过配额。
  4. KV Server模块将请求发送给本模块中的raft,负责与etcd raft模块进行通信发起一个提案。
  5. 提案经过转发之后,半数节点成功持久化。
  6. MVCC模块更新状态机。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小生凡一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值