Docker安装MySQL数据库集群之PXC解决方案
Docker安装PXC集群,即mysql集群的安装安装PXC可以使用带版本的安装docker pull percona/percona-xtradb-cluster:5.7,下面干脆安装最新版[root@localhost ~]# docker pull percona/percona-xtradb-cluster由于镜像名字太长,修改成短一点的[root@localhost ~]# docker
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数据库集群的负载均衡
更多推荐
所有评论(0)