数据库的负载均衡
什么是负载均衡?
在上篇中我们搭建了一个PXC集群,数据完全通过,通过将请求均匀分配到每个数据库就是负载均衡。
数据库负载均衡的必要性
虽然搭建了集群,但是不使用数据库负载均衡,单节点处理所有请求,负载高,性能差,很容易崩溃,而集群中的其他节点很空闲。
使用Haproxy做负载均衡,请求被均匀分发给每个节点,单节点负载低,性能好
安装Haproxy镜像
直接从Docker仓库中下载镜像
1 | [root@hongshaorou ~]# docker pull haproxy |
创建Haproxy配置文件
下载好镜像之后不要急着创建容器,因为Haproxy镜像中是不包含配置文件的。需要我们手动创建配置文件。
在宿主机上执行创建命令:
1 | [root@hongshaorou ~]# touch /home/soft/haproxy.cfg |
稍后我们将改文件映射到容器中,启动Haproxy的容器就有了配置文件了。
配置文件详情可以参考https://zhangge.net/5125.html
创建Haproxy容器
1 | [root@hongshaorou ~]# 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 |
容器创建完成后执行配置文件
1 | [root@hongshaorou ~]# docker exec -it h1 bash |
数据库创建haproxy用户
我们需要在数据库创建一个haproxy用户用于登录数据库
1 | CREATE USER 'haproxy'@'%' IDENTIFIED BY ''; |
完成以上操作之后我们就可以访问监控画面 浏览器输入监控地址
登录成功后我们就能看到监控画面
现在五个节点的数据链接全部正常,接下来我们断掉第二个节点看看会发生什么。
1 | [root@hongshaorou ~]# docker stop node2 |
在看看此时的监控
此时的第二个节点已经无法监控,我们通过Haproxy发送数据到数据库,看看第二个节点是否会有数据。
配置链接到H1
在H1新增数据
在node3查看数据是否同步
我们看到数据已同步
实际上Haproxy并不存储任何数据,我们把请求发送给Haproxy然后由Haproxy转发到真正的数据库。
负载均衡的高可用方案
为什么要采用双机热备?
单节点Haproxy不具备高可用,必须要有冗余设计
正常情况下,Haproxy会将请求发送到数据库实例,但是当Haproxy发生故障的时候负载均衡就会失效。
利用Keepalived实现双机热备
虚拟IP地址
Haproxy双机热备离不开虚拟IP技术,Linux系统可以在一个网卡中定义多个IP,将这些IP分配给对应的程序,这些IP就是虚拟IP。
双机热备原理
我们构建两个Haproxy进行负载均衡,然后在容器中安装keepalived服务器,配置主从进行争抢虚拟IP,争抢成功的为主服务器进行负载均衡的分配任务,主备服务器之间会进行心跳检查以保证在主服务器故障的时候能够代替主服务器。
Haproxy双机热备方案
我们来看一下总体架构:
图的右侧是PXC集群,热备方案所以有两个Haproxy容器,分别安装了Keepalived,然后两个Keepalived抢占一个虚拟IP(一个Docker内部网段),我们想要在局域网访问需要在宿主机同样安装Keepalived,通过Keepalived将某一个IP映射到虚拟IP上。
安装Keepalived
Keepalived必须要安装在Haproxy所在的容器之内
1 | 进入容器:[root@hongshaorou ~]# docker exec -it h1 bash |
Keepalived配置文件
因为Keepalived需要竞争虚拟IP,这个虚拟IP需要写在配置文件里面。
Keepalived的配置文件是/etc/keepalived/keepalived.conf
1 | vrrp_instance VI_1 { |
1 | 安装vim:root@fd93ad892341:/# apt-get install vim |
启动Keepalived
将上述配置文件编辑好之后,我们启动Keepalived,通过宿主机Ping虚拟IP
1 | root@fd93ad892341:/etc/keepalived# service keepalived start |
1 | [root@hongshaorou ~]# ping 172.18.0.201 |
注意:我们有两个Haproxy,记得都要安装Keepalived,编写配置文件。
将Docker的虚拟IP映射到局域网内
我们要在宿主机安装Keepalived使Docker内部的虚拟IP映射到局域网内。
1 | [root@hongshaorou ~]# yum install -y keepalived |
编辑配置文件
1 | [root@hongshaorou keepalived]# vim keepalived.conf |
启动Keepalived服务
1 | [root@hongshaorou keepalived]# service keepalived start |