etcd基础

etcd 是一个分布式、高可用的键值对存储数据库,能够安全可靠的保存关键数据并提供访问,并基于raft协议保证数据一致性。通过分布式锁、leader选举和写屏障等机制提供安全可靠、高效快速的持久性数据存储和检索。

etcdctl 是一个和 etcd 服务器交互的命令行工具。

概念术语

  • Raft:etcd 所采用的保证分布式系统强一致性的算法。
  • Node:一个 Raft 状态机实例。
  • Member:一个 etcd 实例。它管理着一个 Node,并且可以为客户端请求提供服务。
  • Cluster:由多个 Member 构成可以协同工作的 etcd 集群。
  • Peer:对同一个 etcd 集群中另外一个 Member 的称呼。
  • Client:向 etcd 集群发送 HTTP 请求的客户端。
  • WAL:预写式日志,etcd 用于持久化存储的日志格式。
  • snapshot:etcd 防止 WAL 文件过多而设置的快照,存储 etcd 数据状态。
  • Proxy:etcd 的一种模式,为 etcd 集群提供反向代理服务。
  • Leader:Raft 算法中通过竞选而产生的处理所有数据提交的节点。
  • Follower:竞选失败的节点作为 Raft 中的从属节点,为算法提供强一致性保证。
  • Candidate:当 Follower 超过一定时间接收不到 Leader 的心跳时转变为 Candidate 开始竞选。
  • Term:某个节点成为 Leader 到下一次竞选时间,称为一个 Term。
  • Index:数据项编号。Raft 中通过 Term 和 Index 来定位数据。

1. etcd集群

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

etcd 支持对渐进的运行时集群进行重配置,这容许用户在运行时更新集群成员(添加、移除、升级等),重配置请求仅能在集群成员的大多数正常工作时可以处理,所有集群的改动一次一个的完成。
在etcd中,为了安全每个运行时重配置必须通过两阶段来完成,即通知集群新配置和启动新成员。

etcd支持严格重配置检查选项--strict-reconfig-check以便拒绝会导致法定人数丢失的重配置请求,推荐开启这个选项,为了保持兼容它被默认关闭。

2. 集群配置

2.1 基本配置

$ 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 随后的运行中被忽略,可以在初始化启动进程之后随意的删除环境变量或者命令行标记,也就是只在节点启动的时候起作用。

2.2 安全配置

etcd 支持通过 TLS 协议的加密通讯。TLS 通道可以用于加密伙伴间的内部集群通讯,也可以用于加密客户端请求。使用自签名证书证书(self-signed certificates)的集群同时加密请求并认证它的连接。要启动使用自签名证书的集群,每个集群成员应该有一个唯一的通过共享的集群CA证书来签名的键对(key pair) (member.crtmember.key),用于伙伴连接和客户端连接。

在每台机器上,etcd可以添加以下标记来启动TLS加密通讯:

--client-cert-auth --trusted-ca-file=/path/to/ca-client.crt
--cert-file=/path/to/infra0-client.crt --key-file=/path/to/infra0-client.key
--peer-client-cert-auth --peer-trusted-ca-file=ca-peer.crt
--peer-cert-file=/path/to/infra0-peer.crt --peer-key-file=/path/to/infra0-peer.key

注意:2.1中的监听地址也要相应改成https。

2.3 自动证书

如果集群需要加密通讯,但是不需要认证连接,etcd 可以配置为自动生成 key。在初始化时,每个集群基于它的通告IP(advertised IP) 地址和主机名创建它自己的 key 集合。

在每台机器上,etcd 可以添加以下标记来自动生成证书:

--auto-tls
--peer-auto-tls

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 安全参数

--client-cert-auth 开启client证书认证
--trusted-ca-file client server TLS 信任证书文件的路径
--cert-file client server TLS 证书文件的路径
--key-file client server TLS 密钥文件的路径
--peer-client-cert-auth 开启 peer client 证书验证
--peer-trusted-ca-file peer server TLS 信任证书文件路径
--peer-cert-file peer server TLS 证书文件的路径
--peer-key-file peer server TLS 密钥文件的路径
--auto-tls 使用自动生成证书的client TLS
--peer-auto-tls 使用自动生成证书的peer TLS

4.节点故障

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

4.3 大多数故障
etcd 集群自动从临时故障(例如,机器重启)中恢复,当集群的大多数成员故障时,etcd 集群故障且无法自动恢复,只能基于快照创建一个新集群。

5. 备份恢复

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

6. 常用参数

vim /data/etcd/etcd.conf
name: default data
-dir: default.etcd initial-advertise-peer-urls: http://127.0.0.1:2380 listen-peer-urls: http://127.0.0.1:2380 advertise-client-urls: http://127.0.0.1:2379,http://127.0.0.1:2379 listen-client-urls: http://127.0.0.1:2379,http://127.0.0.1:2379 initial-cluster: initial-cluster-state: new initial-cluster-token: etcd-token heartbeat-interval: 100 election-timeout: 1000 quota-backend-bytes: 2147483648 max-request-bytes: 1572864 auto-compaction-mode: periodic auto-compaction-retention: "1" logger: zap

vim /usr/lib/systemd/system/etcd.service

[Unit]
Description=etcd key-value store
Documentation=https://github.com/etcd-io/etcd
After=network.target


[Service]
Type=simple
ExecStart=/usr/local/bin/etcd --config-file=/data/etcd/etcd.conf
Restart=on-failure
LimitNOFILE=65536


[Install]
WantedBy=multi-user.target

7. 监控

7.1 重点监控指标

      可使用 kube-prometheus 收集 etcd 指标,启动增加metrics参数即可: --listen-metrics-urls=http://127.0.0.1:2381,http://ip:2381 

     指标分类

  • 健康状态
  • USE 方法(系统)
    • 使用率
    • 饱和度
    • 错误
  • RED 方法(应用)
    • 请求速率
    • 错误率
    • 延迟
指标分类指标释义
健康状态 实例健康状态 etcd是一个分布式系统,由多个成员节点组成。监控etcd成员节点的状态可以帮助你了解集群中节点的健康状况,发现掉线或者异常节点。
健康状态 主从状态  集群是否拥有领导者节点以及领导者节点数量。
健康状态 etcd leader切换统计 频繁的领导者变更会严重影响 etcd 的性能。这也意味着领导者不稳定,可能是由于网络连接问题或对 etcd 集群施加的过载负荷导致的。
健康状态 心跳 etcd集群中的节点通过发送心跳来保持彼此之间的连接。监控丢失的心跳可以帮助你发现etcd节点之间的通信问题或者网络延迟。
RED 方法 QPS  每秒请求数量,可以衡量集群的负载情况。
RED 方法 请求错误率 监控etcd的错误率可以帮助你发现etcd操作中的潜在问题。高错误率可能表明集群遇到了故障或其他异常情况。
RED 方法 请求延迟 监控etcd的请求延迟可以帮助你了解API请求的处理时间。较高的延迟可能表明etcd正面临负载压力或性能问题。
RED 方法 磁盘同步(WAL/DB fsync)耗时 高磁盘操作延迟(wal_fsync_duration_seconds或backend_commit_duration_seconds)通常表示磁盘问题。它可能会导致高请求延迟或使群集不稳定。
RED 方法 同步延迟 如果集群正常运行,已提交的提案应该随着时间的推移而增加。重要的是要在集群的所有成员中监控这个指标;如果单个成员与其领导节点之间存在持续较大的滞后,这表明该成员运行缓慢或存在异常。
RED 方法 提案失败次数 失败的提案通常与两个问题相关:与领导选举相关的暂时性故障或由于集群丧失法定人数而导致的较长时间的停机。
RED 方法 快照处理时间 etcd定期创建快照以备份数据。监控快照处理时间可以帮助你了解etcd备份的性能,确保备份任务能够及时完成。
RED 方法 watcher 数量 监控etcd集群当前连接到etcd的客户端数量。如果连接数过高,可能需要调整etcd的配置或者增加集群的容量。
USE 方法 CPU 使用率  
USE 方法 内存使用量  
USE 方法 打开文件数  
USE 方法 存储空间使用率 监控etcd存储空间的使用率可以帮助你确保etcd有足够的空间存储配置数据。如果使用率接近或达到上限,可能需要考虑扩展存储容量或者清理无用的数据。

7.2 性能补充

Etcd 对内存和 CPU 消耗并不高,足够就行。

一次 Etcd 请求的最小时间 = 成员节点之间的网络往返时延 + 收到数据之后进行持久化的时延。因此,Etcd 的性能主要受两方面的约束:

  • 网络
  • 磁盘

多节点的 Etcd 集群成员节点应该尽量部署在同一个数据中心,减少网络时延。同一数据中心内,不同节点的网络情况通常是非常好的,所以磁盘IO性能会Etcd的性能影响就比较重要。已运行的 etcd 集群,通过指标etcd_disk_wal_fysnc_duration_seconds来评估存储 I/O 性能, 该指标记录了 WAL 文件系统调用 fsync 的延迟分布,当 99% 样本的同步时间小于 10 毫秒就可以认为存储性能能够满足 etcd 的性能要求。

8. Raft小结

Raft算法从选举开始,当跟随者超时之后转为候选者发起选举,然后向其他跟随者发送自己的任期号、日志尾部条目的索引和任期号;跟随者收到投票请求后,如果对方的任期号大于自己的任期号、并且对方的日志更新,则同意投票。候选者得到大多数选票后成为领导者。

领导者负责处理客户端请求并将日志条目同步到其他跟随者的日志当中。当领导者收到客户端新请求后,要将新的日志条目发送给跟随者,并附带prevIndex、prevTerm,跟随者确定自己没有缺失之前的条目后确认添加,领导者得到大多数跟随者的确认后将命令提交。没有条目要发送的时候领导者向跟随者发送心跳信息避免跟随者发起选举。

当服务器的日志到达一定的大小之后,需要通过快照来进行压缩。快照保存了服务器的状态,还有包括的最后一条日志条目的索引和任期号,用于领导者进行日志同步。发送快照可以让一些落后很多的跟随者快速地来到和领导者接近的状态。

posted on 2023-10-08 14:32  流年似水zlw  阅读(97)  评论(0编辑  收藏  举报

导航