Docker搭建Mysql集群

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker搭建Mysql集群相关的知识,希望对你有一定的参考价值。

Docker搭建Mysql集群

前言:使用PXC集群方案

搭建集群

  1. 安装PXC镜像
docker pull percona/percona-xtradb-cluster:5.7.21
  1. 改名
docker tag percona/percona-xtradb-cluster:5.7.21 pxc
  1. 创建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
  1. 创建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

数据库负载均衡

  1. 拉取haproxy镜像
docker pull haproxy:1.8.8
  1. 创建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  
  1. 在数据库集群中创建用户进行心跳检测
# 进入集群
docker exec -it node1 bash
# 进入Mysql
mysql -uroot -p123456
#创建用户
create user \'haproxy\'@\'%\' identified by \'\';
  1. 创建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
  1. 进入容器,在容器bash中启动Haproxy
docker exec -it h1 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
  1. 接下来便可以在浏览器中打开Haproxy监控界面,端口4001,在配置文件中定义有用户名admin,密码123456。
http://主机号:4001/dbs

双机热备

当一个HA挂掉的时候,另外一个可以顶上

  1. 进入Haproxy容器,安装Keepalived
docker exec -it h1 bash
apt-get update
apt-get install keepalived
  1. 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
    

  1. 启动keepalived
service keepalived start

成功后可以在宿主机中ping 172.18.0.201

可以按照以上步骤,再另外创建一个Haproxy容器,注意映射的宿主机端口不能重复,Haproxy配置一样。然后在容器中安装Keepalived,配置也基本一样。这样便基本实现了Haproxy双机热备方案 命令如下:

  1. 创建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
  1. 进入容器,在容器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
    

  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全量还原

  1. 停止并删除PXC集群所有节点
docker stop node1 node2 node3 node4 node5
docker rm node1 node2 node3 node4 node5
docker volume rm v1 v2 v3 v4 v5
  1. 按照之前的步骤重新创建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高可用集群搭建)

docker简易搭建MySQL集群

docker搭建集群mysql

Docker搭建mysql集群

docker应用-6(mysql+mycat 搭建数据库集群)

Docker搭建MySQL主从集群,基于GTID