从 Consul "No Cluster leader" 状态恢复
Recovering from Consul "No Cluster leader" state
我有:
- 我在其中配置了 consul 服务器的一个 mesos-master;
- 我在其中配置 consul 客户端的一个 mesos-slave,以及;
- 一个 bootstrap 领事服务器。
当我点击开始时,我看到以下错误:
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
。日志将指示它何时分别读取和删除文件。
假设您已经尝试过 bootstrap
或 bootstrap_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,因此失去了领导者。但是我们仍然有一台服务器 运行 但没有任何领导者。
我所做的是:
- 我扩展到 3 个服务器(不要做 2-4 个)
- 停止所有 3 个服务器中的 consul。
sudo service consul stop
(你可以 status/stop/start)
- 创建了peers.json文件并将其放入旧服务器(/opt/consul/data/raft)
- 启动3台服务器(peers.json应该只放在1台服务器上)
- 对于其他 2 个服务器,使用
consul join 10.201.8.XXX
将其加入领导者
- 检查节点是否使用
consul operator raft list-peers
连接到领导者
示例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。
我有:
- 我在其中配置了 consul 服务器的一个 mesos-master;
- 我在其中配置 consul 客户端的一个 mesos-slave,以及;
- 一个 bootstrap 领事服务器。
当我点击开始时,我看到以下错误:
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
。日志将指示它何时分别读取和删除文件。
假设您已经尝试过 bootstrap
或 bootstrap_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,因此失去了领导者。但是我们仍然有一台服务器 运行 但没有任何领导者。
我所做的是:
- 我扩展到 3 个服务器(不要做 2-4 个)
- 停止所有 3 个服务器中的 consul。
sudo service consul stop
(你可以 status/stop/start) - 创建了peers.json文件并将其放入旧服务器(/opt/consul/data/raft)
- 启动3台服务器(peers.json应该只放在1台服务器上)
- 对于其他 2 个服务器,使用
consul join 10.201.8.XXX
将其加入领导者
- 检查节点是否使用
consul operator raft list-peers
连接到领导者
示例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。