1、安装Haproxy镜像
docker pull haproxy
image.png
2、导出镜像包(可忽略)
docker save docker.io/haproxy > /home/haproxy.tar.gz
image.png
3、修改haproxy镜像名称并删除原镜像(可忽略)
docker tag docker.io/haproxy haproxy
docker rmi docker.io/haproxy
image.png
4、创建haproxy配置文件(镜像不包含配置文件,创建了容器也无法组成数据库的负载均衡,宿主机上编写Haproxy配置文件)
vi /home/soft/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: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 名字 数据库ip:容器端口 权重
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
server 参数说明
-
MySQL_1
自定义名字 -
172.18.0.2
数据库ip -
3306
容器端口 -
check
心跳检测(可跟几秒执行等参数) -
weight
1 权重 -
maxconn 2000
最大连接数
5、创建两个Haproxy容器
#创建第1个Haproxy负载均衡服务器,8888监控画面端口 (最后的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
docker exec -it h1 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg //加载文件映射后的地址
#创建第2个Haproxy负载均衡服务器
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
docker exec -it h2 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg //执行命令启动中间件,实现负载均衡
image.png
6、创建haproxy账号,来登录数据库发送心跳检测
create user 'haproxy'@'%' identified by '';
7、登录前端查看监控画面
0.0.0.0:4001/dbs admin abc123456
8、停止某个节点做测试
docker stop node1
image.png
有可能遇到的问题:
一、创建容器时
在执行docker exec -it h1 bash
后出现Error response from daemon: Container c0e806f3588b2915eb7a67 is not running
错误。
解决方法及步骤思路:
1,对比正在运行的容器和全部容器,发现h1容器已经创建成功,但是未启动
docker ps
docker ps -a
image.png
2,启动创建的容器,发现还是报错
docker start h1
docker exec -it 容器ID bash
image.png
3,查看docker运行日志,发现原来是在配置文件时复制参数少了一些字符,改正就好了
docker logs 容器ID
image.png
二、停止节点后,node1节点恢复时闪退问题
这个要从PXC集群的节点管理说起,PXC节点的数据目录是/var/lib/mysql,好在这个目录被我们映射到数据卷上了。比如你访问v1数据卷就能看到node1的数据目录。这其中有个grastate.dat的文件,它里面有个safe_to_bootstrap参数被PXC用来记载谁是最后退出PXC集群的节点。比如node1是最后关闭的节点,那么PXC就会在把safe_to_bootstrap设置成1,代表node1节点最后退出,它的数据是最新的。下次启动必须先启动node1,然后其他节点与node1同步。
如果你在PXC节点都正常运行的状态下关闭宿主机Docker服务或者电源,那么PXC来不及判断谁是最后退出的节点,所有PXC节点一瞬间就都关上了,哪个节点的safe_to_boostrap参数就都是0。解决这个故障也很好办,那就是挑node1,把该参数改成1,然后正常启动node1,再启动其他节点就行了。
1、查看node1的数据卷v1
docker volume inspect v1
2.修改grastate.dat
文件
cd /var/lib/docker/volumes/v1/_data
vim grastate.dat
3、将参数
safe_to_boostrap
中的0
改成1
4、再启动
node1
就成功了
网友评论