Mysql集群

Docker集群部署Mysql以及负载均衡方案

作者: yym439 时间: 2019-10-29

1、Mysql集群

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节点容器挂掉重启注意事项

  • 从节点挂掉,可以直接重新启动(数据库数据一致)
  • 主节点挂掉,不能重新启动;其他从节点会随机选择一个当作主节点
  • 当集群宕机超过一半的时,再去重启节点
  • 主节点挂掉需要重启时,应该注意:
    1. 进入主节点数据卷文件夹:/var/lib/docker/volumes/v1/_data 删除grastate.dat后,才能重启主节点(如果存在从节点还在运行,会导致数据不一致)
    2. 主节点重启其他的从节点也需要全部重启,重启后的从节点数据还原到跟主节点一样(这样才能保证数据一致)

      建议:主节点宕机的时候,不要重启它(从节点会随机选取一个当作主节点)

2、Mysql负载均衡

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