Docker Swarm建立服务器集群

Docker Swarm建立服务器集群

  • 一、Docker Swarm简介
    • 1. 集群模式
    • 2. 管理节点--Manager
  • 二、Docker Swarm的配置及使用
  • 三、Docker Service向集群中添加服务
  • 四、Docker Stack部署集群

一、Docker Swarm简介

1. 集群模式

这是Docker官网给出的一张swarm原理图,即swarm就是一个或多个Docker Engine的集群,负责集群的管理和编排。
在这里插入图片描述

在这里插入图片描述
Manager负责维持集群状态并进行调度服务。(基于Raft算法)
Worker是Docker Engine的实例,其唯一目的是执行容器。工作程序节点不参与Raft分布式状态,不制定调度决策。

Raft(共识算法)原本是一种针对简化版拜占庭将军问题的解决方法。但被广泛映射在分布式系统上,解决集群状态下会遇到的各种问题。

  • Raft算法将所有节点分为Follower,Candidate,Leader三种状态。分别为追随节点,选举节点,管理节点。
    在这里插入图片描述
  • Raft算法主要分为两个过程,选主复制日志。其中选主故名思意,就是各节点通过投票选出Leader节点;复制日志这里举一个例子,比如服务器A(Leader)接收到用户1传来的更新数据库请求,要存入数据temp,此时A会将该更新请求同步至服务器B(Follower)和服务器C(Follower),B和C收到之后将数据暂时存在本地,将其状态置为UnCommitted,并返回OK,A收到半数Follower节点返回后,将数据写入并返回成功给用户1,此时B,C再将数据提交状态置为Committed。

上面大致介绍了Raft算法,具体的算法执行流程,可以在这里看到:Raft算法

2. 管理节点–Manager

下面是官网给出的Docker swarm集群的四点要求:

  • 一个由三名经理组成的群体最多可以容忍一名经理的损失。
  • 五个管理器群最多可以同时丢失两个管理器节点。
  • 一个N管理器群集最多可以容忍管理器的丢失 (N-1)/2。
  • Docker建议最多为七个管理器节点。

重要说明:添加更多管理器并不意味着增加可伸缩性或更高性能。通常,情况恰恰相反。
说明。
为什么要强调管理群集的可用节点数必须大于总结点数的一半?
首先,集群在节点之间通信不可达的情况下,集群会分裂成不同的小集群,小集群各自选出自己的Leader节点,导致原有的集群出现多个Leader节点的情况,当各集群重新可以通信时,多个Leader节点将使得群集发生紊乱,我们将这种情况称为脑裂。
这里给出一个文章中举出的例子帮助理解:
(1) 假如集群有 5 个节点,发生了脑裂,脑裂成了A、B两个小集群:

 (a) A : 1个节点 ,B :4个节点 , 或 A、B互换(b) A : 2个节点, B :3个节点  , 或 A、B互换上面这两种情况下,A、B中总会有一个小集群满足 可用节点数量 > 总节点数量/2 。所以集群仍然能够选举出leader , 仍然能对外提供服务,只不过是有一部分节点失效了而已。

(2) 假如集群有4个节点,同样发生脑裂,脑裂成了A、B两个小集群:

(a) A:1个节点 ,  B:3个节点,   或 A、B互换 (b) A:2个节点 , B:2个节点可以看出,情况(a) 是满足选举条件的,与(1)中的例子相同。 但是情况(b) 就不同了,因为A和B都是2个节点,都不满足 可用节点数量 > 总节点数量/2 的选举条件, 所以此时集群就彻底不能提供服务了。

结论:节点数量是奇数个的情况下, 集群总能对外提供服务(即使损失了一部分节点);如果节点数量是偶数个,会存在集群不能用的可能性(脑裂成两个均等的子集群的时候)。

二、Docker Swarm的配置及使用

  1. 准备四台安装了docker的阿里云服务器。
    在这里插入图片描述
  2. 将172.24.111.113作为Manager节点创建集群。由于四台服务器在同一地区,私有IP可以相互ping通,所以这里可以使用私有IP作为docker swarm的广播IP
docker swarm init --advertise-addr 172.24.111.116

运行后出现如下成功提示:
在这里插入图片描述
3. 将其他服务器加入该集群。

docker swarm join-token worker
docker swarm join-token manager

运行成功后,我们会拿到加入该集群所需的相应令牌。
在这里插入图片描述
我们只需要在其他服务器中,输入对应令牌,即可以相应的身份加入到集群中。

docker swarm join --token 对应令牌

运行后出现如下成功提示:
在这里插入图片描述在这里插入图片描述
如果想要退出集群,直接输入下面的命令:

docker swarm leave
  1. 查看建立完毕的集群。
docker node ls

在这里插入图片描述
Reachable,Leader节点均属于Manager节点,只有Manager节点才可以参与选举
你必须实时保证可用Manager节点数大于总Manager节点数的一半。如果我们现在停止三号节点的运行,由于运行的Manager只剩下一个,会出现如下图提示:
在这里插入图片描述

三、Docker Service向集群中添加服务

docker service命令类似于docker run,前者是运行一个服务,支持增扩容,只允许在集群中使用;后者单纯是一个容器,不支持增扩容。
在这里插入图片描述
replicated随机分配给任一节点,global模式为全局所有节点统一分配

docker service create --name 服务名A  --mode replicated/global 镜像名B
# 我们根据对应镜像,在集群中运行一个服务。注意这个服务会随机运行在集群中的任何一个服务器中。
# mode 定义该服务是随机一个节点运行一个副本还是所有节点均运行一个副本
docker service update --replicas 10 A
# 扩容,在这个集群中运行10个A服务
docker service update --replicas 1 A
# 缩容,在这个集群中运行1个A服务
docker service scale A=服务数量
# 等同于上面的update命令,都是用来扩缩容
命令功能
docker service ls查看全部服务
docker service ps 服务名A查看A的所有进程
docker service inspect 服务名A查看A的全部信息
docker service ls查看全部服务
docker service rm 服务名A从集群中删除一个服务已运行进程全部删除

四、Docker Stack部署集群

docker compose只能进行单机部署,而在docker compose中,我们使用docker stack进行集群部署。docker compose 与 docker stack 都使用docker-compose.yml进行服务配置。

Service:一个service只能运行一个image,但是可以运行出同一个image的多个containers(即这个images内可能包含多个容器)。
Stack:一个Stack是一组相互关联的services,这组service共享依赖,可被安排在一起运行和扩展。
在这里插入图片描述

docker stack deploy 服务名A --compose-file=docker-compose.yml 
# 使用yml在集群中建立一个stack
docker stack services A 
# 查看stack A中的所有容器
docker stack ls
# 查看所有stack
docker stack rm A
# 删除一个stack
docker logs 容器ID
# 根据容器ID查看日志,解决docker stack创建容器无法实时看到日志的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下的版本升级只是浮云

ubuntu从11.04到11.10,直接系统升级,那简直是扯蛋啊 gnome 也是 从2.32到了3 ,ubuntu从此停在了11.04,对我而言。 转载于:https://www.cnblogs.com/x3d/archive/2011/10/18/2661307.html

恢复快速启动栏里的“显示桌面”图标

在百度知道上看到一个提问,大意是说自己不小心把快速启动栏的“显示桌面”图标给删除了,“显示桌面”按钮是大家经常用到的操作按钮,有时误删除掉后,然后使用起来非常不方便。 因为刚刚帮一个朋友解决了同样的问题,所以…

python常用魔法函数

1、__init__(): 所有类的超类object,有一个默认包含pass的__init__()实现,这个函数会在对象初始化的时候调用,我们可以选择实现,也可以选择不实现,一般建议是实现的,不实现对象属性就不会被初始化&#xff…

Python3.4 Django MySQL MySQL-python 安装不成功解决办法 Unable to find vcvarsall.bat 错误

解决办法: 1.安装pymysql pip install pymysql 2.在Django项目中找到跟settings.py在同一个目录下的__init__.py 添加如下代码 import pymysql pymysql.install_as_MySQLdb() 然后就解决了 ----------------------------------------------------------------------…

Go出现警告struct doesn‘t have any exported fields, nor custom marshaling

Go出现警告struct doesnt have any exported fields, nor custom marshalingGo语言要求所有结构体成员变量的首字母需要大写,如果首字母小写的话,则该字段无法被外部包访问和解析,比如,json解析。 type student struct {Id intName string…

苹果MAC系统的安装

搞Iphone开发,没有苹果系统是不行的。由于我已经装好了苹果的雪豹系统,所以在此我只是简单在说一下大休怎么装! 苹果系统,现下在非苹果机上的安装分两种:1、虚拟机安装;2、物理机安装。 现在先说延续一种&a…

asp.net 对xml文件的读写,添加,修改,删除操作

下面有代码调试正确 using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.Html…

sphinx和coreseek

sphinx是国外的一款搜索软件。 coreseek是在sphinx的基础上,增加了中文分词功能,换句话说,就是支持了中文。 Coreseek发布了3.2.14版本和4.1版本,其中的3.2.14版本是2010年发布的,它是基于Sphinx0.9.9搜索引擎的。而4.…

Spring security/Shiro ---登陆成功后返回登陆前界面<页面重定向>

Spring security ---登陆成功后返回登陆前界面<页面重定向>问题&#xff1a;在登陆/退出成功后&#xff0c;我们往往通过http.formLogin().successForwardUrl()和http.logout().logoutSuccessUrl()设定操作成功后的回跳页面。我们现在希望在任意界面跳转到登陆界面后&…

linux下编译的PHP添加soap扩展

# 进入源码cd /opt/php-5.5.17/# 进入扩展cd /ext/soap# PHP之前是编译好的&#xff0c;有phpize&#xff0c;用它生成configure文件。/usr/local/php-5.5.17/bin/phpize# 执行configure&#xff0c;之前编译好的PHP一定要有php-config./configure --with-php-config/usr/local…

针对plsql developer使用做的三个小设置

来自&#xff1a;http://www.cnblogs.com/william-lee/archive/2010/12/08/1900176.html 1、原来大家在sql窗口写多条sql语句&#xff0c;如果点击“执行”&#xff0c;那么会执行窗口下的所有语句&#xff0c;如果向执行所要的语句&#xff0c;必须选定它。 那么&#xff0c;有…

asp.net导出Excel类库

using System; using System.Collections.Generic; using System.Reflection; using System.Web; using Excel Microsoft.Office.Interop.Excel; /// <summary> ///ExcelClass 的摘要说明 /// </summary> public class ExcelClass { /// <su…

今天将Notebook还原了, 第一次外加了外围电路

因为天气太热了, 我的Aspire 5502出了问题, 用Ghost还原中途死机, 找了问题原来是太热了....又在宿舍, 没有空调, 又不想去图书馆, 最后就问奶仔借了部风扇, 总算搞掂了...相机太快了....看上去风扇好像停了....不仅有风扇, 它还要裸跑才能胜利还原....温度一高就自动关机了...…

SpringBoot生成日志文件---logback和log4j

SpringBoot生成日志文件---logback和log4j一、logbacklogback是SpringBoot自带的日志文件&#xff0c;默认会为控制台输出INFO级别的日志&#xff0c;并且不会将日志文件保存。如果我们只需要输出日志到文件&#xff0c;直接给application.yml中添加如下配置&#xff0c;对应日…

分清DB_NAME、INSTANCE_NAME、ORACLE_SID、SERVICE_NAME、DB_DOMAIN和GLOBAL_DB_NAME

Oracle安装前&#xff0c;首先要分清DB_NAME、INSTANCE_NAME、ORACLE_SID、SERVICE_NAME、DB_DOMAIN和GLOBAL_DB_NAME的概念。 一个运行着的ORACLE数据库就可以看成是一个ORACLE SERVER&#xff0c;该SERVER由数据库(Database)和实例(Instance)组成&#xff0c;在一般的情况下一…

几种经典的数据排序及其Java实现

选择排序 思想 n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果&#xff1a; ①初始状态&#xff1a;无序区为R[1..n]&#xff0c;有序区为空。 ②第1趟排序 在无序区R[1..n]中选出关键字最小的记录R[k]&#xff0c;将它与无序区的第1个记录R[1]交换&#…

远见卓识,领导力在于把握企业潮流

凡是有人群的地方就有领导力&#xff0c;凡是有思想、有文化的地方就有领导力。经济学里&#xff0c;是在市场的意义上研究领导力&#xff1a;谁在引领价格变动的方式&#xff0c;谁在引领技术变化的潮流&#xff0c;谁在引导产品的发展趋势&#xff0c;这些都是领导力的概念。…

关于SqlBulkCopy SQL批量导入需要注意,列名是区分大小写的

最近在做数据从Excel批量导入MSSQL时&#xff0c;传统的是使用Insert Into Table方法&#xff0c;不过这个方便比较慢 通过使用 SqlBulkCopy 可以批量导入到数据库。 默认批量导入数据库&#xff0c;需要DataTable的构架和MSSQL的表结构一样。但是使用ColumnMappings可以对列明…

VMware开启NAT模式/仅主机模式后主机ping不通虚拟机的问题

VMware开启NAT模式/仅主机模式后主机ping不通虚拟机的问题问题&#xff1a;VMware设置网络模式为NAT模式后&#xff0c;我们使用主机ping虚拟机无法联通&#xff0c;用虚拟机ping主机可以联通。 原因&#xff1a;这是由于虚拟机的IP网段与主机的VMnet8网段不一致所造成的。 解…

linux下 mysql 忘记root用户密码解决办法

一、以系统的root用户&#xff08;什么&#xff0c;你的系统的root用户密码也忘了。那只好看我另外一篇linux下忘记root用户的解决办法了先解决这个问题&#xff09;登陆系统&#xff0c;进入终端 [rootlocalhost /]# 二、杀掉mysql进程 方法1、[rootlocalhost /]#killall m…