我的集群不健康,etcd
因为一个成员无法加入。该成员不存在,并且etcd
卡在选择领导者的过程中。
即,有一个包含 3 个节点的集群,其中一个节点尝试加入但失败了,现在集群有 4 个成员,其中一个不可用。etcd
开始选择一个领导者,并停留在该状态。
因此,etcdctl
不再起作用。但我可以使用 访问节点 API curl
。
显然,这是不健康的:
curl https://10.0.0.1:2379/health
{"health":"false","reason":"RAFT NO LEADER"}
成员列表返回一个包含 4 名成员的列表:
curl https://10.0.0.1:2379/v2/members | jq
{
"members": [
{
"id": "32ee161a1cedcf0a",
"name": "",
"peerURLs": ["https://10.0.0.13:2380"],
"clientURLs": []
},
+3 more, which are actual nodes
}
当我尝试删除它时出现错误:
curl https://10.0.0.1:2379/v2/members/32ee161a1cedcf0a -XDELETE
{"message":"Internal Server Error"}
日志中etcd
有:
... "caller":"v2http/client.go:267","msg":"failed to remove a member","member-id":"32ee161a1cedcf0a","error":"context deadline exceeded"}
... "caller":"etcdhttp/base.go:136","msg":"unexpected v2 response error","remote-addr":"10.0.0.1:41562","internal-server-error":"context deadline exceeded"}
所有其他日志都etcd
试图就领导者选择和超时达成共识。
据我了解,节点的不健康状态不允许它接受/传播任何更改,包括对成员列表的更改。但要修复此不健康状态,我需要更改成员列表。
该如何处理这种状态?