webp

Swarm 添加多个 Manager 节点实现容错

Manager 节点的不可用是未知的,可以在 Swarm 集群中维护奇数个 Manager 节点,以防部分 Manger 节点不可用导致整个 Swarm 集群不能正常工作。

节点总数 正常数量 容错数量
1 1 0
2 2 0
3 2 1
4 3 1
5 3 2
6 4 2
7 4 3
8 5 3
9 5 4

容错数量 = (n - 1) / 2

举个例子,有 5 个 Manager 节点的 Swarm 集群,如果其中 3 个不可用,那么 Manager 节点的数量就不合法。因此在恢复其中一个不可用的 Manager 节点或使用灾难恢复命令恢复群集之前,将无法添加或删除节点。

灾难恢复

灾难不可控制,如果突发事件导致 Manager 节点不可用的数量超过容错数量,为了恢复 Swarm 到正常状态,该如何处理呢?

webp

1、从备份中恢复

备份 Swarm 数据 后, 使用如下步骤恢复 Swarm 集群.

  1. 关闭要恢复 Swarm 集群目标主机上的 Docker;

  1. 在新 Swarm 集群下 移除  /var/lib/docker/swarm 目录内容;

  1. 将备份内容存储到 /var/lib/docker/swarm 目录;

注意:新节点使用与旧的相同的加密密钥进行磁盘存储,此时不能更改磁盘上的存储加密密钥。
在启用自动锁定的 Swarm 情况下,解锁密钥也与旧的 Swarm 相同,并且需要解锁密钥来恢复 Swarm。

  1. 在新节点上启动docker。使用以下命令重新初始化集群,以便该节点不尝试连接到旧集群的一部分的节点,可能旧集群不再存在:

docker swarm init --force-new-cluster
  1. 校验 Swarm 集群的恢复状况是不是与预期的一样,可以使用 docker service ls 来查看。

  1. 如果你使用自动锁,参考  rotate the unlock key

  1. 向新的 Swarm 集群中添加 manager 和 worker 节点。

  1. 向新的 Swarm 集群中添加原来的备份方案。

2、通过重置 Manager 的法定数量恢复集群

集群对故障具有恢复能力,集群可以从任何数量的临时节点故障(机器重启或重启时崩溃)或其他瞬时错误中恢复。然而,如果集群的 Manger 数量少于法定数量,集群不能自动恢复。现有 Worker 节点上的任务继续运行,但不能管理任务,包括扩展或更新服务以及从集群中加入或删除节点。恢复的最佳方法是将丢失的 Manager 节点重新连接。如果故障严重,没有办法连接丢失的 Manager 节点,该如何处理?

目前唯一方法是使用 Manager 节点中的 --force-new-cluster 操作。这个操作会删除当前 Manager 节点以外的所有 Manager 节点。由于现在只有一个 Manager ,因此达到法定数量,Swarm 集群就能正常工作。然后可以提升 Worker 节点成为 Manager,直到拥有理想的 Manager 数量。

# 示例docker swarm init --force-new-cluster --advertise-addr node01:2377

当你使用 --force-new-cluster 标志运行 docker swarm init 命令时,运行命令的 Docker 引擎将成为能够管理和运行服务的集群的 Manager
节点。它拥有先前关于服务和任务的所有信息,Worker 节点仍然是集群的一部分,并且服务仍在运行。然后你需要添加 Manager 节点以实现以前的任务分配,并确保拥有足够的 Manager 来维护高可用性并防止法定数量不足。

Manager 节点的分配

除了维护奇数个 Manager 节点之外,在安置 Manager 时还要注意数据中心的拓扑结构。为了获得最佳的容错性,可以在至少 3 个可用区中分配 Manager 节点,以支持整套机器或常见维护方案的故障。

Manager 个数 分配 (在 3 个可用分区)
3 1-1-1
5 2-2-1
7 3-2-2
9 3-3-3

相关问题

1、Manager 节点为什么推荐使用奇数个?

举例,3 个节点和 4 个节点的容错数量都是 1,5 个节点和 6 个节点的容错数量都是 2,同样的效果,选偶数明显没有任何优势,属于浪费资源。

其他问题欢迎讨论 ~

作者:Anoyi
链接:https://www.jianshu.com/p/5c4a79cc04be

Docker Swarm 进阶:集群容错的更多相关文章

  1. Docker Swarm redis 集群搭建

    Docker Swarm redis 集群搭建 环境1: 系统:Linux Centos 7.4 x64 内核:Linux docker 3.10.0-693.2.2.el7.x86_64 Docke ...

  2. Docker Swarm部署集群

    一.Swarm简介 Swarm是Docker的一个编排工具,参考官网:https://docs.docker.com/engine/swarm/ Swarm 模式简介 要在Swarm模式下运行dock ...

  3. 从零开始,使用Docker Swarm部署集群教程

    本文首先从Dockerfile创建了一个简单web镜像 然后将web镜像推送到了远程仓库,以备后面集群中不同机器自动下载 之后使用docker-compose.yml配置了一个应用 而后新建了2台虚拟 ...

  4. docker Swarm mode集群

    基本概念 Swarm 是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具. 使用 Swarm 集群之前需要了解以下几个概念. 节点 运行 Docker 的主机可以主动 ...

  5. Docker Swarm nginx 集群搭建

    环境1: 系统:Linux Centos 7.4 x64 内核:Linux docker 3.10.0-693.2.2.el7.x86_64 Docker 版本:18.09.1 redis 版本:ng ...

  6. centos7 docker swarm加入集群失败

    提示的错误为 [root@localhost downloads]# docker swarm join --token SWMTKN-1-2ezr0k5ybds1la4vgi2z7j8ykxkmm0 ...

  7. docker部署rabbitmq集群

    docker版本:18.09.6 或以上 rabbitmq镜像版本:rabbitmq:3.9.5-management 一.拉镜像: docker pull rabbitmq:3.9.5-manage ...

  8. docker~swarm搭建docker高可用集群

    回到目录 Swarm概念 Swarm是Docker公司推出的用来管理docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机.Swarm使用标准的Docker API接口作为其前端访问入 ...

  9. docker学习之使用 DockerFile 构建镜像并搭建 swarm+compose 集群

    题目要求 (1)将springboot应用程序打成jar包:Hot.jar (2)利用dockerfile将Hot.jar构建成镜像 (3)构建 Swarm 集群 (4)在 Swarm 集群中使用 c ...

  10. Docker 搭建 etcd 集群

    阅读目录: 主机安装 集群搭建 API 操作 API 说明和 etcdctl 命令说明 etcd 是 CoreOS 团队发起的一个开源项目(Go 语言,其实很多这类项目都是 Go 语言实现的,只能说很 ...

随机推荐

  1. 决策单调性优化 DP

    前言 本文将介绍决策单调性优化 DP 的相关内容.持续更新修正,如有差错请指出. 1.四边形不等式优化 DP 1.1 四边形不等式与决策单调性 四边形不等式:如果对于任意的 \(a \le b \le ...

  2. Redis学习笔记之Jedis

    Jedis语法总结 Jedis是Java代码操作Redis的工具包,里面封装了操作Redis的方法 Jedis jedis = new Jedis(String ip , String port) 1 ...

  3. Linux性能优化-网络性能优化思路

    目录 确定优化目标 网络性能工具 网络性能优化 应用程序 套接字 传输层 网络层 链路层 确定优化目标优化前,首先要确定观察到的网络性能指标,要达到多少才合适?虽然网络性能优化的整体目标,是降低网络延 ...

  4. SpringCloud(2)---入门篇

    SpringCloud(6)---熔断降级理解.Hystrix实战 一.概念 1.为什么需要熔断降级 (1)需求背景 它是系统负载过高,突发流量或者网络等各种异常情况介绍,常用的解决方案. 在一个分布 ...

  5. 防止SQL注入的五种方法

    1.首先看一下下面两个sql语句的区别: <select id="selectByNameAndPassword" parameterType="java.util ...

  6. Linux开发帮助参考

    在开发Linux系统下面软件时常常需要查阅手册,但是如果你的开发平台不是Linux系统,那你无法丝滑使用man手册,这里推荐一些方便的Linux开发手册. 手册: 在线man手册:Linux Man ...

  7. 深度学习基础理论————CV中常用Backbone(Resnet/Unet/Vit系列/多模态系列等)以及代码

    主要介绍在CV中常用的Backbone原理简易代码(代码以及原理经常更新),参考论文中的表格,对不同的任务所使用的backbone如下: 针对上面内容分为两块内容:1.基于卷积神经网络的CV Back ...

  8. Flink Maven项目,依赖配置pom.xml

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  9. Hive2升hive3报错

    一.网上总结的报错 1.coalesce报错 FAILED: SemanticException [Error 10014]: Line 197:4 Wrong arguments ''10'': U ...

  10. Vue3+NestJS实现后台权限管理系统上线啦!(附源码及教程)

    最近这段时间工作不忙,想着提升一下自己的技术,沉淀沉淀.于是做了一个开源的后台权限管理系统.因为我本身是一个前端开发,所以前端和服务端都是用的 JS 语言来开发的,前端用的框架是 vue3,后端则用的 ...