首页 > Docker > Docker Swarm部署Maxscale Mariadb高可用主从复制集群

Docker Swarm部署Maxscale Mariadb高可用主从复制集群

2019年10月17日 发表评论 阅读评论

目标是使用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
分类: Docker 标签: , , , ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.