etcd故障处理
- etcd
- 2025-11-05
- 0评论
1.常见问题
1.etcd 集群需要大多数节点(法定人数)才能就集群状态的更新达成一致。对于具有 n 个成员的集群,法定人数为 (n/2)+1。
2.由于 etcd将数据写入磁盘,因此其性能在很大程度上取决于磁盘性能。 因此,强烈建议使用 SSD。lsblk -o NAME,ROTA查看ROTA属性。对于SSD,它通常是0;而HDD则是1。
3.磁盘延迟是领导者活跃度的一部分。假设集群领导者需要一分钟才能将 raft日志更新同步到磁盘,但 etcd 集群的选举超时时间为一秒。即使领导者可以在选举间隔内处理网络消息(例如,发送心跳),但它实际上不可用,因为它无法提交任何新提案;它正在等待慢速磁盘。
4.跨区域部署 etcd 可提高 etcd 的容错能力,因为成员位于不同的故障域中。但代价是跨数据中心边界的共识请求延迟更高。由于 etcd 依靠成员仲裁达成共识,跨数据中心的延迟会更加明显,因为至少大多数集群成员必须响应共识请求。此外,集群数据必须在所有对等节点之间复制,因此也会有带宽成本。如果延迟较长,默认的 etcd 配置可能会导致频繁选举或心跳超时。
2.查询命令
etcdctl 工具依赖比较多的选项参数,把相关参数变量放到一个变量文件中统一配置,方便使用。文件名随意,可以名为 etcdctl.env,添加如下内容:
export ETCDCTL_API=3
export ETCDCTL_CACERT=/etc/kubernetes/ssl/etcd/ca.crt
export ETCDCTL_CERT=/etc/kubernetes/ssl/etcd/etcdctl-etcd-client.crt
export ETCDCTL_KEY=/etc/kubernetes/ssl/etcd/etcdctl-etcd-client.key
export ETCDCTL_DIAL_TIMEOUT=10s
export ETCDCTL_ENDPOINTS=https://10.0.1.101:2379,https://10.0.1.102:2379,https://110.0.1.103:2379
2.1 etcd 集群状态
#集群成员清单
etcdctl -wtable member list
#集群主从同步情况
etcdctl -wtable endpoint status
etcdctl -wtable endpoint health
# 检查etcd节点数据一致性
etcdctl -wtable endpoint hash #备注:如果检查的数据的hash值不一致,需要人工介入;将异常的节点etcd服务停掉,然后将其摘除etcd集群,将其etcd数据member目录移走,再行重新加入etcd集群,重新启动etcd服务
#查询数据
etcdctl get --keys-only --prefix "" #Etcd 中获取所有键的列表
etcdctl get --prefix "/registry/storageclasses/local-path" #Etcd 中获取所有以 /registry/storageclasses/local-path 开头的键及其对应的值
#查询etcd状态,不涉及网络io
unset ETCDCTL_ENDPOINTS
etcdctl endpoint health -w table --endpoints=127.0.0.1:2379
etcdctl endpoint status -w table --endpoints=127.0.0.1:2379
2.2 etcd 日志
3. 磁盘 I/O 观测
3.1 磁盘 I /O 观测:iostat -d -k -x 1 10
%util:磁盘 I /O 使用率,是指磁盘处理 I/O 的时间百分比。过高的使用率(比如超过 80%),通常意味着磁盘 I/O 存在性能瓶颈

4.etcd 修复
4.1 故障类型1
-
描述:仅一个 etcd 节点状态异常且无法自愈。
-
方案:删除异常节点,然后重新加入。
-
官方文档:
-
步骤:
-
1——停止异常节点 etcd 服务,异常节点执行
-
-
-
2——删除异常节点,正常节点执行
-
-
-
3——清理异常节点 etcd 数据,异常节点执行
-
-
-
4——修改 etcd 的启动配置,异常节点执行
-
-
-
5——添加节点,正常节点执行
-
-
-
6——原异常节点,确认自身服务配置,name、peer-url 端口等,然后重启 etcd 服务。注意:检查 etcd.service 和 etcd.env 中的配置、端口、节点名称与上一步保持一致。
-
5.定时备份
#!/bin/bash
# 下列所有变量,根据自身环境调整到正确值
# 其中证书路径和endpoints等信息的查询方式
# ps -ef | grep 'etcd-cafile'
# ps -ef | grep 'etcd-servers'
createdDate=`date +%Y-%m-%d-%H-%M`
backupFile="snapshot.db.$createdDate"
ETCDCTL_API=3 /usr/local/bin/etcdctl \
--endpoints="https://127.0.0.1:2379" \
--cacert="/etc/etcd/pki/ca.crt" \
--cert="/etc/etcd/pki/etcdctl-etcd-client.crt" \
--key="/etc/etcd/pki/etcdctl-etcd-client.key" \
snapshot save /data/backup/etcd/$backupFile #该路径结合自身环境调整
