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

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

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

目标是使用Docker Swarm集群技术,配合MaxScale,实现MySQL读写分离与负载均衡。

一 实验环境
为了本次的测试,我准备了4台虚拟服务器,配置皆为2C,8G,100G空间,分别如下:
主机名/ip/角色

1
2
3
4
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环境就部署完了脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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没问题。

1
useradd -g docker docker

docker用户设置复杂度够的口令。

3 端过从iptables或firewalld中放开
Docker Swarm集群需开放了三个端口:

1
2
3
2377端口, 用于集群管理通信
7946端口, 用于集群节点之间的通信
4789端口, 用于overlay网络流量

为测试方便,我把firwalld及selinux都关了。

4 克隆机器
利用如上几步配置好的机器为模板,克隆另外几台机器,调整主机名和ip地址。
三 建立swarm集群
1 创建swarm

1
2
3
4
5
6
7
8
[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结点执行如下命令即可:

1
docker swarm join-token worker

2 ty2,ty3 worker加入集群
分别在ty2,ty3执行上面提示的命令,用docker用户

1
docker swarm join --token SWMTKN-1-2f0prgo6os4x5kunyujq7qmesdd5m54smsayfbvg8l8eb0sq4e-5kyf4pox7tc0m8lbsf4goifi1 192.168.50.44:2377

此时,集群已经建立成功
3 查看集群信息
如下信息已经是我把worker提升为manager后的结果,使用如下命令:

1
2
docker node promote ty2
docker node promote ty3

多manager的好处是一个manager宕掉会有另一个接管管理,同时在每个manager结点都可以进行集群信息查看,方便。
查看集群结点:

1
2
3
4
5
[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集群节点

1
2
[docker@ty2 ~]$ docker swarm leave
docker swarm leave

在Docker Swarm集群中,在删除Docker集群节点后,集群中该节点仍然存在,但是状态显示为Down, 需要在Swarm的Manager节点执行以下命令, 删除已经移除的Worker节点:

1
2
[docker@ty1 ~]$ docker node rm --force tpa6emqnidznt0dev7zw4lqaj
docker swarm leave

2) 更新Swarm集群节点
如果需要对Docker Swarm节点进行更新,需要在manager节点上执行命令:

1
2
[docker@ty1 ~]$ docker swarm update
Swarm updated.

四 建立docker私有仓库
单就本文这个主题来说,这一步骤是可以略的。只所以要做这一步,原因是如果结点很多的话,使用私有仓库是会很快的。
实际搭建很简单,我在ty4这台操作,搭建一无认证私有仓库。
1 pull registry

1
2
3
4
5
6
7
8
[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

1
[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: [ ]}`
参数含义:

1
2
3
4
--restart  是否跟随docker服务重启
--name 仓库名称
-p  端口映射,前为宿主机的端口,后边是容器的端口,容器端口不可变
-v 挂载数据卷,防止容器删除导致上传的镜像丢失,/var/lib/registry路径是固定的

3 pull,tag,push mariadb-cluster和maxscale
在本地服务器上执行

1
2
3
4
5
6
7
8
9
10
11
12
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

不出意外,会抛出类似如下错误

1
2
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

1
2
3
4
5
[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 查看一下

1
2
3
4
5
6
7
[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的全局网络

1
2
[docker@ty1 ~]$ docker network create -d overlay qiuybdbnet
r8h05e5nfm1gp95jgavnyvrzm

2)创建mariadb-cluster,设置副本为1,这个实例自动变成引导节点

1
2
3
4
5
6
7
8
9
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等环境变量是可选的。

1
2
3
[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个节点

1
[docker@ty1 ~]$ docker service scale dbcluster=3

再看一下dbcluster服务

1
2
3
4
5
[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部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[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集群情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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地址

1
docker inspect --format='{{.Name}} - {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

3 进入容器环境

1
2
3
4
5
6
7
8
[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 交换文件

1
2
3
4
5
6
7
[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

七 参考文档

1
2
https://www.jianshu.com/p/5ad118e30dc1
https://www.cnblogs.com/xiangsikai/p/9935814.html
分类: Docker 标签: , , , ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.