You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Swarm双节点故障服务迁移及节点优先部署配置问题

Docker Swarm 双节点高可用解决方案

问题根因说明

Docker Swarm 管理平面基于 Raft 共识算法实现,要求管理节点数量必须为奇数,可容忍的故障管理节点数为 (管理节点总数 - 1)/2:

  • 单管理节点集群:容错 0 个管理节点故障,leader 宕机后集群控制平面完全失效,worker 节点无法接收调度指令,自然无法接管服务
  • 双管理节点集群:需要至少 2 个管理节点同时在线才能达成共识,任意一个节点宕机都无法满足多数票要求,控制平面同样失效,这就是你之前配置双管理节点没有达到预期效果的核心原因

双节点集群配置方案(仅 2 台服务器可用场景)

如果暂时无法新增服务器,可按以下配置实现任意节点宕机后服务自动接管:

  1. 两个节点都设置为管理节点,调整集群心跳参数提高故障检测速度:
    在任意管理节点执行命令:
    docker swarm update --dispatcher-heartbeat 3s --task-history-limit 2
    
  2. 配置自动故障恢复脚本:
    因为双管理节点无法自动完成故障切换,你可以在两个节点都部署一个轻量监控脚本,检测到集群 leader 离线且自身存活时,自动执行强制重建集群命令:
    docker swarm init --force-new-cluster --advertise-addr 本机IP
    
    脚本触发后10秒内即可恢复集群控制平面,存活节点会自动接管所有离线节点上的服务。

服务优先调度到指定节点配置

你之前使用的 constraints 是硬调度规则,会完全禁止服务调度到 manager 节点,要实现「优先部署到 worker 节点,worker 不可用时再调度到 manager 节点」的需求,需要使用 Swarm 提供的软调度规则 placement.preferences,配置示例如下:

deploy:
  placement:
    preferences:
      # 优先按节点角色分发,优先调度到worker角色节点
      - spread: node.role
    # 可选:如果需要优先调度到指定的某个worker节点,可以先给worker打自定义标签
    # 打标签命令:docker node update --label-add deploy_priority=high <worker节点名称/ID>
    # preferences 配置替换为:
    # - spread: node.labels.deploy_priority

该配置是软约束,不会禁止服务调度到其他节点,仅会在有可选节点时优先匹配优先级更高的节点。

最优生产方案建议

如果有条件新增1台低配置服务器(仅需1核1G配置即可,不需要跑业务服务),建议配置 3 个管理节点的集群,满足 Raft 共识的多数票要求,可以自动容错1个管理节点故障,无需额外的监控脚本干预,可用性更高。

内容的提问来源于stack exchange,提问作者Gilson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:36:05