写在前面:为什么要搭建MySQL集群的负载均衡呢?在拥有集群的情况,如果始终都是对集群中的某个节点服务器进行数据库请求,仍然是会造成负载高,性能差。故使用harpoxy中间件进行负载均衡。 注:在阅读此文之前,最好请先阅读《docker简易搭建MySQL集群》https://blog.csdn.net/belonghuang157405/article/details/80774506。
在centos窗口中 执行如下命令,拉取haproxy镜像:
docker pull haproxy
由于拉取下来的haproxy镜像中并不包含haproxy配置文件。故首先在宿主机上centos窗口中 执行如下两条命令创建haproxy配置文件:
mkdir /home/soft/haproxy
vi /home/soft/haproxy/haproxy.cfg
注:读者并非一定要指定在/home/soft/haproxy目录下,可自行选择,该目录将用于映射与docker容器中使用。
按 i 键,进入编辑模式,并将下方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 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
#使用keepalive检测死链
option tcpka
注:bind 0.0.0.0:3306 | 不限定访问ip。
option mysql-check user haproxy | 用于心跳的mysql用户,请在mysql集群数据库进行创建该用户haproxy,读者可自己配置该用户名。在此处我们按照约定俗成定为haproxy。
server MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000 | 172.18.0.2(容器的ip):3306(容器的端口),check(心跳检测),weight 1(权重,只有当算法为static-rr才生效),maxconn 2000(最大连接数)
粘贴内容后,按 Esc 键,并输入 :wq ,退出并保存文件。
在这还需用做一步的是在mysql窗口中,创建mysql用户,运行如下命令:
create user 'haproxy'@'%' identified by '';
在centos窗口中,执行如下命令:
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name haproxy1 --privileged --net=net1 haproxy
创建Haproxy容器完成后,执行如下命令启动Haproxy:
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
在浏览器访问 http://宿主机ip:4001/dbs , 输入haproxy.cfg中配置的账号密码。
如图所示:
登陆后,可以查看数据集群的运行情况,如图所示:
挂起其中一个容器,进行测试,在宿主机centos窗口中输入如下命令:
docker stop node2
再次刷新haproxy刷新界面,即可查看到结果,发现对应node2的MySQL_2变红,如图所示:
验证完成后,在centos窗口中执行如下命令,重新启动node2:
docker start node2
再次刷新haproxy监控界面即可看到恢复正常。
利用MySQL图形界面建立haproxy数据库连接,如图所示:
注:4002端口,就是第三步操作中 -p 4002:3306 命令,将docker容器的3306端口映射给宿主机的4002端口,读者可自行替换。
接下来创建好haproxy数据连接,就可以在该haproxy数据库连接中进行数据库操作,haproxy会帮你将操作按照haproxy配置的策略分发到各个容器(node1,node2,node3,node4)的数据库中,从而实现负载均衡。
docker 停止容器
docker stop 容器名/容器id
docker 启动容器
docker start 容器名/容器id
docker 暂停容器
docker pause 容器名/容器id
docker 恢复容器
docker unpause 容器名/容器id
写在最后:为什么没有考虑到其他中间件来做负载均衡?由于本人的centos安装在vmware中,故排除了LVS,又由于本次博文使用到的TCP/IP协议故排除Apache,最后在Haproxy与Nginx中,由于Haproxy支持TCP/IP协议支持的时间较为长远,故最终选择了Haproxy。读者可根据自身的情况,自行选择合适的中间件。
请参考如下 负载均衡中间件对比表格:
比较项 | Haproxy | Nginx | Apache | LVS |
是否免费 | 免费 | 免费 | 免费 | 免费 |
支持虚拟机 | 支持 | 支持 | 支持 | 否 |
HTTP协议 | 支持 | 支持 | 支持 | 支持 |
TCP/IP协议 | 支持 | 刚刚支持 | 不支持 | 支持 |
支持插件 | 不支持 | 支持 | 不支持 | 不支持 |
性能 | 好 | 好 | 一般 | 最好 |