Docker Swarm部署Maxscale Mariadb高可用主从复制集群
目标是使用Docker Swarm集群技术,配合MaxScale,实现MySQL读写分离与负载均衡。
一 实验环境
为了本次的测试,我准备了4台虚拟服务器,配置皆为2C,8G,100G空间,分别如下:
主机名/ip/角色
ty1/192.168.50.44/集群成员,manager,worker ty2/192.168.50.45/集群成员,manager,worker ty3/192.168.50.46/集群成员,manager,worker ty4/192.168.50.47/非集群成员,docker私有仓库
操作系统是CentOS x86_64 7.6
每台机器均需部署好docker环境,实际上我是装好了一台,利用这台克隆的另外三台
需要每台虚拟机能上网。
二 机器部署docker
1 一个兄弟把部署过程整理成了shell脚本
执行一下docker环境就部署完了脚本如下:
cat InstallDocker.sh #!/bin/bash UpdateCentOS() { yum update -y } InstallDocker() { echo docker安装: yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce systemctl start docker && systemctl enable docker docker pull nginx docker pull swarm } InstallDockerCompose() { echo 安装docker-compose,https://pip.pypa.io/en/stable/installing/ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python get-pip.py pip install -U docker-compose } UpdateCentOS InstallDocker InstallDockerCompose
2 新建一docker用户
不建议直接使用root用户直接管理docker,因为root权限过高,一般由专职的系统管理员进行管理,新建一docker用户,归属docker用户组管理docker没问题。
useradd -g docker docker
docker用户设置复杂度够的口令。
3 端过从iptables或firewalld中放开
Docker Swarm集群需开放了三个端口:
2377端口, 用于集群管理通信 7946端口, 用于集群节点之间的通信 4789端口, 用于overlay网络流量
为测试方便,我把firwalld及selinux都关了。
4 克隆机器
利用如上几步配置好的机器为模板,克隆另外几台机器,调整主机名和ip地址。
三 建立swarm集群
1 创建swarm
[docker@ty1 ~]$ docker swarm init --advertise-addr 192.168.50.44 Swarm initialized: current node (6hu6jw1ljgr1smagjvusptqjp) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-2f0prgo6os4x5kunyujq7qmesdd5m54smsayfbvg8l8eb0sq4e-5kyf4pox7tc0m8lbsf4goifi1 192.168.50.44:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
其中,–advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系
命令的提示信息里有worker结点加入集群的命令,在worker结点执行就行了,如果忘记了也不用担心,在manager结点执行如下命令即可:
docker swarm join-token worker
2 ty2,ty3 worker加入集群
分别在ty2,ty3执行上面提示的命令,用docker用户
docker swarm join --token SWMTKN-1-2f0prgo6os4x5kunyujq7qmesdd5m54smsayfbvg8l8eb0sq4e-5kyf4pox7tc0m8lbsf4goifi1 192.168.50.44:2377
此时,集群已经建立成功
3 查看集群信息
如下信息已经是我把worker提升为manager后的结果,使用如下命令:
docker node promote ty2 docker node promote ty3
多manager的好处是一个manager宕掉会有另一个接管管理,同时在每个manager结点都可以进行集群信息查看,方便。
查看集群结点:
[docker@ty1 ~]$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 6hu6jw1ljgr1smagjvusptqjp * ty1 Ready Active Reachable 19.03.3 tpa6emqnidznt0dev7zw4lqaj ty2 Ready Active Reachable 19.03.3 x9vkm6gj0r835idxjfly891a0 ty3 Ready Active Leader 19.03.3
4集群管理命令
1) 删除Swarm集群节点
[docker@ty2 ~]$ docker swarm leave docker swarm leave
在Docker Swarm集群中,在删除Docker集群节点后,集群中该节点仍然存在,但是状态显示为Down, 需要在Swarm的Manager节点执行以下命令, 删除已经移除的Worker节点:
[docker@ty1 ~]$ docker node rm --force tpa6emqnidznt0dev7zw4lqaj docker swarm leave
2) 更新Swarm集群节点
如果需要对Docker Swarm节点进行更新,需要在manager节点上执行命令:
[docker@ty1 ~]$ docker swarm update Swarm updated.
四 建立docker私有仓库
单就本文这个主题来说,这一步骤是可以略的。只所以要做这一步,原因是如果结点很多的话,使用私有仓库是会很快的。
实际搭建很简单,我在ty4这台操作,搭建一无认证私有仓库。
1 pull registry
[docker@ty4 ~]$ docker pull registry Using default tag: latest latest: Pulling from library/registry c87736221ed0: Pull complete 1cc8e0bb44df: Pull complete 54d33bcb37f5: Pull complete e8afc091c171: Pull complete b4541f6d3db6: Pull complete
2 运行registry
[docker@ty4 tmp]docker run -e REGISTRY_STORAGE_DELETE_ENABLED=true -d --restart always --name qiuyb_registry -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
执行完这一步,相当于私有仓库搭好了,在本地浏览器上查看 ip:5000/v2/_catalog中可以查看到存放的镜像列表,现在为空:`{repositories: [ ]}`
参数含义:
--restart 是否跟随docker服务重启 --name 仓库名称 -p 端口映射,前为宿主机的端口,后边是容器的端口,容器端口不可变 -v 挂载数据卷,防止容器删除导致上传的镜像丢失,/var/lib/registry路径是固定的
3 pull,tag,push mariadb-cluster和maxscale
在本地服务器上执行
docker pull toughiq/mariadb-cluster docker pull toughiq/maxscale // 修改toughiq/mariadb-cluster标签 docker tag toughiq/mariadb-cluster:latest 192.168.50.47:5000/toughiq/mariadb-cluster:latest // 推送toughiq/mariadb-cluster到私有仓库 docker push 192.168.50.47:5000/toughiq/mariadb-cluster:latest // 修改toughiq/maxscale标签 docker tag toughiq/maxscale:latest 192.168.50.47:5000/toughiq/maxscale:latest // 推送toughiq/maxscale到私有仓库 docker push 192.168.50.47:5000/toughiq/maxscale:latest
不出意外,会抛出类似如下错误
The push refers to repository [ip:5000/centos_test] Get https://ip:5000/v2/: http: server gave HTTP response to HTTPS client
这个错误是因为服务器没证书,不支持https导致,这时候只需要在服务其的配置文件/etc/docker/daemon.json添加 “insecure-registries”:[ip:port],然后再执行push
[docker@ty1 docker]$ pwd /etc/docker [docker@ty1 docker]$ cat daemon.json {"insecure-registries":["192.168.50.47:5000"]} [docker@ty1 docker]$
需要说明的说swarm集群的每台机器也需要有这个文件,不然在docker pull时也会报错。
4 查看一下
[docker@ty4 ~]$ docker image list REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.50.47:5000/toughiq/mariadb-cluster latest 624c665f6514 7 months ago 380MB toughiq/mariadb-cluster latest 624c665f6514 7 months ago 380MB 192.168.50.47:5000/toughiq/maxscale latest 3494a5c08bbd 7 months ago 326MB toughiq/maxscale latest 3494a5c08bbd 7 months ago 326MB registry latest f32a97de94e1 7 months ago 25.8MB
五 Mariadb集群部署
1 mariadb-cluster部署
1)创建一个swarm的全局网络
[docker@ty1 ~]$ docker network create -d overlay qiuybdbnet r8h05e5nfm1gp95jgavnyvrzm
2)创建mariadb-cluster,设置副本为1,这个实例自动变成引导节点
docker service create --name dbcluster \ --network qiuybdbnet \ --replicas=1 \ --env DB_SERVICE_NAME=dbcluster \ --env MYSQL_ROOT_PASSWORD=123456 \ --env MYSQL_DATABASE=mydb \ --env MYSQL_USER=mydbuser \ --env MYSQL_PASSWORD=123456 \ 192.168.50.47:5000/toughiq/mariadb-cluster:latest
注意:服务名称–name 需要与环境变量DB_SERVICE_NAME匹配,其中,MYSQL_ROOT_PASSWORD, MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD等环境变量是可选的。
[docker@ty1 ~]$ docker service ps dbcluster ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS ygrxojfbs5s4 dbcluster.1 192.168.50.47:5000/toughiq/mariadb-cluster:latest ty1 Running Running 22 minutes ago
3)扩展dbcluster服务的任务数量,为数据库集群增加2个节点
[docker@ty1 ~]$ docker service scale dbcluster=3
再看一下dbcluster服务
[docker@ty1 docker]$ docker service ps dbcluster ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS ygrxojfbs5s4 dbcluster.1 192.168.50.47:5000/toughiq/mariadb-cluster:latest ty1 Running Running 31 minutes ago on6gcogmmwq0 dbcluster.2 192.168.50.47:5000/toughiq/mariadb-cluster:latest ty2 Running Running 31 minutes ago j093evq34skj dbcluster.3 192.168.50.47:5000/toughiq/mariadb-cluster:latest ty3 Running Running 31 minutes ago
2 maxscale部署
1)maxscale部署
[docker@ty1 ~]$ docker service create --name maxscale \ --network qiuybdbnet \ --env DB_SERVICE_NAME=dbcluster \ --env ENABLE_ROOT_USER=1 \ --publish 3306:3306 \ 192.168.50.47:5000/toughiq/maxscale isq9y7b48o13kb7f21gf83wkf overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged [docker@ty1 ~]$ docker service ps maxscale ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS oz44ba00k1oy maxscale.1 192.168.50.47:5000/toughiq/maxscale:latest ty3 Running Running about a minute ago
要通过MaxScale禁用root对数据库的访问,只需设置–env ENABLE_ROOT_USER=0或删除该行即可,默认情况下禁用根访问。
2)通过maxcase查看mariadb集群情况
[docker@ty3 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bbca148e74b5 192.168.50.47:5000/toughiq/mariadb-cluster:latest "docker-entrypoint.s…" 21 hours ago Up 21 hours 3306/tcp, 4444/tcp, 4567-4568/tcp dbcluster.3.j093evq34skjtup28xhasrrwr a0a4fc40397d 192.168.50.47:5000/toughiq/maxscale:latest "/docker-entrypoint.…" 21 hours ago Up 21 hours 3306-3307/tcp, 4006/tcp, 4008/tcp, 4442/tcp, 6603/tcp maxscale.1.oz44ba00k1oyzn47vf3xbdqhc 205b1d75c00f 192.168.50.47:5000/toughiq/mariadb-cluster:latest "docker-entrypoint.s…" 21 hours ago Up 21 hours 3306/tcp, 4444/tcp, 4567-4568/tcp dbcluster.3.tluce8pq8jr1cdq1b35oiz5fv [docker@ty3 ~]$ [docker@ty3 ~]$ docker exec -it a0a4fc40397d maxadmin -pmariadb list servers Servers. -------------------+-----------------+-------+-------------+-------------------- Server | Address | Port | Connections | Status -------------------+-----------------+-------+-------------+-------------------- 10.0.0.7 | 10.0.0.7 | 3306 | 0 | Master, Synced, Running 10.0.0.9 | 10.0.0.9 | 3306 | 0 | Slave, Synced, Running 10.0.0.10 | 10.0.0.10 | 3306 | 0 | Slave, Synced, Running -------------------+-----------------+-------+-------------+--------------------
六 docker常用管理命令
1 Docker Swarm 常用命令
1)管理配置文件 docker config # 查看已创建配置文件 - docker config ls # 将已有配置文件添加到docker配置文件中 - docker config create docker 配置文件名 本地配置文件 2)管理swarm节点 docker node # 查看集群中的节点 - docker node ls # 将manager角色降级为worker - docker node demote 主机名 # 将worker角色升级为manager - docker node promote 主机名 # 查看节点的详细信息,默认json格式 - docker node inspect 主机名 # 查看节点信息平铺格式 - docker node inspect --pretty 主机名 # 查看运行的一个或多个及节点任务数,默认当前节点 - docker node ps # 从swarm中删除一个节点 - docker node rm 主机名 # 更新一个节点 - docker node update # 对节点设置状态(“active”正常|“pause”暂停|“drain”排除自身work任务) - docker node update --availability 3)管理敏感数据存储 docker secret 4)服务栈,栈的形式,一般作为编排使用,格式与docker compose相同。 docker stack # 通过.yml文件指令部署 - docker stack deploy -c 文件名.yml 编排服务名 # 查看编排服务 - docker stack ls 5)作为集群的管理 docker swarm # 初始化一个swarm - docker swarm init # 指定初始化ip地址节点 - docker swarm init --advertise-addr 管理端IP地址 # 去除本地之外的所有管理器身份 - docker swarm init --force-new-cluster # 将节点加入swarm集群,两种加入模式manager与worker - docker swarm join # 工作节点加入管理节点需要通过join-token认证 - docker swarm join-token # 重新获取docker获取初始化命令 - docker swarm join-token worker # 离开swarm - docker swarm leave # 对swarm集群更新配置 - docker swarm update 6)服务管理 docker service # 创建一个服务 - docker service create # 创建的副本数 - docker service create --replicas 副本数 # 指定容器名称 - docker service create --name 名字 # 每次容器与容器之间的更新时间间隔。 - docker service create --update-delay s秒 # 更新时同时并行更新数量,默认1 - docker service create --update-parallelism 个数 # 任务容器更新失败时的模式,(“pause”停止|”continue“继续),默认pause。 - docker service create --update-failure-action 类型 # 每次容器与容器之间的回滚时间间隔。 - docker service create --rollback-monitor 20s # 回滚故障率如果小于百分比允许运行 - docker service create --rollback-max-failure-ratio .数值(列“.2”为%20) # 添加网络 - docker service create --network 网络名 # 创建volume类型数据卷 - docker service create --mount type=volume,src=volume名称,dst=容器目录 # 创建bind读写目录挂载 - docker service create --mount type=bind,src=宿主目录,dst=容器目录 # 创建bind只读目录挂载 - docker service create --mount type=bind,src=宿主目录,dst=容器目录,readonly # 创建dnsrr负载均衡模式 - docker service create --endpoint-mode dnsrr 服务名 # 创建docker配置文件到容器本地目录 - docker service create --config source=docker配置文件,target=配置文件路径 # 创建添加端口 - docker service create --publish 暴露端口:容器端口 服务名 # 查看服务详细信息,默认json格式 - docker service inspect # 查看服务信息平铺形式 - docker service inspect --pretty 服务名 # 查看服务内输出 - docker service logs # 列出服务 - docker service ls # 列出服务任务信息 - docker service ps # 查看服务启动信息 - docker service ps 服务名 # 过滤只运行的任务信息 - docker service ps -f "desired-state=running" 服务名 # 删除服务 - docker service rm # 缩容扩容服务 - docker service scale # 扩展服务容器副本数量 - docker service scale 服务名=副本数 # 更新服务相关配置 - docker service update # 容器加入指令 - docker service update --args “指令” 服务名 # 更新服务容器版本 - docker service update --image 更新版本 服务名 # 回滚服务容器版本 - docker service update --rollback 回滚服务名 # 添加容器网络 - docker service update --network-add 网络名 服务名 # 删除容器网络 - docker service update --network-rm 网络名 服务名 # 服务添加暴露端口 - docker service update --publish-add 暴露端口:容器端口 服务名 # 移除暴露端口 - docker service update --publish-rm 暴露端口:容器端口 服务名 # 修改负载均衡模式为dnsrr - docker service update --endpoint-mode dnsrr 服务名 # 添加新的配置文件到容器内 - docker service update --config-add 配置文件名称,target=/../容器内配置文件名 服务名 eg: ---更新配置文件---- #a、建配置文件 docker config create nginx2_config nginx2.conf #b、删除旧配置文件 docker service update --config-rm ce_nginx_config 服务名 #c、添加新配置文件到服务 docker service update --config-add src=nginx2_config,target=/etc/nginx/nginx.conf ce_nginx # 删除配置文件 - docker service update --config-rm 配置文件名称 服务名 # 强制重启服务 - docker service update --force 服务名
2 查看所有容器IP地址
docker inspect --format='{{.Name}} - {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
3 进入容器环境
[docker@ty3 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bbca148e74b5 192.168.50.47:5000/toughiq/mariadb-cluster:latest "docker-entrypoint.s…" 21 hours ago Up 21 hours 3306/tcp, 4444/tcp, 4567-4568/tcp dbcluster.3.j093evq34skjtup28xhasrrwr a0a4fc40397d 192.168.50.47:5000/toughiq/maxscale:latest "/docker-entrypoint.…" 22 hours ago Up 33 seconds 3306-3307/tcp, 4006/tcp, 4008/tcp, 4442/tcp, 6603/tcp maxscale.1.oz44ba00k1oyzn47vf3xbdqhc 205b1d75c00f 192.168.50.47:5000/toughiq/mariadb-cluster:latest "docker-entrypoint.s…" 22 hours ago Up 21 hours 3306/tcp, 4444/tcp, 4567-4568/tcp dbcluster.3.tluce8pq8jr1cdq1b35oiz5fv [docker@ty3 ~]$ [docker@ty3 ~]$ docker exec -it a0a4fc40397d /bin/bash [root@a0a4fc40397d /]#
4 交换文件
[docker@ty3 ~]$ cd /tmp [docker@ty3 tmp]$ touch 123.txt [docker@ty3 tmp]$ docker cp ./123.txt a0a4fc40397d:/tmp/ [docker@ty3 tmp]$ docker exec -it a0a4fc40397d /bin/bash [root@a0a4fc40397d /]# cd /tmp [root@a0a4fc40397d tmp]# ls -l *.txt -rw-rw-r-- 1 1001 982 0 Oct 17 05:02 123.txt
七 参考文档
https://www.jianshu.com/p/5ad118e30dc1 https://www.cnblogs.com/xiangsikai/p/9935814.html
近期评论