PXC集群的负载均衡

数据库的负载均衡

什么是负载均衡?

在上篇中我们搭建了一个PXC集群,数据完全通过,通过将请求均匀分配到每个数据库就是负载均衡。

数据库负载均衡的必要性

image-20180606232843728

虽然搭建了集群,但是不使用数据库负载均衡,单节点处理所有请求,负载高,性能差,很容易崩溃,而集群中的其他节点很空闲。

image-20180606233234936

使用Haproxy做负载均衡,请求被均匀分发给每个节点,单节点负载低,性能好

安装Haproxy镜像

直接从Docker仓库中下载镜像
1
[root@hongshaorou ~]# docker pull haproxy
创建Haproxy配置文件

下载好镜像之后不要急着创建容器,因为Haproxy镜像中是不包含配置文件的。需要我们手动创建配置文件。

在宿主机上执行创建命令:

1
2
[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
2
[root@hongshaorou ~]# docker exec -it h1 bash 
root@713192fc3b67:/# haproxy -f /usr/local/etc/haproxy/haproxy.cfg
数据库创建haproxy用户

我们需要在数据库创建一个haproxy用户用于登录数据库

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

完成以上操作之后我们就可以访问监控画面 浏览器输入监控地址

image-20180607100237151

登录成功后我们就能看到监控画面

image-20180607100811159

现在五个节点的数据链接全部正常,接下来我们断掉第二个节点看看会发生什么。

1
[root@hongshaorou ~]# docker stop node2

在看看此时的监控

image-20180607101103455

此时的第二个节点已经无法监控,我们通过Haproxy发送数据到数据库,看看第二个节点是否会有数据。

配置链接到H1

image-20180607101833495

在H1新增数据

image-20180607101931120

在node3查看数据是否同步

image-20180607102007379

我们看到数据已同步

实际上Haproxy并不存储任何数据,我们把请求发送给Haproxy然后由Haproxy转发到真正的数据库。

负载均衡的高可用方案

为什么要采用双机热备?
单节点Haproxy不具备高可用,必须要有冗余设计

image-20180607102729160

正常情况下,Haproxy会将请求发送到数据库实例,但是当Haproxy发生故障的时候负载均衡就会失效。

利用Keepalived实现双机热备

虚拟IP地址

image-20180607141015506

Haproxy双机热备离不开虚拟IP技术,Linux系统可以在一个网卡中定义多个IP,将这些IP分配给对应的程序,这些IP就是虚拟IP。

双机热备原理

image-20180607141452112

我们构建两个Haproxy进行负载均衡,然后在容器中安装keepalived服务器,配置主从进行争抢虚拟IP,争抢成功的为主服务器进行负载均衡的分配任务,主备服务器之间会进行心跳检查以保证在主服务器故障的时候能够代替主服务器。

Haproxy双机热备方案

image-20180607141835163

我们来看一下总体架构:

图的右侧是PXC集群,热备方案所以有两个Haproxy容器,分别安装了Keepalived,然后两个Keepalived抢占一个虚拟IP(一个Docker内部网段),我们想要在局域网访问需要在宿主机同样安装Keepalived,通过Keepalived将某一个IP映射到虚拟IP上。

安装Keepalived

Keepalived必须要安装在Haproxy所在的容器之内

1
2
3
进入容器:[root@hongshaorou ~]# docker exec -it h1 bash 
更新源:root@713192fc3b67:/# apt-get update
安装Keepalived:root@713192fc3b67:/# apt-get install keepalived
Keepalived配置文件

因为Keepalived需要竞争虚拟IP,这个虚拟IP需要写在配置文件里面。

Keepalived的配置文件是/etc/keepalived/keepalived.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
}
}

参数解释:
state: Keepalived的身份(MASTER主服务,BACKUP备服务器)。主服务要抢占虚拟IP,备用服务器不会抢占IP。

interface:表示虚拟IP绑定的网卡,eth0是Docker的网卡,局域网是看不到的,宿主机可以访问。所以我们要把这个虚拟IP映射到局域网上的虚拟IP上。

virtual_router_id:虚拟路由标识,MASTER和BACKUP的虚拟路由标识必须一致。标识可以是0~255。

priority:MASTER权重要高于BACKUP数字越大优选级越高

advert_int:MASTER与BACKUP节点间同步检查的时间间隔,单位为秒。主备之间必须一致。

authentication:主从服务器验证方式。主备必须使用相同的密码才能正常通信。(心跳检测需要登录到某一个Keepalived)

virtual_ipaddress:虚拟IP地址。可以设置多个虚拟IP地址,每行一个,这个虚拟IP宿主机是可以访问的。
1
安装vim:root@fd93ad892341:/# apt-get install vim
启动Keepalived

将上述配置文件编辑好之后,我们启动Keepalived,通过宿主机Ping虚拟IP

1
2
root@fd93ad892341:/etc/keepalived# service keepalived start 
[ ok ] Starting keepalived: keepalived.
1
2
3
4
5
6
7
8
9
[root@hongshaorou ~]# ping 172.18.0.201
PING 172.18.0.201 (172.18.0.201) 56(84) bytes of data.
64 bytes from 172.18.0.201: icmp_seq=1 ttl=64 time=0.127 ms
64 bytes from 172.18.0.201: icmp_seq=2 ttl=64 time=0.047 ms
64 bytes from 172.18.0.201: icmp_seq=3 ttl=64 time=0.061 ms
^C
--- 172.18.0.201 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.047/0.078/0.127/0.035 ms

注意:我们有两个Haproxy,记得都要安装Keepalived,编写配置文件。

将Docker的虚拟IP映射到局域网内

我们要在宿主机安装Keepalived使Docker内部的虚拟IP映射到局域网内。

1
[root@hongshaorou ~]# yum install -y keepalived

编辑配置文件

1
2
3
[root@hongshaorou keepalived]# vim keepalived.conf 
[root@hongshaorou keepalived]# pwd
/etc/keepalived

启动Keepalived服务

1
2
[root@hongshaorou keepalived]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service
知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!