在第二篇中已经实现了数据库负载均衡中间件Haproxy的部署运行。
但当单台Haproxy出现问题时,数据库集群的负载均衡也就失效了。为了保证Haproxy的高可用,单台Haproxy也是不够的。
因此需要实现多台Haproxy的部署运行
(双机热备:指两台机器运行待命)。
一、Haproxy双机热备的实现思路
如果要实现两台Haproxy的双机热备,那么关键点是linux的虚拟ip技术和Keepalive技术。
1.1 虚拟ip
linux系统可以在一个网卡中定义多个ip地址,把这些ip地址分配给对应的程序。这些ip地址就叫做虚拟ip。
2.2 利用Keepalived实现双机热备
在两台Haproxy的容器中各自安装好Keepalived之后,Keepalived运行时就会抢占虚拟ip。
抢到虚拟ip的keepalived所在的Haproxy做主服务器,没有抢到的叫做备用服务器。
主备之间会发送心跳检测,如果备用服务器发现它发送给主服务器上keepalived的心跳检测没有响应,
就意味着主服务器可能故障了,备用服务器上的keepalived就有权把虚拟ip抢到手。
因此我们不关心这个虚拟ip对应哪个Haproxy,一个Haproxy挂掉了,由另一个Haproxy来接替它的工作。
1.3 Haproxy双机热备架构图
如图例所示,172.18.0.15这个ip是Docker内部的虚拟ip,无法被外网访问,因此需要在宿主机上也安装Keepalived,
一个请求发送宿主机的ip,通过Keepalived被路由到Docker内的虚拟ip 172.18.0.15。
因为这个Docker的虚拟ip被某一个容器内的Keepalived所抢占,所以请求又会被转发到Haproxy上,
Haproxy最后通过其负载均衡技术将数据库请求发送到某个数据库节点。
二、在Haproxy容器内安装Keepalived
2.1 安装Keepalived
docker exec -it h1 bash 进入h1容器交互界面内部
如需退出交互界面使用exit命令,将不会停止容器运行同时退出容器交互界面。
apt-get update 更新Haproxy容器内的apt-get工具(Haproxy镜像是通过unbutn创建的,unbutn上安装程序使用apt-ge指令,而不是centos的yum-install)
apt-get install keepalived 安装keepalived (因为下载源在国外,速度可能会较慢)
如图keepalived已安装成功:
2.2 编写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.conf中。
将配置文件上传到启动haproxy容器h1时所指定的映射宿主机目录中,
h1与宿主机相映射的目录中就可以找到该配置文件了,
之后将配置文件copy到h1容器的/etc/keepalived/目录中
cp /usr/local/etc/haproxy/keepalived.conf /etc/keepalived/
如图:
(当然,也可以直接用vim直接编辑出配置文件,不过需要在容器内先安装vim命令)
2.3 keepalived配置文件详细说明
vrrp_instance VI_1 {
state MASTER #Keepalive的身份(MASTER为主服务,BACKUP为备用服务,抢占到ip的为主服务器,没有抢占到的自动降级为备用服务器)
interface eth0 #docker中虚拟ip使用到的docker内部网卡
virtual_router_id 51 #虚拟路由标识,MASTER和BACKUP的虚拟路由标识必须一致。 标识可以是0~255之间任意值。
priority 100 #硬件设备条件不同时采用的权重,MASTER权重要高于BACKUP,数字越大优先级越高。
advert_int 1 #keepalived节点之间的心跳检测间隔,单位为秒,主备之间必须一致。
authentication {
auth_type PASS
auth_pass 123456
} #心跳检测需要登录到keepalived节点内,登录使用的账号密码。主备必须用相同的密码才能正常通信。
virtual_ipaddress {
172.18.0.201
} #虚拟ip,该虚拟ip将被写入到上面的docker网卡ens33中,如数据库集群的网段是172.18.0.xxx,这里就定义个大一点的该网段的ip地址。由于是docker内部的虚拟ip,在docker内部能访问,出了docker是不能访问的。
}
2.4 运行keepalived
service keepalived start 启动keepalived服务
尝试宿主机能否ping通keepalived占有的虚拟ip,能ping通就说明这个虚拟ip已经配置成功了:
如若ping不通需检查配置是否正确,以及网络模式是否是桥接。
一开始我使用的网络模式是nat,无法ping通,改为桥接后重启linux可以ping通。
2.5 搭建第二个Haproxy节点h2
docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy
运行上述命令,创建haproxy的h2容器,
注意宿主机4001和4002端口已经被h1映射所占用,要进行更换成别的端口。
以及容器名需更换,ip地址需更换。
之后重复如h1的keepalive安装步骤,在h2容器中安装keepalive及配置文件,运行并查看能否ping通虚机ip即可。
三、在宿主机内安装Keepalived
3.1 宿主机内安装Keepalived
Haproxy容器内的keepalive已经正常运行了,其抢占的虚拟ip也可以正常ping通了。
之后需要把该虚拟ip和宿主机的ip做映射,以使外部网络可以访问到该虚拟ip,需要在宿主机上也安装keepalived。
宿主机的linux是centos,所以安装命令有所不同:
yum install -y keepalived
3.2 编写Keepalived配置文件
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.132.150
}
}
virtual_server 192.168.132.150 8888 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 8888 {
weight 1
}
}
virtual_server 192.168.132.150 3306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 3306 {
weight 1
}
}
注意:
1. 如上配置中的virtual_server 192.168.132.150,这是我当前的宿主机的网段ip地址,需将配置中所有192.168.132.150改成自己使用的宿主机网段192.168.xxx.150
2. ipaddress查看自己连接宿主机的ip地址,查看ip地址对应的网卡名。把interface eth1一项修改成自己正确的宿主机网卡名。
3. copy到新建的keepalived.conf中,上传到宿主机keepalived的配置目录/etc/keepalived中即可。
3.3 启动宿主机keepalive服务
启动服务 service keepalived start
启动成功后,尝试ping宿主机供请求访问的ip ping 192.168.132.150
3.4 进行测试
3.4.1 测试Haproxy监控服务
通过宿主机keepalived绑定的ip访问haproxy监控服务
注意,这次访问haproxy监控服务的ip192.168.132.150是宿主机keepalived所占有的虚拟ip,
keepalived通过这个虚拟ip192.168.132.150转发请求到docker的虚拟ip 172.18.0.201。
h1容器中的keepalived所在主服务器haproxy最后进行负载均衡请求分发。
这次访问的已经不是原本的未使用keepalived时的宿主机192.168.132.105的ip了(见第二章haproxy搭建),看起来还是访问haproxy监控服务,但实质上内部流程和之前已经完全不同。
3.4.2 测试数据库请求
使用ip 192.168.132.150新建数据库连接:
可以正常连接,对stu表增加一条数据:
打开DB2,可以看到BD2的数据库节点的表中也已经被同步了该数据:
3.4.3 测试Haproxy双机热备的高可用性
docker stop h1 暂停运行h1容器
打开@192.168.132.150的数据库连接,再为student表插入一条新数据
查看DB3中student表,可以看到新数据已被同步:
这就说明当haproxy容器h1挂掉后,h2还可以接替运行,双机热备的高可用性确实实现了。
3.5 暂停pxc集群的方法
停止集群服务是按照h2,h1,node5,node4,node3,node2,node1的顺序进行停止,
由于我使用的是VMWare虚拟机,pxc集群如果停止方式不正确,经常在下次启动虚拟机和服务的时候,可能出现pxc容器闪退的问题。
也可以采用将docker进程挂起的方式,等下次启动时恢复运行,docker那些容器都会恢复正常运行。
但是恢复运行时docker会无法获取网络,因此还需要设置一下网络,使docker进程恢复运行时能重新获取到网络。
vi /etc/sysctl.conf 在宿主机中编辑此配置文件
在此配置文件中增加 net.ipv4.ip_forward=1
之后重启网络服务:
systemctl restart network
这样就可以在虚拟机上去挂起linux的实例了,挂起只是休眠不是停止,之后重启电脑点击恢复运行即可:
注意:在我关闭电脑几天后再次恢复运行时,出现了Naticat连接@192.168.132.150连接不上的问题。需要重启宿主机keepalived服务,service keepalived restart,即可恢复正常连接。