etcd集群因无效残留成员无法选主,删除成员时出现context deadline exceeded故障求助
etcd集群因无效残留成员无法选主,删除成员时出现context deadline exceeded故障求助
碰到这种情况确实头疼——集群因为残留了一个从未成功加入的无效成员,导致Raft共识无法达成(4节点集群需要3票才能选主,但那个无效节点完全不可达,就算3个正常节点也凑不出有效的多数派),连成员删除请求都因为无主而超时。我给你一套实操性强的解决方案,步骤如下:
一、先备份所有节点的etcd数据(重中之重)
不管做什么操作,先备份数据避免翻车:
# 以默认数据目录为例,根据你的实际路径调整 tar -czf etcd-data-$(date +%Y%m%d).tar.gz /var/lib/etcd
二、停止所有可用的etcd节点
先把三个正常节点的etcd服务停掉,防止集群状态进一步混乱:
# 用systemd管理的话执行这个命令 systemctl stop etcd
三、将其中一个正常节点重置为单节点集群
挑一个正常节点,修改它的启动参数,强制启动一个新的单节点集群(这一步会清除原来的无效成员记录):
- 先找到该节点原来的etcd启动配置(通常在
/etc/systemd/system/etcd.service或者自定义配置文件里) - 修改启动参数,调整如下:
- 把
--initial-cluster改成只包含当前节点的peer地址 - 将
--initial-cluster-state从existing改成new - 添加
--force-new-cluster参数
举个实际例子:
etcd --name node1 \ --initial-advertise-peer-urls https://10.0.0.1:2380 \ --listen-peer-urls https://10.0.0.1:2380 \ --listen-client-urls https://10.0.0.1:2379,http://127.0.0.1:2379 \ --advertise-client-urls https://10.0.0.1:2379 \ --initial-cluster node1=https://10.0.0.1:2380 \ --initial-cluster-token etcd-cluster-1 \ --initial-cluster-state new \ --force-new-cluster - 把
- 启动这个节点,此时它会成为一个独立的单节点etcd集群,你可以用etcdctl验证:
此时列表里应该只有这一个节点,原来的无效成员已经被清除了。etcdctl --endpoints=https://10.0.0.1:2379 member list
四、重新加入另外两个正常节点
现在把剩下的两个正常节点重新加入到这个单节点集群:
- 先在单节点上执行添加成员的命令:
# 添加node2 etcdctl --endpoints=https://10.0.0.1:2379 member add node2 --peer-urls=https://10.0.0.2:2380 # 添加node3 etcdctl --endpoints=https://10.0.0.1:2379 member add node3 --peer-urls=https://10.0.0.3:2380 - 分别修改node2和node3的启动参数,去掉
--force-new-cluster,把--initial-cluster-state改回existing,并且--initial-cluster包含当前单节点和自身的地址,然后启动服务:
比如node2的启动参数:etcd --name node2 \ --initial-advertise-peer-urls https://10.0.0.2:2380 \ --listen-peer-urls https://10.0.0.2:2380 \ --listen-client-urls https://10.0.0.2:2379,http://127.0.0.1:2379 \ --advertise-client-urls https://10.0.0.2:2379 \ --initial-cluster node1=https://10.0.0.1:2380,node2=https://10.0.0.2:2380 \ --initial-cluster-token etcd-cluster-1 \ --initial-cluster-state existing - 启动node2和node3的etcd服务:
systemctl start etcd
五、验证集群恢复状态
等所有节点启动完成后,检查集群健康:
curl https://10.0.0.1:2379/health
正常情况下会返回{"health":"true"},再查看成员列表确认只有三个正常节点:
etcdctl --endpoints=https://10.0.0.1:2379 member list
这样操作后,集群就能恢复正常的选主和共识能力了,核心思路就是先通过强制单节点集群清除无效成员,再重新组建正常的3节点集群。
备注:内容来源于stack exchange,提问作者Igor Artamonov
相关产品推荐
相关产品推荐

