Docker安装MySQL数据库集群并实现负载均衡

安装PXC(注意处理防火墙)

8.x版本的在搭建时会报错,且不太好处理(https://www.it610.com/article/1292792500737613824.htm),所以使用5.7的

[root@localhost ~]# docker pull percona/percona-xtradb-cluster:5.7

由于镜像名字太长,修改成短一点的(注意默认tag变成了latest,只要知道名字就行了)

[root@localhost ~]# docker tag percona/percona-xtradb-cluster:5.7 pxc

创建docker容器内部网络,并部署容器集群

  • 创建net1网段
[root@localhost ~]# docker network create --subnet=172.18.0.0/24 net1

如果报错(ERROR: Pool overlaps with other one on this address space),说明你之前的网段已经被占用,或许安装其他镜像的时候已经用了,请使用下面的解决方案

#查看docker网卡
[root@localhost ~]# docker network ls
#删除docker网卡
[root@localhost ~]# docker network rm 网卡id
#查看docker网卡的相关详细信息
[root@localhost ~]# docker network inspect 网卡id

可以顺便查看一下详情,如下示例

[root@localhost ~]# docker inspect net1

为了mysql数据安全,需要把数据放在宿主机(Linux服务器或者阿里云服务器等),所以放在docker不安全,所以需要用到Docker卷技术

  • 创建5个数据卷(注意最好为其授权777)

 

[root@localhost ~]# docker volume create --name v1
[root@localhost ~]# docker volume create --name v2
[root@localhost ~]# docker volume create --name v3
[root@localhost ~]# docker volume create --name v4
[root@localhost ~]# docker volume create --name v5
  • 创建备份数据卷(用于热备份数据)
[root@localhost ~]# docker volume create --name backup
  •  创建5pxc集群(报错的情况使用docker logs -f -t --tail 50 容器ID 查看报错信息,一般是修改配置文件,防火墙,授权数据卷等问题)

注意,每个MySQL容器创建之后,因为要执行PXC的初始化和加入集群等工作,耐心等待1分钟左右再用客户端连接MySQL。另外,必须第1个MySQL节点启动成功,用MySQL客户端能连接上之后,再去创建其他MySQL节点。

#创建第1个MySQL节点

[root@localhost ~]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc

#创建第2个MySQL节点(注意时间一定要等到主节点mysql连接工具可以连接了才行,如果报错或者还是不能运行
使用[root@localhost ~]# docker logs -f -t --tail 50 容器ID 查看报错信息)

[root@localhost ~]# docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc

#创建第3个MySQL节点
[root@localhost ~]# docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc

#创建第4个MySQL节点
[root@localhost ~]# docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc

#创建第5个MySQL节点
[root@localhost ~]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc

创建成功后可以连接试一试

实际连接如图 

 测试数据(成功后到数据库创建一个用户CREATE USER 'haproxy'@'%' IDENTIFIED BY '';),待会儿后面负载均衡会用到

 

配置 负载均衡

  • 安装Haproxy镜像,用于负载均衡

[root@localhost ~]# docker pull haproxy

在宿主机文件夹,存放一个配置文件haproxy.cfg

[root@localhost ~]# mkdir -p /home/soft/haproxy
[root@localhost ~]# touch /home/soft/haproxy/haproxy.cfg

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  
  • 创建两个Haproxy容器

#创建第1个Haproxy负载均衡服务器
[root@localhost 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

#进入h1容器,启动Haproxy(成功后到数据库创建一个用户CREATE USER 'haproxy'@'%' IDENTIFIED BY '';)
[root@localhost haproxy]# docker exec -it h1 bash

#下面执行报警告可以不用管它,只要不是错误,就忽略
root@3b661797e0f8:/# haproxy -f /usr/local/etc/haproxy/haproxy.cfg

先退出
root@3b661797e0f8:/# exit

#再创建第2个Haproxy负载均衡服务器
root@3b661797e0f8:/# docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy

#进入h2容器,启动Haproxy
[root@localhost ~]# docker exec -it h2 bash
root@8a4bf1e95584:/# haproxy -f /usr/local/etc/haproxy/haproxy.cfg

最后退出
root@3b661797e0f8:/# exit
  •  测试数据库负载均衡是否可以访问,可使用

然后测试http://192.168.32.128:4001/dbs(你的就访问你的IP哈,账号密码都在上面的haproxy.cfg配置好了)

数据库客户端连接测试(这个数据库只是转发作用,为了保证高可用,创建了2个数据库发,PXC-H1和PXC-H2,用户请求到这两个转发器数据库后,会被转发到PXC-DB1到PXC-DB5中的任何一个,然后把剩下的4个数据库同步.这也体现了去中心化.至于准发规则,前面配置文件已经配置了)

 在PXC-H1和PXC-H2修改数据查看真实数据库PXC-DB1到PXC-DB5看数据是否跟着修改了,如果是,那么就成功搭建了PXC的MySQL数据库集群的负载均衡

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐