在之前的文章我们已经搭建好了PXC集群,所有的PXC集群节点都是可读可写的,在程序发送请求给数据库时,我们不能把所有的请求全发送给一个PXC节点,对于这种情况,就形成了一个节点负载特别高、性能差,其他节点就显得很空闲,这种情况是我们不希望的。我们希望所有的PXC节点都参与到请求的处理,所以我们就要用到数据库负载均衡技术。

这里我们使用Haproxy来做负载均衡,Haproxy是作为一个请求的转发器,将各个请求均匀分给不同的节点,这样就保证了单个节点负载低、性能好。

然而单点的Haproxy又不具备高可用,一旦Haproxy出现故障,整个程序就无法正常工作了,所以我们必须要做多个Haproxy节点,一个节点挂掉,必须要有其他Haproxy来顶替。因此这里我们使用Keepalived来实现双机热备。

下载镜像

# docker pull haproxy

查看镜像

# docker images

创建Haproxy配置文件

# touch /home/soft/haproxy/haproxy.cfg

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:tang1611
#数据库负载均衡
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容器

# docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 haproxy

进入后台运行的Haproxy容器

# docker exec -it h1 bash

指明配置文件路径

# haproxy -f /usr/local/etc/haproxy/haproxy.cfg

创建haproxy数据库账号

# CREATE USER 'haproxy'@'%' IDENTIFIED BY '';

进入haproxy监控页面

浏览器访问 服务器ip:4001/dbs
其中4001是我们启动容器映射的宿主机的端口,dbs是配置文件里面配置的URL相对地址
例如我的访问地址是http://192.168.186.129:4001/dbs
进入后输入用户名和密码,也是在配置文件内配置的,我这里用户名是admin,密码也是tang1611

验证haproxy是否转发请求

(1)创建连接

(2)更新数据
在刚刚创建的连接的表中增加一行数据,haproxy不处理任何数据,它会将这个请求发送给其他1个PXC节点,而PXC具备强一致性,就会将数据同步到其他节点

进入haproxy容器,更新apt-get

# apt-get update

安装keepalived

# apt-get install keepalived

安装vim编译器

# apt-get install vim

创建keepalived配置文件

# vim /etc/keepalived/keepalived.conf

keepalived配置文件

 vrrp_instance VI_1{
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication{
auth_type PASS
auth_pass 123456
}
virtual_ipaddress{
172.18.0.201
}
}

启动keepalived

# service keepalived start

创建第二个Haproxy容器

# docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 haproxy

进入容器,并指定配置文件

# docker -it h2 bash
# docker -f /usr/local/etc/haproxy/haproxy.cfg

更新apt-get

# apt-get update

安装keepalived

# apt-get install keepalived

安装vim编译器

# apt-get install vim

创建keepalived配置文件

# vim /etc/keepalived/keepalived.conf

keepalived配置文件

 vrrp_instance VI_1{
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication{
auth_type PASS
auth_pass 123456
}
virtual_ipaddress{
172.18.0.201
}
}

启动keepalived

# service keepalived start