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,一经查实,立即删除!

相关文章

python常用魔法函数

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

苹果MAC系统的安装

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

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()设定操作成功后的回跳页面。我们现在希望在任意界面跳转到登陆界面后&…

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

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

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

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

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

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

OO设计原则总结

什么是设计原则&#xff1f; 设计原则是基本的工具&#xff0c;应用这些规则可以使你的代码更加灵活、更容易维护&#xff0c;更容易扩展。 基本原则封装变化Encapsulate what varies. 面向接口编程而非实现 Code to an interface rather than to an implementation.优先使用组…

kubectl get node运行时出现:Unable to connect to the server: x509: certificate signed by unknown authority

kubectl get nodes运行时出现&#xff1a;Unable to connect to the server: x509: certificate signed by unknown authority原因&#xff1a;我们在运行kubeadm reset时&#xff0c;没有删除原先的$HOME/.kube文件导致新建的kubelet报错。实际上在kubeadm reset执行后&#x…

POJ 1966 Cable TV Network (最大流最小割)

$ POJ~1966~Cable~TV~Network $ $ solution: $ 第一眼可能让人很难下手&#xff0c;但本就是冲着网络流来的&#xff0c;所以我们直接一点。这道题我们要让这个联通图断开&#xff0c;那么势必会有两个点变得不连通&#xff0c;这道题的数据范围很小&#xff0c;所以我们试着暴…

harbor安装时出现ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug in

harbor安装时出现ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value current val…

配置msdtc

配置msdtc需要分别配置数据库服务器和开发机&#xff0c;因为只有两个机器都配置正确了&#xff0c;分布式事务才不会报乌七八糟的错误。如果数据库服务器和开发机是同一台机器&#xff0c;那就不用看本文了&#xff0c;因为不存在分布式事务的问题。 数据库服务器和开发机中配…

什么是套接字?Socket基本介绍

什么是套接字&#xff1f;Socket基本介绍一、什么是套接字&#xff1f;二、套接字特性三、套接字缓冲区一、什么是套接字&#xff1f; 套接字是一种通信机制&#xff08;通信的两方的一种约定&#xff09;&#xff0c;socket屏蔽了各个协议的通信细节&#xff0c;提供了tcp/ip…

ARM-Button-Driver-硬件图

1、实物图 2、CPU接线图 3、实际硬件接图 转载于:https://www.cnblogs.com/xmphoenix/archive/2011/11/02/2233519.html

动态创建ActiveRecord条件的查询 MyQuery

在CMS中。我们经常会按一定的条件来进行搜索。如果用户没有选择这个条件的话&#xff0c;我们就不能将它放到sql中也许我们可以用自己拼装sql语句的方式很好的实现这种查询。然后再前面过滤掉一些危险的参数但是参数过滤有一个不好的地方是。会把一些信息给过滤掉了。在castle …

kubenetes中port、targetPort、nodePort、containerPort的区别与联系

kubenetes中port、targetPort、nodePort、containerPort的区别与联系首先给出一张kubenetes结构图&#xff1a;containerPort containerPort是在pod控制器中定义的、pod中的容器需要暴露的端口。Pod中容器暴露的端口 targetPort targetPort是pod上的端口&#xff0c;从port/nod…

解决Spring下无法实时访问本地静态资源

解决Spring下浏览器无法实时访问本地静态资源场景1&#xff1a;原本地文件test.json中内容为 “1”。我们通过前后端交互操作&#xff0c;修改test.json的内容为 “2”。此时前端再次读取test.json&#xff0c;会发现内容依旧为 “1”&#xff0c;即前端并不会实时同步本地静态…

android 之数据存储(IO)

android 操作文件分为两种&#xff0c; 第一种&#xff1a;直接写到手机内存中&#xff0c;手机内存有限。 第二种&#xff1a;写到手机的内存卡(SD)中&#xff0c;进行操作文件。 以下分为两种情况的读精心操作&#xff0c;一个简单的demo.在此做一个记录。 代码。 package co…

Aspose.Java实现word转pdf,添加水印等操作

Aspose.Java实现word转pdf&#xff0c;添加水印等操作一. word转pdf二. 文档插入水印Aspose是一款商用版控件&#xff0c;支持各类文档操作&#xff0c;这里主要介绍如何在Springboot项目中使用破解版。 一. word转pdf 在项目中导入aspose.word包 百度网盘下载 提取码&#x…

SQL三种连接:内连接、外连接、交叉连接

SQL三种连接&#xff1a;内连接、外连接、交叉连接一、交叉连接&#xff08;CROSS JOIN&#xff09;二、内连接&#xff08;INNER JOIN&#xff09;三、外连接&#xff08;LEFT JOIN、RIGHT JOIN、FULL JOIN&#xff09;1.左外连接2.右外连接3.完整外连接准备两张表并以PersonI…