从Consul的“无集群领导者”状态中恢复

16

我有:

  • 一个mesos-master,其中我配置了consul服务器;
  • 一个mesos-slave,其中我配置了consul客户端,并且;
  • 一个用于consul的引导服务器。

当我启动时,我看到以下错误:

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

我该如何从这种状态中恢复?

6个回答

10

您是否查看了Consul文档

看起来您执行了一个不正常的停止操作,现在需要通过删除raft/peers.json文件中的所有条目来进行故障恢复。请参考上面的链接以获取更多详细信息。


4
现在看起来这个链接已经失效了……我认为新版本的链接应该是 https://learn.hashicorp.com/consul/day-2-operations/outage? - Amber B.

9
从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是一个有用的链接。您在数据目录中创建raft/peers.json并启动Consul,日志将指示它正在读取/删除该文件,然后应该会显示类似于“获得集群领导权”的内容。文件内容如下:
[ { "id": "<node-id>", "address": "<node-ip>:8300", "non_voter": false } ]

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


2
我将更新我所做的事情: 背景:我们缩小了AWS Autoscaling,因此失去了leader。但是我们仍有一个服务器在运行,但没有任何leader。 我所做的是:
  1. 将服务器扩展到3台(不要使2-4)
  2. 在所有3个服务器上停止consul。sudo service consul stop(您可以执行状态/停止/启动)
  3. 创建peers.json文件并将其放在旧服务器上(/opt/consul/data/raft)
  4. 启动3个服务器(peers.json应仅放置在1个服务器上)
  5. 对于其他2个服务器,请使用consul join 10.201.8.XXX加入leader
  6. 使用consul operator raft list-peers检查对等方是否连接到leader

示例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

1
在我的情况下,我在k8s集群中有2个工作节点,在添加另一个节点后,consul服务器可以选举出主节点,一切都正常运行。

1
如果您的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 } ]

-2

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

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

或者按照官方单服务器集群故障 Consul文档所述,使用-bootstrap=1选项启动Consul代理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接