news 2026/6/16 23:14:13

第六部分-DockerSwarm——31. Swarm 高可用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第六部分-DockerSwarm——31. Swarm 高可用

31. Swarm 高可用

1. 高可用概述

Docker Swarm 通过多 Manager 节点、Raft 共识算法、自动故障转移等机制实现高可用。本节将深入讲解 Swarm 高可用的架构和配置。

┌─────────────────────────────────────────────────────────────┐ │ Swarm 高可用架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ │ │ │ Manager │ │ │ │ (Leader) │ │ │ └──────┬──────┘ │ │ │ │ │ ┌─────────────────┼─────────────────┐ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ Manager │ │ Manager │ │ Worker │ │ │ │ (Follower)│ │ (Follower)│ │ │ │ │ └───────────┘ └───────────┘ └───────────┘ │ │ │ │ 高可用机制: │ │ - 多 Manager 节点(奇数,3/5/7) │ │ - Raft 共识算法 │ │ - 自动 Leader 选举 │ │ - 任务重新调度 │ │ - 节点故障自动检测 │ │ │ └─────────────────────────────────────────────────────────────┘

2. Manager 节点高可用

2.1 推荐配置

# 推荐 Manager 节点数量(奇数)# - 小型集群:3 个 Manager# - 中型集群:5 个 Manager# - 大型集群:7 个 Manager# 容错能力# 3 个 Manager:可容忍 1 个故障# 5 个 Manager:可容忍 2 个故障# 7 个 Manager:可容忍 3 个故障

2.2 添加 Manager 节点

# 在当前 Manager 上获取加入 tokendockerswarm join-token manager# 在新节点上执行加入命令dockerswarmjoin--tokenSWMTKN-2-xxx192.168.1.10:2377# 验证节点已加入dockernodels

2.3 节点角色管理

# 升级 Worker 为 Managerdockernodepromote node2# 降级 Manager 为 Workerdockernodedemote node3# 查看节点角色dockernodels--format"table {{.ID}}\t{{.Hostname}}\t{{.Status}}\t{{.Availability}}\t{{.ManagerStatus}}"

3. Raft 共识

3.1 查看 Raft 状态

# 查看集群状态dockerinfo|grep-A20"Swarm"# 查看 Raft 日志dockernodeinspect self--format'{{.ManagerStatus.RaftStatus}}'# 查看 Raft 成员dockernodels--format"{{.ID}} {{.Hostname}} {{.ManagerStatus}}"

3.2 Raft 配置

# 修改 Raft 心跳间隔(默认 1s)dockerswarm update --raft-heartbeat-tick2# 修改选举超时(默认 10s)dockerswarm update --raft-election-tick20# 查看 Swarm 配置dockerswarm inspect

4. 自动故障转移

4.1 Leader 选举

# 当前 Leader 节点故障时自动选举# 选举过程:# 1. 检测 Leader 故障(心跳超时)# 2. 发起选举# 3. 获得多数投票# 4. 新 Leader 产生(通常 < 10 秒)# 查看当前 Leaderdockernodels|grepLeader

4.2 任务重新调度

# Worker 节点故障时,任务会自动重新调度到其他节点# 设置重新调度延迟(默认 0s)dockerswarm update --task-history-limit5# 查看任务重新调度历史dockerservicepsweb--filter"desired-state=running"

5. 节点维护

5.1 主动节点维护

# 设置节点为 Drain(不再接收新任务)dockernodeupdate--availabilitydrain node2# 节点上的任务会重新调度到其他节点dockernodepsnode2# 维护完成后恢复dockernodeupdate--availabilityactive node2# 暂停节点(不接收新任务,但保留现有任务)dockernodeupdate--availabilitypause node2

5.2 移除节点

# 从集群中移除节点dockernodermnode2# 强制移除(节点无法访问时)dockernoderm--forcenode2# 节点主动离开集群dockerswarm leave# Manager 节点强制离开dockerswarm leave--force

6. 备份与恢复

6.1 备份 Swarm 状态

# 停止 Docker 服务sudosystemctl stopdocker# 备份 Swarm 目录sudotar-czfswarm-backup.tar.gz /var/lib/docker/swarm# 启动 Docker 服务sudosystemctl startdocker

6.2 恢复 Swarm 状态

# 在新节点上恢复sudosystemctl stopdockersudorm-rf/var/lib/docker/swarmsudotar-xzfswarm-backup.tar.gz-C/sudosystemctl startdocker# 恢复后需要重新加入其他节点

7. 监控与告警

7.1 节点监控

# 监控节点状态watch-n2'docker node ls'# 监控服务状态watch-n2'docker service ls'# 监控任务状态watch-n2'docker service ps web'# 节点资源监控dockernodeinspect self--format'{{.Description.Resources}}'

7.2 告警配置

# 设置节点状态告警#!/bin/bashNODE_STATUS=$(dockernodels|grep-cDown)if[$NODE_STATUS-gt0];thenecho"Warning:$NODE_STATUSnodes are down"# 发送告警fi# 设置 Manager 数量告警MANAGER_COUNT=$(dockernodels|grep-cLeader)if[$MANAGER_COUNT-lt2];thenecho"Warning: Only$MANAGER_COUNTmanager nodes available"fi

8. 常见故障场景

8.1 Manager 节点故障

# 场景:3 个 Manager,1 个故障# 影响:集群仍可运行# 恢复步骤:# 1. 检查故障节点dockernodels# 2. 移除故障节点dockernoderm--forcenode2# 3. 添加新 Manager 节点dockerswarm join-token managerdockerswarmjoin--tokenxxx192.168.1.10:2377

8.2 多数 Manager 故障

# 场景:3 个 Manager,2 个故障# 影响:集群无法接受新任务,但已有任务继续运行# 恢复步骤:# 1. 从备份恢复dockerswarm init --force-new-cluster --advertise-addr192.168.1.10# 2. 重新加入其他节点dockerswarm join-token managerdockerswarmjoin--tokenxxx192.168.1.10:2377

8.3 Worker 节点故障

# 影响:任务自动重新调度到健康节点# 检查故障节点任务dockernodepsnode2# 移除故障节点dockernodermnode2# 节点恢复后重新加入dockerswarmjoin--tokenxxx192.168.1.10:2377

9. 性能调优

9.1 Raft 参数调优

# 调整心跳和选举时间(适合网络延迟较高的环境)dockerswarm update\--raft-heartbeat-tick3\--raft-election-tick30# 调整快照间隔(默认 10000 条日志)dockerswarm update --snapshot-interval5000

9.2 节点性能优化

# 限制 Manager 节点运行的服务dockernodeupdate --label-addrole=manager node1# 只在 Worker 节点部署服务dockerservicecreate--nameweb\--constraintnode.role==worker\--replicas3\nginx

10. 高可用架构示例

#!/bin/bash# 高可用 Swarm 集群部署# 节点规划# manager1: 192.168.1.10 (Leader)# manager2: 192.168.1.11 (Follower)# manager3: 192.168.1.12 (Follower)# worker1: 192.168.1.20# worker2: 192.168.1.21# worker3: 192.168.1.22# 1. 初始化第一个 Managerdockerswarm init --advertise-addr192.168.1.10# 2. 获取 Manager tokenMANAGER_TOKEN=$(dockerswarm join-token manager-q)WORKER_TOKEN=$(dockerswarm join-token worker-q)# 3. 加入其他 Managersshmanager2"docker swarm join --token$MANAGER_TOKEN192.168.1.10:2377"sshmanager3"docker swarm join --token$MANAGER_TOKEN192.168.1.10:2377"# 4. 加入 Worker 节点forworkerinworker1 worker2 worker3;dossh$worker"docker swarm join --token$WORKER_TOKEN192.168.1.10:2377"done# 5. 设置节点标签dockernodeupdate --label-addrole=manager manager1dockernodeupdate --label-addrole=manager manager2dockernodeupdate --label-addrole=manager manager3dockernodeupdate --label-addrole=worker worker1dockernodeupdate --label-addrole=worker worker2dockernodeupdate --label-addrole=worker worker3# 6. 部署高可用服务dockerservicecreate--nameweb\--publish80:80\--replicas5\--constraintnode.role==worker\--update-parallelism2\--update-delay 10s\--restart-condition on-failure\nginx# 7. 验证高可用dockernodelsdockerservicepsweb

11. 命令速查

操作命令
查看节点docker node ls
升级节点docker node promote
降级节点docker node demote
维护模式docker node update --availability drain
移除节点docker node rm
查看 Leader`docker node ls
备份 Swarmtar -czf swarm.tar.gz /var/lib/docker/swarm
恢复 Swarmtar -xzf swarm.tar.gz -C /

12. 常见问题

Q1: Manager 节点数量为什么必须是奇数?

Raft 共识需要多数投票,奇数节点可避免平局。

Q2: 如何判断集群是否健康?

运行docker node ls,检查所有 Manager 状态是否为 Ready。

Q3: 节点故障后任务如何恢复?

Swarm 会自动将任务重新调度到健康节点。

Q4: 如何避免单点故障?

部署至少 3 个 Manager 节点,Worker 节点至少 2 个。

13. 小结

  • 高可用:多 Manager 节点 + Raft 共识
  • Manager 数量:推荐 3/5/7 个(奇数)
  • 故障转移:Leader 自动选举
  • 任务恢复:Worker 故障自动重新调度
  • 节点维护:Drain 模式优雅下线
  • 备份恢复:定期备份 /var/lib/docker/swarm
  • 监控告警:节点状态、Manager 数量
  • 性能调优:调整 Raft 参数、节点约束

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/16 23:11:44

跨境企业做多币种薪税核算该认准什么薪酬系统?

跨境团队的薪酬管理&#xff0c;最让人头疼的就是多币种核算。不同国家币种不同、汇率实时变动&#xff0c;还有各地薪税规则差异&#xff0c;手动核算不仅耗时&#xff0c;还容易出错。结合我这几年帮跨境企业对接薪酬系统的经验&#xff0c;今天就跟大家聊聊&#xff0c;什么…

作者头像 李华
网站建设 2026/5/12 21:16:31

AI 赋能泳装创新,先知大模型如何破局行业痛点

北京先智先行科技有限公司面向时尚产业推出三大旗舰产品&#xff0c;分别为先知大模型、先行 AI 商学院与先知 AIGC 超级工场&#xff0c;以全栈 AI 能力为春夏季泳装产业提供数字化支撑。公司聚焦五大核心业务&#xff0c;涵盖先知大模型私有化部署、先知 AIGC 超级工场、AI 训…

作者头像 李华
网站建设 2026/5/12 21:11:09

开源自托管看板工具:基于Preact+Hono+SQLite的零云依赖方案

1. 项目概述&#xff1a;一个为自托管与AI协作而生的看板应用如果你正在寻找一个可以完全掌控在自己手里、没有订阅费用、又能无缝集成到你自己产品中的看板工具&#xff0c;那么clawnify/open-kanban这个项目值得你花时间深入研究。它不是一个玩具&#xff0c;而是一个生产就绪…

作者头像 李华
网站建设 2026/5/12 21:11:08

基于确定性脚本与LLM决策的AI多智能体自动化监控系统设计与实践

1. 项目概述&#xff1a;一个为AI多智能体协作而生的“自动化监工”如果你正在用OpenClaw这类框架玩多AI智能体协作&#xff0c;大概率会遇到一个头疼的问题&#xff1a;怎么知道这群“数字员工”到底在不在干活&#xff1f;谁在摸鱼&#xff1f;任务到底完成了没有&#xff1f…

作者头像 李华
网站建设 2026/5/12 21:10:07

【2026年】为什么智能锁电池漏液?如何有效避免

引言&#xff1a;智能锁的隐形杀手智能锁电池漏液&#xff0c;一个看似小概率的事件&#xff0c;却可能对价值数千元的智能锁造成不可逆的损坏。当电解液渗入智能锁内部电路板&#xff0c;腐蚀精密元器件&#xff0c;维修费用往往高达数百甚至上千元。本文将从技术原理、原因分…

作者头像 李华