【问题标题】:How to handle when leader node goes down in docker swarmdocker swarm中leader节点宕机时如何处理
【发布时间】:2021-06-23 01:12:52
【问题描述】:

我有两个 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


    【解决方案1】:

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

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

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

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

    只有在使用 1 或 2 个节点的集群时才应使用 1,在这些情况下,失去管理器节点就等于失去了集群。

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

    【讨论】:

    • 我可以在领导节点中运行我的容器吗?或者我必须只在工作节点中运行我的容器。让领导节点只管理。
    • docker 默认在所有节点上运行服务任务。您可以在 compose.yml 中添加 deploy:placement: constraints: 当您的 swarm 足够大,除非需要时它会受益于不在管理器上运行的容器时,使用类似 node.role==workernode.role==manager 的子句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多