Docker 1.12 :认识 Swarm 模式下的节点崩溃处理
上周小编为大家推荐了《Docker 1.12:用 Swarm 模式创建 Swarm 集群》,本周我们将深入为大家解读 1.12 版本 Docker Swarm 模式下的节点崩溃处理。欢迎大家在评论中踊跃推荐 Docker 技术文章,通过审核后的文章会由 DaoCloud 为大家带来独家翻译。
在上一次班加罗尔 Docker Meetup 中,许多人对Docker引擎 1.12 版 Swarm 模式下的“应用预期状态调和”和“节点管理”功能怀有很大的好奇。我发现,展示环节中大家提出最多的问题,都是关于新 Docker Swarm 模式下的节点崩溃处理,尤其是 RAFT 一致性算法中主节点崩溃后如何处理。在这篇博客里,我会专门针对 RAFT 一致性算法,谈一谈“主节点崩溃”的问题。我们将看到 Swarmkit(Swarm 模式的主要技术实现)是如何使用 RAFT 一致性算法,确保没有单点故障,从而在分布式系统中实现高效率决策的。
在上一篇博客中,我们深入了解了 Swarm 模式的执行机制,并谈到了管理节点和工作节点之间的通信问题。运行 Swarmkit 的主机可以被整合到一起,创建一个 Swarm ,彼此协同处理任务。每一台新加入的主机,都变成一个 Swarm 节点。这个节点要么是工作节点,要么是管理节点。工作节点负责执行任务,而管理节点从用户那里获得任务说明,负责整合现有的集群,达到理想状态。
管理节点会保障集群内部环境状态的强一致性,以及基于 Raft 协议实现状态备份,另外通过内存读写保障速度,使集群可以在对崩溃保持较高容错率的同时,做出快速的决策部署。通过 API / CLI 命令,节点角色(工作节点或者管理节点)可以互相切换。换言之,如果某个主节点或者工作节点崩溃了,Swarmkit 会把它的任务(也就是容器)重新部署到其他节点上去。
快速概览一下 Raft 一致性算法
让我们来了解一下 Raft 一致性算法究竟是个什么。一个 Raft 集群包括了若干个服务器,数目通常是五个,这样系统就能承受两次崩溃。在给定的任意时间点上,每个服务器都处在以下三种状态的一种:指挥者、跟随者,或候选者。在一般操作中,一定会有一个指挥者,剩下的服务器都是跟随者。跟随者是被动的:它们自己不提交任何需求,仅仅响应指挥者和候选者提出的需求。指挥者处理所有的客户端需求(如果客户端向跟随者发送了需求,跟随者会把它转交给指挥者)。至于第三种状态——候选者——则是用来选举一个新的指挥者。 Raft 用一种心跳机制来触发指挥者选举。当服务器启动时,它们先从跟随者做起,并会在接收到指挥者或候选者发送的有效 RPC 协议(远程过程调用协议)之前,一直执行跟随者的工作。指挥者定时向全体跟随者发送心跳信息,以保持它们的授权。如果一个跟随者超过一定时间没有接收到心跳信息(这段时间称为“选举超时”),它就会假设指挥者已经失效,然后启动选举,来选择一个新的指挥者。要了解 Raft 的执行机制,我推荐阅读一篇文章,以下是链接:https://github.com/hashicorp/raft 。

请注意,要实现一致性,管理节点的数量必须时刻为奇数(1、3、5、7等)。如果你只有两个管理节点,万一其中一个崩溃了,就会导致无法取得一致的状况出现。理由是——超过 50% 的管理节点在实际运用 Raft 一致性算法前,都需要得到另一方的“同意”。
谈谈管理节点崩溃
在这里,我用谷歌云引擎上已有的 Swarm 模式集群,来展示一下主节点崩溃的情景。如下所示,我用5个节点组了一个 Swarm 模式集群,在 1.12.0-rc4 的 Docker 测试版本上安装运行。

5 个节点中,Swarm 模式集群已经把服务复制到其中 3 个节点——测试 – 主节点 1 ,测试-节点 2 和测试 – 节点 1 —— 上运行。让我们用 docker-machine 命令(我一直以来的最爱)来给通过ssh连接到测试 – 主节点 1 ,并按照之前演示过的,把工作节点(测试 – 节点 1 和测试 – 节点 2 )提升为管理节点。

从此,工作节点就被正确升格为管理节点,并显示为“Reachable”。
“$docker ps”命令显示,有一个任务(容器)已经在主节点上运行。请记住,“$docker ps”必须在专用的节点上手动执行,才能知道哪个本地容器正在特定节点上运行。

下图描述了容器(或者任务)的详细清单,它们分布在整个 Swarm 集群上。

让我们来搞垮管理节点“测试-主节点 1”(方式随意,可以不彻底地关停之,也可以按如下所示,通过可用的 GCE 功能停止内存块)。管理节点(测试-主节点 1)已经不能使用了。如果你尝试通过ssh协议连接测试 – 节点2,并检查集群是否启动和运行,你会发现节点崩溃已经被处理好了,理想状态调试也已经开始。现在任务(或者容器)的 3 个复制件已经在测试 – 节点 1 ,测试 – 节点 2 和测试 – 节点 3 上运行了。

要执行 Raft 一致性算法,我推荐最少都要用到 1、3、5、7 等奇数个管理节点。当然最佳的策略是设置 5个管理节点,如果设置7个管理节点有可能会导致性能表现上的瓶颈,因为要在管理节点之间维持住相互协议,不发生错乱,就必然会在沟通上造成额外的花销。
技术直播预告
第三期 用容器创造新世界
作为「容器改变世界」系列讲座的最终章,我们将迎来本系列的高潮,开叔会向我们展示一个怎样的新世界呢?大家敬请期待!
This entry was posted in 干货 and tagged Swarm 干货, 干货. Bookmark the permalink.
Docker 1.12 :认识 Swarm 模式下的节点崩溃处理的更多相关文章
- Docker - 运行 containers 使用在 swarm 模式下创建的 overlay 模式的 network
前言 在Docker engine v1.12, 使用Swarm可以方便的创建overlay模式的网络,但是它只能被swarm下面的service所使用的,相对于container,这个网络是完全隔离 ...
- docker相关--开始使用swarm模式
Swarm简介 Swarm是Docker的一个编排工具,参考官网:https://docs.docker.com/engine/swarm/ Swarm 模式简介 要在Swarm模式下运行docker ...
- docker 应用-4(swarm模式搭建集群)
swam模式 使用docker的swarm模式,可以很方便的搭建docker engine集群.docker engine是docker 容器的运行时环境,可以在docker engine上build ...
- docker 1.12 版本 docker swarm 集群
博客已经迁移到 个人博客中 个人博客 更新地址: http://www.xf80.com/2016/10/25/docker-swarm-1.12/ docker 1.12 版本 的新特性 (1)do ...
- docker swarm模式跨主机连接
一.前言 当我们开发好微服务之后,考虑到灵活快速持续部署的需要,通常会考虑将其Docker镜像化并在Docker环境下运行.由于微服务个数通常会较多,把所有微服务部署在一台docker主机上是不现实的 ...
- cAdvisor0.24.1+InfluxDB0.13+Grafana4.0.2搭建Docker1.12.3 Swarm集群性能监控平台
目录 [TOC] 1.基本概念 既然是对Docker的容器进行监控,我们就不自己单独搭建cAdvisor.InfluxDB.Grarana了,本文中这三个实例,主要以Docker容器方式运行. 本 ...
- Docker三十分钟快速入门(下)
一.背景 上篇文章我们进行了Docker的快速入门,基本命令的讲解,以及简单的实战,那么本篇我们就来实战一个真实的项目,看看怎么在产线上来通过容器技术来运行我们的项目,来达到学会容器间通信以及dock ...
- PPP模式下的融资结构优化
PPPcode{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && d ...
- openfaas 安装(docker swarm 模式)
备注:为了简单使用的是docker-compose 进行组件的安装 预备环境: docker (配置好 swarm 集群模式) docker-compose 1. docker ...
- Nginx+Docker部署模式下 asp.net core 获取真实的客户端ip
目录 Nginx+Docker部署模式下 asp.net core 获取真实的客户端ip 场景 过程还原 结论 参考资料 Nginx+Docker部署模式下 asp.net core 获取真实的客户端 ...
随机推荐
- 跟着源码一起学:手把手教你用WebSocket打造Web端IM聊天
本文作者芋艿,原题"芋道 Spring Boot WebSocket 入门",本次有修订和改动. 一.引言 WebSocket如今在Web端即时通讯技术应用里使用广泛,不仅用于传统 ...
- spark (二) spark wordCount示例
目录 实现思路 实现1: scala 基本集合操作方式获取结果 实现2: scala map reduce方式获取结果 实现3: spark 提供的map reduce方式获取结果 FAQ: 实现思路 ...
- Python 进阶:深入理解 import 机制与 importlib 的妙用
大家好,今天我们来深入探讨 Python 中的导入机制和 importlib 模块.相信不少朋友和我一样,平时写代码时可能只用过最基础的 import 语句,或者偶尔用 importlib.impor ...
- IntelliJ IDEA2020永久激活破解教程(无限试用)
IntelliJ IDEA2020激活破解教程(无限试用) 鉴于想拥有一个十分舒适的编程环境,我特意将自己的电脑运行内存从4G扩展到12G,加装一个256G的固态作为C盘,并且将系统升级为Window ...
- Index - 此处的诗
虚构往事 正篇 嗯--本来发过两篇,但深愧于仓促的处理和并未完善的细节设定,隐藏了. 大概会是一个中篇的科幻故事,世界设定已经完善了(Shaya 可以作证!),但近期可能没有精力动笔. 番外 ...
- .NetCore Docker test
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 ...
- BigTable-列族存储
BigTable 其实就是 Google 设计的分布式结构化数据表. Bigtable 的设计动机: 需要存储的数据种类繁多,包括URL.网页内容.用户的个性化设置在内的数据都是Google需要经常处 ...
- 数据结构 Trick 之:子树 k 距离内问题
能够解决的题目类型 这个 Trick 能解决的题目形如: 给定 \(n\) 个节点的有根无边权有点权树. 有 \(m\) 个询问,每个询问形如点 \(x\) 的子树内与 \(x\) 深度差不超过 \( ...
- 2025-01-22:使二进制数组全部等于 1 的最少操作次数Ⅱ。用go语言,给定一个二进制数组 nums,你可以对数组进行以下操作任意次(包括0次): 选择任何一个下标 i,并将从该下标开始到数组末
2025-01-22:使二进制数组全部等于 1 的最少操作次数Ⅱ.用go语言,给定一个二进制数组 nums,你可以对数组进行以下操作任意次(包括0次): 选择任何一个下标 i,并将从该下标开始到数组末 ...
- JS深度理解
事件循环 程序运行需要有自己专属的内存空间,可以把这块内存简单理解为进程 每个应用至少有一个进程,进程间相互独立,要通信,也需要双方同意 线程 有进程后,就可以运行程序的代码 运行代码的 [人] 称为 ...