1、Mysql集群


1.1 PXC镜像安装
docker pull percona/percona-xtradb-cluster
docker load < /home/soft/pxc.tar.gz
1.2 创建内部网络(虚拟IP)
docker network create –subnet=172.18.0.0/24 net1
docker network inspect net1
docker network rm net1
1.3 Docker卷
pxc无法使用目录映射直接保存数据到宿主机,所以需要Docker卷:
docker volume create –name v1 (创建数据卷)
docker inspect v1 (查看数据卷存放在宿主机哪一个位置)
docker volume rm v1 (删除数据卷)
1.4 PXC集群示例
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -v v1:/var/lib/mysql –privileged –name node1 –net=net1 –ip 172.18.0.2 pxc(镜像名称)
参数说明:
-d 启动容器后再后台运行 -p 端口映射 -v 路径映射(pxc要使用数据卷去映射,不能直接使用宿主机路径映射) -e 配置启动参数 –net PXC容器内部网段设置 –ip 容器内部网段ip设置
例子(创建5个PXC容器集群):
docker network create --subnet=172.18.0.0/24 net1
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
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -v v1:/var/lib/mysql --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 --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 --privileged --name node5 --net=net1 --ip 172.18.0.6 pxc
1.5 PXC节点容器挂掉重启注意事项
- 从节点挂掉,可以直接重新启动(数据库数据一致)
- 主节点挂掉,不能重新启动;其他从节点会随机选择一个当作主节点
- 当集群宕机超过一半的时,再去重启节点
- 主节点挂掉需要重启时,应该注意:
- 进入主节点数据卷文件夹:/var/lib/docker/volumes/v1/_data 删除grastate.dat后,才能重启主节点(如果存在从节点还在运行,会导致数据不一致)
- 主节点重启其他的从节点也需要全部重启,重启后的从节点数据还原到跟主节点一样(这样才能保证数据一致)
建议:主节点宕机的时候,不要重启它(从节点会随机选取一个当作主节点)
2、Mysql负载均衡


2.1 安装haproxy
docker pull haproxy
2.1 haproxy配置文件
数据库创建没有权限、密码的新用户:
CREATE USER ‘haproxy’@’%’ IDENTIFIED BY ‘’;
进入navicat-用户-权限管理员-新增对应数据库的用户权限(修改为没有权限)
具体参考: https://zhang.ge/5125.html
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: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
2.2 haproxy容器创建
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 haproxy
docker容器内执行配置文件:
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
haproxy管理页面访问:http://192.168.66.132:4001/dbs
2.3 haproxy双机热备


2.3.1 安装keepalived
keepalived必须安装在haproxy所在的容器内(haproxy容器是Ubuntu系统):
apt-get update
apt-get install keepalived
2.3.2 keepalived配置文件
-
keepalived配置文件路径(haproxy容器内):/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通虚拟IP)
参考: https://blog.csdn.net/belonghuang157405/article/details/80900118
3、PXC集群部署脚本
#重启docker服务
service docker stop
service docker start
#删除旧节点
docker stop node1 node2 node3 node4 node5
docker rm node1 node2 node3 node4 node5
#创建虚拟IP
docker network rm net1
docker network create --subnet=172.18.0.0/24 net1
#创建docker卷
docker volume rm v1 v2 v3 v4 v5
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
#创建备份数据卷
#docker volume rm backup
#docker volume create --name backup
#创建node1主节点
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 docker.io/percona/percona-xtradb-cluster:5.7.21
#判断主节点是否完全启动(完全启动才能创建其他集群节点)
read -p "node1 is running (y/n) ? : " var1
if [ $var1 = "y" -o $var1 = "yes" ]
then
echo "开始创建集群:node2/node3/node4/node5"
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 --privileged --name node2 --net=net1 --ip 172.18.0.3 docker.io/percona/percona-xtradb-cluster:5.7.21
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 docker.io/percona/percona-xtradb-cluster:5.7.21
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 docker.io/percona/percona-xtradb-cluster:5.7.21
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 --priv
ileged --name node5 --net=net1 --ip 172.18.0.6 docker.io/percona/percona-xtradb-cluster:5.7.21
else
echo "node1启动失败(集群创建失败),退出!"
fi
exit 0