etcd基础

发布时间 2023-10-08 14:36:41作者: 流年似水zlw

etcd 是一个分布式、高可用的键值对存储数据库,通过分布式锁、leader选举和写屏障等机制提供安全可靠、高效快速的持久性数据存储和检索。

1. etcd集群

采用raft协议复制到所有节点保证各节点数据一致性
需要半数以上节点正常运行集群才可正常运行
只要有一个节点正常运行就可正常读取数据,不过是非一致性读请求,需要开启一个选项:
SDK 访问需要配置 WithSerializable 选项(默认并不开启)
etcdctl 访问需要配置 --consistency=s 选项
若有节点挂掉,重启后会自动同步集群数据,保证数据一致性
移除 leader 是安全的,但是在选举过程发生的期间有短暂的停机时间
对于apisix,即使整个etcd集群挂掉也可以正常转发请求,因为配置数据已经读取到内存里了,只是不能做新增修改操作

2. 集群配置

$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380
--listen-peer-urls http://10.0.1.10:2380
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379
--advertise-client-urls http://10.0.1.10:2379
--initial-cluster-token etcd-cluster-1
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380
--initial-cluster-state new
以 --initial-cluster 开头的命令行参数将在 etcd 随后的运行中被忽略,可以在初始化启动进程之后随意的删除环境变量或者命令行标记,也就是只在节点启动的时候起作用
etcd 支持对渐进的运行时集群进行重配置,这容许用户在运行时更新集群成员(升级、添加、移除等),所有集群的改动一次一个的完成。
在etcd中,为了安全每个运行时重配置必须通过两阶段来完成,即通知集群新配置和启动新成员。

3. 配置参数

3.1 成员参数
--name 节点唯一名称,建议主机名
--data-dir 数据目录路径
--wal-dir wal目录路径
--heartbeat-interval 心跳间隔时间
--election-timeout 选举超时时间
--listen-peer-urls 与其他节点进行通信的监听地址列表
--listen-client-urls 与客户端进行通信的监听地址列表
3.2 集群参数
--initial 前缀标记用于启动或运行时重配置新成员,当重新启动一个已有的成员时被忽略
--initial-advertise-peer-urls 通知其他节点与本节点进行通信的地址列表,可以使用域名,一般是listen-peer-urls的子集
--advertise-client-urls 通知其他节点客户端接入本节点的地址列表,可以使用域名,一般是listen-client-urls的子集
--initial-cluster 初始化集群配置,应该包含所有初始节点信息
--initial-cluster-token 集群唯一标识,相同标识的节点将视为在一个集群内
--initial-cluster-state 初始集群状态,new为初始静态或DNS引导期间出现的所有成员,existing则将尝试加入已有集群
3.3 安全参数
--trusted-ca-file 客户端服务器的路径TLS可信CA证书文件
--cert-file 客户端服务器TLS证书文件的路径
--key-file 客户端服务器TLS密钥文件的路径

4.节点故障

4.1 follower故障
正常情况下,发送到follower的读请求会直接处理,而写请求则会转发给leader处理,当少于一半的follower故障时,并不会影响整个集群的正常运行,但是客户端将不能发送请求到故障节点,所以需要更新客户端连接地址列表,当连接到故障节点时,客户端一般会自动重新连接到其他节点。
对于写请求来说,如果故障时请求已经转发给leader,那请求就不会丢失,如果故障时请求还没发到该节点,则会失败然后重试到其他节点,也不会丢失,如果请求已经发送到该节点,但还没有转发给leader,则可能会丢失。
4.2 leader故障
当leader故障时, etcd集群自动选举一个新的leader,在选举期间,集群不能处理任何写请求。
在选举期间发送的写请求将排队等待处理直到新的leader被选举出来,已经发送给旧leader但是还没有提交的写请求可能会丢失。
从用户的角度,在新的 leader 选举之后某些写请求可能超时。无论如何,已提交的请求从来不会丢失。
etcd 集群自动从临时故障(例如,机器重启)中恢复,当集群的大多数成员故障时,etcd 集群故障并无法接收更多写请求,也无法自动恢复。

5. 备份恢复

5.1 集群备份
恢复集群首先需要来自etcd成员的键空间的快照,快照可以用 etcdctl snapshot save 命令从活动成员获取,或者是从数据目录复制 member/snap/db 文件。
5.2 集群恢复
为了恢复集群,需要的只是一个简单的快照 “db” 文件,使用 etcdctl snapshot restore 命令创建新的数据目录,所有成员应该使用相同的快照恢复。
然后,用新的数据目录启动 etcd,相当于创建一个新的集群,需要等所有初始化节点都启动成功后,才能正常运行。