etcd故障处理

1.常见问题

1.etcd 集群需要大多数节点(法定人数)才能就集群状态的更新达成一致。对于具有 n 个成员的集群,法定人数为 (n/2)+1

2.由于 etcd将数据写入磁盘,因此其性能在很大程度上取决于磁盘性能。 因此,强烈建议使用 SSDlsblk -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
其中证书文件路径和 endpoints 等信息的查询方式:
 
ps -ef | grep 'etcd-cafile'
ps -ef | grep 'etcd-servers'
 
执行 source etcdctl.env 使其生效。

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 日志

journalctl -xu etcd -n 200 #最后200行日志
journalctl -xu etcd --since "2020-01-01 12:00:00" #从 2020-01-01 12:00:00 时间点开始的所有 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 

systemctl stop etcd
    • 2——删除异常节点,正常节点执行
etcdctl member list -w table #获取异常节点的xxx-id
etcdctl member remove xxx-id
    • 3——清理异常节点 etcd 数据,异常节点执行
#一般配置文件路径/etc/etcd/etcd.env;可以查询etcd的数据目录ETCD_DATA_DIR
mv /data/lib/etcd/member /data/tmp/member
    • 4——修改 etcd 的启动配置,异常节点执行
#一般配置文件路径/etc/etcd/etcd.env
#ETCD_INITIAL_CLUSTER可能就配置了该节点的,需要把其他节点的hostname=url配置进来,https还是http需要与原来保持一致
ETCD_INITIAL_CLUSTER=node1.com=https://10.1.1.1:2380,node2.com=https://10.1.1.2:2380,node3.com=https://10.1.1.3:2380
#ETCD_INITIAL_CLUSTER_STATE修改为existing
ETCD_INITIAL_CLUSTER_STATE=existing
    • 5——添加节点,正常节点执行
etcdctl member add ${hostname} --peer-urls=https://${ip}:2380 #--peer-urls是http还是https需要与原来保持一致
    • 6——原异常节点,确认自身服务配置,name、peer-url 端口等,然后重启 etcd 服务。注意:检查 etcd.service 和 etcd.env 中的配置、端口、节点名称与上一步保持一致。
systemctl start etcd

 

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 #该路径结合自身环境调整
注意: 每个 etcd 节点上都应该添加定时任务。
crontab -e 
进入编辑模式,添加2行
# etcd_backup 
0 1 * * * /data/backup/etcd/etcd_backup.sh
每个凌晨的1点整,执行一次备份。频率可根据情况自定。