使用docker搭建mysql集群

如何使用docker搭建mysql的集群(使用了percona/percona-xtradb-cluster和haproxy镜像)

获取docker的mysql镜像

获取docker仓库存在的mysql镜像

docker pull percona/percona-xtradb-cluster:latest  #获取镜像
#也可使用docker tag 【镜像名称】 【你需要的命名】 ,来个镜像加标签,可以让镜像名字短一些,便于使用

创建mysql集群服务

新建属于mysql集群的网段

docker network create --subnet=172.18.0.0/16 mysql-cluster-net

新建属于mysql服务的数据卷

docker volume create v1
docker volume create v2
docker volume create v3
docker volume create v4
docker volume create v5

创建第一个mysql的节点

docker run -d -p 3406:3306 -e MYSQL_ROOT_PASSWORD=Radiant123 -e CLUSTER_NAME=MIXEDINFOS-PXC -e XTRABACKUP_PASSWORD=Radiant123 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=mysql-cluster-net --ip 172.18.0.2 mixedinfos-pxc

创建后续的五个mysql节点

docker run -d -p 3407:3306 -e MYSQL_ROOT_PASSWORD=Radiant123 -e CLUSTER_NAME=MIXEDINFOS-PXC -e XTRABACKUP_PASSWORD=Radiant123 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=mysql-cluster-net --ip 172.18.0.3 mixedinfos-pxc

docker run -d -p 3408:3306 -e MYSQL_ROOT_PASSWORD=Radiant123 -e CLUSTER_NAME=MIXEDINFOS-PXC -e XTRABACKUP_PASSWORD=Radiant123 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql -v backup:/data --privileged --name=node3 --net=mysql-cluster-net --ip 172.18.0.4 mixedinfos-pxc

docker run -d -p 3409:3306 -e MYSQL_ROOT_PASSWORD=Radiant123 -e CLUSTER_NAME=MIXEDINFOS-PXC -e XTRABACKUP_PASSWORD=Radiant123 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql -v backup:/data --privileged --name=node4 --net=mysql-cluster-net --ip 172.18.0.5 mixedinfos-pxc

docker run -d -p 3410:3306 -e MYSQL_ROOT_PASSWORD=Radiant123 -e CLUSTER_NAME=MIXEDINFOS-PXC -e XTRABACKUP_PASSWORD=Radiant123 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=mysql-cluster-net --ip 172.18.0.6 mixedinfos-pxc
#第一个几点的命令和后续的几个有些不同

在节点创建完毕后登入其中任意一个镜像,创建一个名字叫“haproxy”且无密码无权限的用户,用于提供给haproxy来监听数据库的状态

docker exec -it node1 bash
mysql -uroot -p
#登录数据库
CREATE USER haproxy; -- 创建用户
FLUSH PRIVILEGES; -- 刷新权限

使用haproxy对mysql进行负载均衡

获取haproxy镜像

docker pull haproxy:latest

准备好haproxy的配置文件haproxy.cfg

我用的是docker for windows,和其他的系统有些差异
配置文件如下:

global
    #工作目录
    chroot /usr/local/etc/haproxy
    #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
    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
    #监控界面的访问的IP和端口
    bind  0.0.0.0:8888
    #访问协议
    mode        http
    #URI相对地址
    stats uri   /dbs
    #统计报告格式
    stats realm     Global\ statistics
    #登陆帐户信息
    stats auth  admin:abc123456
#数据库负载均衡
listen  proxy-mysql
    #访问的IP和端口
    bind  0.0.0.0:3306  
    #网络协议
    mode  tcp
    #负载均衡算法(轮询算法)
    #轮询算法:roundrobin
    #权重算法:static-rr
    #最少连接算法:leastconn
    #请求源IP算法:source 
    balance  roundrobin
    #日志格式
    option  tcplog
    #在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
    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
    #使用keepalive检测死链
    option  tcpka

将创建好的配置文件放在E:\root\mysql-cluster 下,
然后执行docker命令

docker run -it -d -p 4001:8888 -p 4002:3306 -v E:\root\mysql-cluster\haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg --name mixedinfos-haproxy --privileged --net=mysql-cluster-net --ip 172.18.0.7 haproxy

如果无法启动,可执行

docker logs 镜像名称

来查看失败的原因

进入haproxy镜像启动服务

docker exec -it mixedinfos-haproxy bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg

登录网页查看集群的状况

docker搭建postgresql 14主从库 docker搭建mysql集群_MySQL

数据库的连接

这里直接连接haproxy和docker之间映射的端口4002即可,密码是数据库密码