从 Consul "No Cluster leader" 状态恢复

Recovering from Consul "No Cluster leader" state

我有:

当我点击开始时,我看到以下错误:

2016/04/21 19:31:31 [ERR] agent: failed to sync remote state: rpc error: No cluster leader 2016/04/21 19:31:44 [ERR] agent: coordinate update error: rpc error: No cluster leader

如何从这种状态中恢复?

你看过 Consul docs 了吗?

您似乎执行了一次不正常的停止,现在需要通过删除那里的所有条目来清理您的 raft/peers.json 文件以执行中断恢复。详情见上文link。

从 Consul 0.7 开始,事情与 Keyan P 的回答有所不同。 raft/peers.json(在 Consul 数据目录中)已成为手动恢复机制。除非您创建它,否则它不存在,然后当 Consul 启动时,它会加载文件并将其从文件系统中删除,这样它就不会在以后的启动中被读取。 raft/peers.info中有说明。请注意,如果您删除 raft/peers.info,它不会读取 raft/peers.json,但无论如何都会删除它,并且会重新创建 raft/peers.info。日志将指示它何时分别读取和删除文件。

假设您已经尝试过 bootstrapbootstrap_expect 设置,该文件可能会有所帮助。 Keyan P 的回答中的 Outage Recovery guide 很有帮助 link。您在数据目录中创建 raft/peers.json 并启动 Consul,日志应指示它是 reading/deleting 文件,然后它应该显示类似 "cluster leadership acquired" 的内容。文件内容为:

[ { "id": "<node-id>", "address": "<node-ip>:8300", "non_voter": false } ]

其中 <node-id> 可以在数据目录的 node-id 文件中找到。

如果你的 raft 版本超过 2:

[ { "id": "e3a30829-9849-bad7-32bc-11be85a49200", "address": "10.88.0.59:8300", "non_voter": false }, { "id": "326d7d5c-1c78-7d38-a306-e65988d5e9a3", "address": "10.88.0.45:8300", "non_voter": false }, { "id": "a8d60750-4b33-99d7-1185-b3c6d7458d4f", "address": "10.233.103.119", "non_voter": false } ]

在我的例子中,我在 k8s 集群中有 2 个工作节点,在添加另一个节点后,consul 服务器可以选出一个主服务器,一切都已启动 运行。

我会更新我所做的: 小背景:我们缩减了 AWS Autoscaling,因此失去了领导者。但是我们仍然有一台服务器 运行 但没有任何领导者。
我所做的是:

  1. 我扩展到 3 个服务器(不要做 2-4 个)
  2. 停止所有 3 个服务器中的 consul。sudo service consul stop(你可以 status/stop/start)
  3. 创建了peers.json文件并将其放入旧服务器(/opt/consul/data/raft)
  4. 启动3台服务器(peers.json应该只放在1台服务器上)
  5. 对于其他 2 个服务器,使用 consul join 10.201.8.XXX
  6. 将其加入领导者
  7. 检查节点是否使用 consul operator raft list-peers
  8. 连接到领导者

示例peers.json 文件

[
  {
    "id": "306efa34-1c9c-acff-1226-538vvvvvv",
    "address": "10.201.n.vvv:8300",
    "non_voter": false
  },
  {
    "id": "dbeeffce-c93e-8678-de97-b7",
    "address": "10.201.X.XXX:8300",
    "non_voter": false
  },
  {
    "id": "62d77513-e016-946b-e9bf-0149",
    "address": "10.201.X.XXX:8300",
    "non_voter": false
  }
]

这些id你可以从/opt/consul/data/

中的每个服务器获取
[root@ip-10-20 data]# ls
checkpoint-signature  node-id  raft  serf
[root@ip-10-1 data]# cat node-id

一些有用的命令:

consul members
curl http://ip:8500/v1/status/peers
curl http://ip:8500/v1/status/leader
consul operator raft list-peers
cd opt/consul/data/raft/
consul info
sudo service consul status
consul catalog services

您还可以确保在第一个节点上的 Consul 配置文件 config.json 中设置了 bootstrap 参数:

# /etc/consul/config.json
{
    "bootstrap": true,
    ...
}

或者按照 Failure of a single server cluster Consul 官方文档中的描述,使用 -bootstrap=1 选项启动 consul agent。