一、集群方案
1、Replication
2、PXC (Percona XtraDB Cluster)
1、安装镜像
docker pull percona/percona-xtradb-cluster:5.7.33
2、重命名镜像(缩短镜像名称)
docker tag percona/percona-xtradb-cluster:5.7.33 pxc
# 移除原镜像
docker rmi percona/percona-xtradb-cluster:5.7.33
3、创建net1网段
# 创建网段
docker network create --subnet=172.18.0.0/24 net1
# 查看网段
# docker network inspect net1
# 删除网段
# docker network rm net1
4、创建五个数据卷(pxc无法直接存取宿组机的数据,所以创建五个docker数据卷)
docker volume create v1
docker volume create v2
docker volume create v3
docker volume create v4
docker volume create v5
# 查看数据卷位置
#docker inspect v1
# 删除数据卷
#docker volume rm v1
5、创建5节点的PXC集群
#创建第1个MySQL节点
docker run -d --name=mysql-node1 -p 3310:3306 --privileged=true -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql --net=net1 --ip 172.18.0.2 pxc
#创建第2个MySQL节点
docker run -d --name=mysql-node2 -p 3311:3306 --privileged=true -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=mysql-node1 -v v2:/var/lib/mysql --net=net1 --ip 172.18.0.3 pxc
#创建第3个MySQL节点
docker run -d --name=mysql-node3 -p 3312:3306 --privileged=true -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=mysql-node1 -v v3:/var/lib/mysql --net=net1 --ip 172.18.0.4 pxc
#创建第4个MySQL节点
docker run -d --name=mysql-node4 -p 3313:3306 --privileged=true -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=mysql-node1 -v v4:/var/lib/mysql --net=net1 --ip 172.18.0.5 pxc
#创建第5个MySQL节点
docker run -d --name=mysql-node5 -p 3314:3306 --privileged=true -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=mysql-node1 -v v5:/var/lib/mysql --net=net1 --ip 172.18.0.6 pxc
6、测试集群
1、安装haproxy镜像
docker pull haproxy:2.3.13
2、新建目录
mkdir -p /home/apps/haproxy
3、新建Haproxy配置文件
vim /home/apps/haproxy/haproxy.cfg
# 增加以下内容
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:123456
#数据库负载均衡
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-node1 172.18.0.2:3306 check weight 1 maxconn 2000
server mysql-node2 172.18.0.3:3306 check weight 1 maxconn 2000
server mysql-node3 172.18.0.4:3306 check weight 1 maxconn 2000
server mysql-node4 172.18.0.5:3306 check weight 1 maxconn 2000
server mysql-node5 172.18.0.6:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
3、在数据库集群中创建空密码、无权限用户haproxy,来供Haproxy对MySQL数据库进行心跳检测
# 进入容器
docker exec -it mysql-node1 /bin/bash
# 登录mysql
mysql -uroot -p123456
# 创建用户
create user 'haproxy'@'%' identified by '';
4、创建第1个Haproxy负载均衡服务器
docker run -it -d --name haproxy-node1 -p 4001:8888 -p 4002:3306 --restart always --privileged=true -v /home/apps/haproxy:/usr/local/etc/haproxy --net=net1 --ip 172.18.0.7 haproxy:2.3.13
5、启动Haproxy
# 进入容器
docker exec -it haproxy-node1 /bin/bash
# 启动haproxy
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
1、页面访问
2、数据库访问
3、测试docker挂掉
1、从节点宕机后的操作
2、主节点宕机后的操作
# 修改grastate.dat
vim /var/lib/docker/volumes/v1/_data/grastate.dat
# 将以下值改为1
safe_to_bootstrap: 1
# 启动主节点
docker start mysql-node1
docker run -d --name=mysql-node1 -p 3310:3306 --privileged=true -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=mysql-node2 -v v1:/var/lib/mysql --net=net1 --ip 172.18.0.2 pxc
3、另一种启动方式,删除集群容器和数据卷中的grastate.dat文件,重新创建
# 移除容器
docker rm mysql-node1 mysql-node2 mysql-node3 mysql-node4 mysql-node5
# 移除数据卷中的grastate.dat文件
rm -rf /var/lib/docker/volumes/v1/_data/grastate.dat
rm -rf /var/lib/docker/volumes/v2/_data/grastate.dat
rm -rf /var/lib/docker/volumes/v3/_data/grastate.dat
rm -rf /var/lib/docker/volumes/v4/_data/grastate.dat
rm -rf /var/lib/docker/volumes/v5/_data/grastate.dat
# 按上面的方式重新创建集群容器
来源:https://www.cnblogs.com/lvlinguang/p/15210200.html
END