前一篇博客介绍了PXC数据库集群的搭建过程,但是这里有一个问题,虽然搭建了数据库集群,但是如果不使用数据库负载均衡,单节点处理所有的请求,还是会造成单个节点负载过高,数据库系统的性能较差。
本篇博客将会介绍如何通过Haproxy(转发器)做负载均衡,使得请求能够被均匀地分发给每一个节点,单节点负载得到降低,提高了数据库系统的性能。
指标 | Haproxy | Nginx | Apache | LVS |
---|---|---|---|---|
是否免费 | 免费 | 免费 | 免费 | 免费 |
支持虚拟机 | 支持 | 支持 | 支持 | 不支持 |
HTTP协议 | 支持 | 支持 | 不支持 | 支持 |
TCP/IP协议 | 支持 | 支持(不成熟) | 不支持 | 支持 |
支持插件 | 不支持 | 支持 | 不支持 | 不支持 |
性能 | 好 | 好 | 一般 | 最好 |
首先,下载Haproxy的docker镜像:
docker pull haproxy
接着,创建Haproxy配置文件。
mkdir /root/ha
touch /root/ha/haproxy.cfg
上述目录可以自定义,后面我们会添加映射,将该配置文件映射到docker容器中。
HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。
- global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改
- defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
- frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。
- backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。
- listen:Frontend和Backend的组合体。
更多具体配置,请移步至:Haproxy配置。
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:123456
#数据库负载均衡
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.19.0.2:30001 check weight 1 maxconn 2000
server MySQL_2 172.19.0.3:30002 check weight 1 maxconn 2000
server MySQL_3 172.19.0.4:30003 check weight 1 maxconn 2000
server MySQL_4 172.19.0.5:30004 check weight 1 maxconn 2000
server MySQL_5 172.19.0.6:30005 check weight 1 maxconn 2000
# 使用keepalive检测死链
option tcpka
创建Haproxy容器
# 8888: 监控端口;3306: 负载均衡服务端口
# -v 映射文件到容器中
docker run -it -d -p 4001:8888 -p 4002:3306 -v /root/ha:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.19.0.7 haproxy
# 进入到容器内部
docker exec -it h1 /bin/bash
# 指定haproxy配置文件,并启动haproxy
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
这里需要注意的是,在使用xftp上传cfg配置文件到linux系统中时,需要设置cfg文件的编码为utf-8,不然会发生莫名其妙的错误。
在此之前,我们还需要向数据库中添加haproxy用户,因为5个数据库是同步的,因此,这里只需要在一个数据库中添加该用户即可。
-- %表示任何IP都可以以haproxy账号登陆到数据库,密码为空
create user 'haproxy'@'%' identified by '';
-- 用户授权
-- grant all privileges on * to haproxy@'%' identified by '';
-- flush privileges;
-- 删除用户
-- drop user 'haproxy'@'%';
接着,访问:http://192.168.137.118:4001/dbs,输入登录用户名和密码,之前haproxy.cfg配置文件中配置的用户名和密码分别为admin和123456,Haproxy监控界面如下所示。