Docker搭建Mysql集群
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker搭建Mysql集群相关的知识,希望对你有一定的参考价值。
Docker搭建Mysql集群
前言:使用PXC集群方案
搭建集群
- 安装PXC镜像
docker pull percona/percona-xtradb-cluster:5.7.21
- 改名
docker tag percona/percona-xtradb-cluster:5.7.21 pxc
- 创建net1网段
docker network create --subnet=172.18.0.0/16 net1
4.创建五个数据卷
docker volume create --name v1
docker volume create --name v2
docker volume create --name v3
docker volume create --name v4
docker volume create --name v5
5.创建备份数据卷(用于热备份数据)
docker volume create --name backup
- 创建PXC集群
注意,每个MySQL容器创建之后,等待1分钟左右再用客户端连接MySQL。另外,必须第1个MySQL节点启动成功,用MySQL客户端能连接上之后,再去创建其他MySQL节点。
创建第一个节点
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
创建第二个节点
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
创建第三个节点
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
创建第四个节点
docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
创建第五个节点
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc
数据库负载均衡
- 拉取haproxy镜像
docker pull haproxy:1.8.8
- 创建Haproxy配置文件
mkdir -p /home/soft/haproxy
vi /home/soft/haproxy/haproxy.cfg
haproxy.cfg内容如下:
global
chroot /usr/local/etc/haproxy
log 127.0.0.1 local5 info
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
listen admin_stats
bind 0.0.0.0:8888
mode http
stats uri /dbs
stats realm Global\\ statistics
stats auth admin:123456
listen proxy-mysql
bind 0.0.0.0:3306
mode tcp
balance roundrobin
option tcplog
option mysql-check user haproxy
server MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
server MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
server MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
option tcpka
- 在数据库集群中创建用户进行心跳检测
# 进入集群
docker exec -it node1 bash
# 进入Mysql
mysql -uroot -p123456
#创建用户
create user \'haproxy\'@\'%\' identified by \'\';
- 创建Haproxy容器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy:1.8.8
- 进入容器,在容器bash中启动Haproxy
docker exec -it h1 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
- 接下来便可以在浏览器中打开Haproxy监控界面,端口4001,在配置文件中定义有用户名admin,密码123456。
http://主机号:4001/dbs
双机热备
当一个HA挂掉的时候,另外一个可以顶上
- 进入Haproxy容器,安装Keepalived
docker exec -it h1 bash
apt-get update
apt-get install keepalived
- Keepalived配置文件
apt-get install vim
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication
auth_type PASS
auth_pass 123456
virtual_ipaddress
172.18.0.201
- 启动keepalived
service keepalived start
成功后可以在宿主机中ping 172.18.0.201
可以按照以上步骤,再另外创建一个Haproxy容器,注意映射的宿主机端口不能重复,Haproxy配置一样。然后在容器中安装Keepalived,配置也基本一样。这样便基本实现了Haproxy双机热备方案 命令如下:
- 创建Haproxy容器
docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --net=net1 --ip 172.18.0.8 --privileged haproxy
- 进入容器,在容器bash中启动Haproxy
docker exec -it h2 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
接下来便可以在浏览器中打开Haproxy监控界面,端口4001,在配置文件中定义有用户名admin,密码123456。
http://主机号:4003/dbs
3.进入h2容器
docker exec -it h2 bash
#更新软件包
apt-get update
#安装VIM
apt-get install vim
#安装Keepalived
apt-get install keepalived
#编辑Keepalived配置文件
vim /etc/keepalived/keepalived.conf
#启动Keepalived
service keepalived start
#宿主机执行ping命令
ping 172.18.0.201
Keepalived配置文件内容
vrrp_instance VI_1
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication
auth_type PASS
auth_pass 123456
virtual_ipaddress
172.18.0.201
外网访问虚拟ip
1.宿主机安装keepalived
yum -y install keepalived
2.处理Keepalived配置文件
#修改Keepalived配置文件
vi /etc/keepalived/keepalived.conf
#启动Keepalived
service keepalived start
Keepalived配置文件内容如下:
vrrp_instance VI_1
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication
auth_type PASS
auth_pass 1111
virtual_ipaddress
192.168.99.150
virtual_server 192.168.99.150 8888
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 8888
weight 1
virtual_server 192.168.99.150 3306
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 3306
weight 1
- 启动Keepalived服务
# 启动
service keepalived start
# 状态
#service keepalived status
# 停止
#service keepalived stop
之后其他电脑便可以通过虚拟IP的8888和3306端口来访问宿主机Docker中的 172.18.0.201 的相应端口
热备份
- 全量备份:备份全部数据。备份过程时间长,占用空间大。第一次备份要使用全量备份
- 增量备份: 只备份变化的那部分数据。备份的时间短,占用空间小。第二次以后使用增量备份
PXC全量备份
1.备份要在某个PXC节点的容器内进行,但应该把备份数据保存到宿主机内。所以采用目录映射技术。先新建Docker卷:
docker volume create backup
2.挑选一个PXC节点node1,将其容器停止并删除,然后重新创建一个增加了backup目录映射的node1容器
docker stop node1
docker rm node1 # 数据库数据保存在Docker卷v1中,不会丢失
# 参数改变:
# 1. -e CLUSTER_JOIN=node2;原来其他节点是通过node1加入集群的,现在node1重新创建,需要选择一个其他节点加入集群
# 2. -v backup:/data;将Docker卷backup映射到容器的/data目录
docker run -d -u root -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node2 -v v1:/var/lib/mysql -v backup:/data --network=net1 --ip 172.18.0.2 --name=node1 pxc
3.在node1容器中安装percona-xtrabackup-24
docker exec -it node1 bash
apt-get update
apt-get install percona-xtrabackup-24
4.之后便可以执行如下命令进行全量备份,备份后的数据会保存在 /data/backup/full
目录下:
mkdir /data/backup
mkdir /data/backup/full
xtrabackup --backup -uroot -pabc123456 --target-dir=/data/backup/full
PXC全量还原
- 停止并删除PXC集群所有节点
docker stop node1 node2 node3 node4 node5
docker rm node1 node2 node3 node4 node5
docker volume rm v1 v2 v3 v4 v5
- 按照之前的步骤重新创建node1容器,并进入容器,执行冷还原
# 创建卷
docker volume create v1
# 创建容器
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --name=node1 --network=net1 --ip 172.18.0.2 pxc
# 以root身份进入容器
docker exec -it -uroot node1 bash
# 删除数据
rm -rf /var/lib/mysql/*
# 准备阶段
xtrabackup --prepare --target-dir=/data/backup/full/
# 执行冷还原
xtrabackup --copy-back --target-dir=/data/backup/full/
# 更改还原后的数据库文件属主
chown -R mysql:mysql /var/lib/mysql
# 退出容器后,重启容器
docker stop node1
docker start node1
以上是关于Docker搭建Mysql集群的主要内容,如果未能解决你的问题,请参考以下文章
云原生时代必须具备的核心技能之Docker高级篇(Docker实战之MySQL高可用集群搭建)