Docker笔记:Docker Swarm 结合 Docker Compose 来部署集群

docker swarm 结合 docker-compose.yml 部署集群

1 )准备 docker-compose.yml的文件, 示例 demo 如下

version: "3"
services:mysql_c:image: mysqlenvironment:MYSQL_ROOT_PASSWORD: 123456restart: alwaysports:- 3306:3306volumes:- /root/mysql/conf.d:/etc/mysql/conf.d- /root/mysql/data:/var/lib/mysqlgoweb1:image: gowebimgrestart: alwaysdeploy:replicas: 6 # 副本数量resources: # 资源limits: # 配置cpucpus: "0.3" # 设置该容器最多只能使用 30% 的 CPUmemory: 500M # 设置该容器最多只能使用 500M内存restart_policy: # 定义容器重启策略, 用于代替 restart 参数condition: on-failure # 只有当容器内部应用程序出现问题才会重启depends_on:- mysql_cnginx:image: nginxrestart: alwaysports:- 80:80depends_on:- goweb1volumes:- /root/nginx/conf.d/:/etc/nginx/conf.ddeploy:replicas: 6 #副本数量resources: #资源limits: #配置cpucpus: "0.3" # 设置该容器最多只能使用 30% 的 CPUmemory: 500M # 设置该容器最多只能使用 500M内存restart_policy: # 定义容器重启策略, 用于代替 restart 参数condition: on-failure #只有当容器内部应用程序出现问题才会重启
  • 基于 docker-compose可以在一台服务器上创建多个容器
  • 想在多台服务器上一次创建多个容器, 需要结合 Swarm
    • $ docker stack deploy --compose-file docker-compose.yml swarmName
      • swarmName是我们的swarm对应的名称,可以自行随意配置, 比如 goWebSwarm
  • 以上配置的问题是 mysql 没有进行集群
    • mysql 需要单独搭建集群,这里涉及到主从数据库
    • 为了方便起见,直接配置到了 yml 文件里
    • 这里mysql的副本数量不能配置多个
    • 如果多个,就会运行在多台服务器上,会出现数据异常和不一致的问题

2 )搭建集群

  • $ docker swarm init --advertise-addr 192.168.1.10 初始化集群并创建管理节点(当前指定的ip为管理节点)
    • 填入自己主机的ip
  • $ docker swarm join --token SWMTKN-1-52tr219htvsg1volky2tej7pj8bjs2j78q4b6wc9fnt72kkchd-29ohn4mgz191f6oznldvjiw47 192.168.1.10:2377
    • 其他主机加入集群
  • 根据 yml 文件,这里的集群是 nginx 和 goweb的集群,它们都有6个副本,mysql 服务只有一个副本

3 )部署和验证

  • $ docker stack deploy --compose-file docker-compose.yml goWebSwarm 开始部署服务
    • 调用这个命令的时候,首先创建了网络
    • 接着创建3个服务
    • 这3个服务使用了同一个网络,默认这三个服务可以直接连通
  • $ docker service ls 可查看当前运行起来的服务
  • $ docker service ps goWebSwarm 查看当前某个服务
  • 通过 docker-compose 部署,可见生成了3个服务,这三个服务,使用了同一个网络
  • 这里同样存在之前的,mysql服务启动了,接着goWeb服务也启动,但是mysql服务并没有完全可用的状态
    • 可以用之前的脚本解决
    • 可以重启 goWeb项目 (或扩容,缩容来重启)
    • 可以先单独部署 mysql的集群,之后再部署 goWeb 和 Nginx 服务
      • 这种就不属于这里的集群了,mysql集群作为一项单独的集群
      • goWeb应用的配置文件也要对应同步修改

4 )配置部署额外的一台Nginx服务器(非集群内)

  • 额外的NG服务器,用于做路由和转发到集群内的nginx服务器
  • 在集群内的各个主机磁盘上都有 /root/nginx/conf.d/ 目录中都有一个 default.conf 文件
    upstream backend {ip_hash;server goweb1:8080; # 这里是 goweb1 容器服务的host别名
    }server {listen       80;server_name  localhost; # 你的域名地址location / {# 设置主机头和客户端真实地址,以便服务器获取客户端真实IP         # 禁用缓存proxy_buffering off; # 反向代理的地址proxy_pass http://backend;     }#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root  html;}
    }
    
    • 当访问这个时,nginx将 80 转发到 8080
  • 现在,我们要配置nginx的主机,也就是转发到集群内,进行负载均衡的配置
    upstream backend {ip_hash;server 192.168.1.10 weight=1; # 集群内的服务 ip 这里有一台 nginx服务器server 192.168.1.11 weight=1;server 192.168.1.12 weight=1;server 192.168.1.13 weight=1;
    }server {listen       80;server_name  goweb.xxxx.com; # 你的域名地址 这里本机可以配置 host, 如果在服务器配置 域名解析add_header backendCode $upstream_status;add_header BackendIP "$upstream_addr;" always;location / {# 设置主机头和客户端真实地址,以便服务器获取客户端真实 IPproxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# nginx服务器与被代理服务连接超时时间,代理超时,请求一台超过1s就会转发到其他ipproxy_connect_timeout 1s;# 禁用缓存proxy_buffering off;# 反向代理的地址proxy_pass http://backend;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root  html;}
    }
    
  • 上面用于查看nginx服务器转发节点的配置
    • proxy_set_header X-Real-IP $remote_addr;
    • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    • 加上这个,在浏览器中可以看到转发的服务器,在响应表头,会有一个 BackendIP 的字段
  • 启动 nginx 主机
    • $ docker run -itd --name nginxweb -p 80:80 -v /root/nginx/conf.d:/etc/nginx/conf.d nginx

5 )整体架构如下

  • 第一层 )nginx 服务器接收到请求后转发到集群中的各台主机上

    • 这里是最外面的一层 nginx 作为负载均衡
    • 这台nginx服务器是一台高性能服务器,只负责转发,没有其他处理任务
  • 第二层 )集群里面有各类服务

    • nginx goWeb
      • goWeb 连接到 mysql 或 mysql集群服务
    • nginx goWeb
      • 同上
    • nginx goWeb
      • 同上
    • 这个集群内部的nginx服务会动态负载均衡到各个goWeb服务
  • 第三层 )mysql 或 mysql集群

    • 目前我们的mysql 只有一台服务,并且配置在compose文件里
  • 以上三个层,是我们服务端一般的设计方案,当然上面没用到 mysql 集群

  • 以上架构可支持 100W 的访问量 (使用mysql集群)

  • 如果需要负载更多, 可把这套架构复制到多个城市地区

    • 一般情况下,域名解析只能配置到一台服务器
    • 当然,有个动态域名解析,可以支持多台
    • 这样就可以根据请求判断转发到那些服务器

关于 Docker Swarm 的 Raft 一致性算法

  • Raft:一致性算法,在保证大多数管理节点存活的情况下,集群才能使用
  • 所以就要求如果集群的话,manager节点必须 >=3 台
    • manager: 管理节点,用于管理工作节点
  • 如果是两个台,其中一台宕机,剩余的一台也将不可用,以致整个集群不可用
  • 为了利用 swarm 模式的容错特性,Docker 建议您根据组织的高可用性要求实现奇数个节点
  • 当您有多个管理器时,您可以从管理器节点的故障中恢复而无需停机
    • 一个3管理器群最多可以容忍1名管理器的损失
    • 一个5管理器群最多可以同时丢失2个管理器节点
    • 一个N管理器集群最多可以容忍丢失 (N - 1) / 2 管理器
    • Docker 建议一个Swarm集群最多使用7个管理器节点

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

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

相关文章

【深度学习初探】Day32 - 三维点云数据基础

【深度学习初探】Day32 - 三维点云数据基础 文章目录 【深度学习初探】Day32 - 三维点云数据基础一、点云的定义二、点云的获取三、点云的属性四、点云的存储格式4.1 pts4.2 LAS4.3 PCD4.4 .xyz4.5 .pcap 五、三维点云的表示方法5.1 二维投影5.2 三维体素5.3 原始点云5.4 图 六…

Node.js创建一个简单的WebSocket接口,实现通信交互

Node.js创建一个简单的WebSocket接口,实现通信交互 一、为什么使用WebSocket? WebSocket,最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话&#xf…

IIS + Axios 跨域设置

1、服务器端设置IIS &#xff08;web.config) 即可&#xff0c;不需要对django settings.py做配置&#xff08;python manage.py runserver 才需要settings.py配置跨域&#xff0c;IIS在iis上配&#xff09; 网站根目录的web.config中加上这段&#xff1a; <httpProtocol&…

基于开源的JAVA mongodb jdbc 驱动 使用教程

基于开源的JAVA mongodb jdbc 驱动 使用教程介绍 介绍 本文介绍一款开源的基于JAVA的 Mongodb JDBC 驱动使用教程 开源地址 https://gitee.com/bgong/jdbc-mongodb-driver功能价值 与mybaits融合&#xff1a;复用mybatis的功能特性&#xff0c;如:缓存,if动态判断标签等特…

[Git]-{修改远程仓库地址}

详细步骤 1.查看仓库地址 git remote -v git remote -v origin http://10.1.128.48:12080/assr403t/bootloader (fetch) origin http://10.1.128.48:12080/assr403t/bootloader (push) 2. 修改为另一个仓库地址 git remote set-url origin <新地址> git remote set-…

亚马逊云科技 re:Invent 大会 - ElastiCache Serverless模式来袭

亚马逊云科技 re:Invent 大会 - ElastiCache Serverless模式来袭 本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 文章目录 亚马逊云…

GoLang 学习 (入门)

go run 1.go 执行命令 go build 1.go 打包为exe 快速 并且无依赖 在开始项目 需要 生成 go.mod go mod init mod 终端执行 go: creating new go.mod: module mod go: to add module requirements and sums:go mod tidy go的基本目录结构 src ------gocode ------------项…

日期问题(C语言蓝桥杯2017年题目G)

分析&#xff1a;我们输入的AA/BB/CC有三种情况&#xff0c;所以我们编写一个函数&#xff0c;来判断三个数字作为 年 月 日是否合法&#xff0c;合法就输出&#xff0c;不合法就终止&#xff0c;还要查重&#xff0c;如果有相同的时间&#xff0c;就不重复打印&#xff0c;…

如何看待「前端已死论」?

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

oracle 修改监听端口

oracle的监听是非常重要的一个功能组件&#xff0c;在Oracle数据库服务器中&#xff0c;通过一个叫“监听器”的组件接收来自客户端的连接请求。它是客户端和服务器端的中间组件。监听器&#xff08;LISTENER&#xff09;是位于服务器端的、独立运行的一个后台进程&#xff0c;…

微信小程序 实现上传图片前裁剪功能

前言 技术支持&#xff1a; wx-cropper 裁剪 总体思路是&#xff1a;安装完wx-cropper之后就它当成组件使用。在使用页面的地方引入组件就行。上传图片的逻辑不变&#xff0c;在 通过wx.chooseMedia() Api 拿到图片之后传递给子组件&#xff0c;子组件在拿到图片进行裁剪处理等…

路由器原理

目录 一.路由器 1.路由器的转发原理 2.路由器的工作原理 二.路由表 1.路由表的形成 2.路由表表头含义 直连&#xff1a; 非直连&#xff1a; 静态 静态路由的配置 负载均衡&#xff08;浮动路由&#xff09; 默认路由 动态 三.交换与路由对比 一.路由器 1.路由器…

快速多列查找匹配关键字

实例需求&#xff1a;根据第一列专业名称&#xff0c;在“专业分类指导目录”中&#xff0c;针对三个学历层次&#xff08;研究生、本科生、专科生&#xff09;分别查找对应专业类别&#xff0c;填写在对应位置&#xff0c;即截图中的黄色区域。 需要注意如下两点&#xff1a; …

OpenCV开发:编译安装opencv

OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它为开发者提供了丰富的工具和函数&#xff0c;用于处理图像和视频数据&#xff0c;以及执行各种计算机视觉任务。 以下是 OpenCV 的一些主要特点和功能&#xff…

【Java】Spring Bean有几种配置方式?

定义 Spring Bcan 的3 种方式分别是:基于XML 的方式配置、基于注解扫播方式配置、基于元数据类的配置。 SpringBean是Spring中最基本的组成单元&#xff0c;Spring 官方文档对 Bean 的解释是这样的:In Spring, the objects that form the backbone of your application and tha…

华为HCIP认证H12-821题库上

1、2.OSPF核心知识 &#xff08;单选题&#xff09;下面关于0SPF的特殊区域&#xff0c;描述错误的是: A、Totally Stub Area允许ABR发布缺省的三类LSA,不接受五类LSA和细化三类LSA B、NSSA Area和Stub区域的不同在于该区域允许自治系统外部路由的引入&#xff0c;由ABR发布…

Linux完成mysql数据库的备份与恢复

背景&#xff1a; 在进行数据报表的测试过程中&#xff0c;为了让我们的测试数据更加真实&#xff0c;因此我们需要同步生产数据到测试环境。方式有很多种&#xff0c;我这里介绍的是通过Linux完成数据同步。 备份数据&#xff1a; 执行命令&#xff1a;mysqldump -uxxx -pxxx…

PyCharm连接远程服务器

要求&#xff1a;PyCharm专业版才支持远程服务 一、创建远程连接 先建立本地与远程服务器之间的SSH连接 1、配置连接 2、建立SSH连接&#xff0c;选择文件传输协议 SFTP 3、设置服务器名&#xff08;可以随意命名&#xff09; 4、配置 SSH连接 点击 172.18.1.202 配置…

字符串排序算法

题目描述&#xff1a; 题目描述 设计一个程序&#xff0c;实现对输入字符串数组按字符串长度进行排序功能。具体要求如下&#xff1a;编写函数void sortByLength(char *strArray[], int numStrings);&#xff0c;用于对输入的字符串数组 strArray 按字符串长度进行升序排序。在…

bugkuctf web随记wp

常规思路&#xff1a; 1&#xff0c;源码2&#xff0c;抓包3&#xff0c;御剑dirsearch扫后台检查是否有git文件未删除4&#xff0c;参数 本地管理员&#xff1a;1&#xff0c;cu看源码&#xff0c;sci看源码有一串东西2&#xff0c;base64解码后是test123猜测是密码3&#x…