首页 > 解决方案 > docker swarm中leader节点宕机时如何处理

问题描述

我有两个 docker 节点在 swarm 中运行,如下所示。我晋升为经理的第二个节点。

imb9cmobjk0fp7s6h5zoivfmo * Node1 Ready Active Leader 19.03.11-ol a9gsb12wqw436zujakdpbqu5p Node2 Ready Active Reachable 19.03.11-ol

当领导节点进入耗尽/暂停时,这可以正常工作。但作为我测试的一部分,我已经停止了 Node1 实例,然后当我尝试查看第二个节点中的节点(docker node ls)是什么以及尝试列出正在运行的服务(docker service ls)时出现以下错误。

来自守护进程的错误响应:rpc 错误:code = Unknown desc = swarm 没有领导者。在线的经理可能太少。确保超过一半的经理在线

在停止实例之前,节点 2 中也没有运行在节点 1 中的 docker 进程。只有现有的进程正在运行。我的期望是在停止 node1 实例后,在节点 1 中运行的进程必须移动到 node2。当节点进入耗尽状态时,这可以正常工作

标签: docker-swarm

解决方案


raft 共识算法在找不到明显多数时失败。

这意味着,永远不要使用 2 个管理器节点运行,因为一个节点出现故障,另一个节点只有 50% - 这不是多数,无法达到法定人数。

事实上,通常情况下,避免使用偶数,尤其是在可用性区域之间拆分管理器时,因为区域拆分可能会给您留下 50/50 的分区 - 同样没有多数,没有法定人数和死群。

因此,要尝试的有效集群管理器数量通常为:1、3、5、7。高于 7 通常会降低性能并且无助于可用性。

1 仅应在您使用 1 或 2 个节点群时使用,在这些情况下,管理器节点的丢失无论如何都等同于群的丢失。

3 个经理确实是您应该瞄准的最低要求。如果您只有 3 个节点,则宁愿将管理器用作工作人员,而不是运行 1 个管理器和 2 个工作人员。


推荐阅读