使用Haproxy和Keepalived实现高可用的负载均衡
个人博客
尽管HAProxy
非常稳定,但仍然无法规避操作系统故障、主机硬件故障、网络故障甚至断电带来的风险。所以必须对HAProxy
实施高可用方案。
Keekpalived
工作原理:通过vrrp
协议(虚拟路由冗余协议)实现。
下文将介绍利用Keepalived
实现HAProxy
的热备方案。即三台主机上的三个HAProxy
实例同时在线,其中权重较高的实例为MASTER
,MASTER
出现问题时,另外两台备份的会选出一台自动接管所有流量。
1、安装说明
安装环境:6台Linux机,系统为CentOS 7.7,不完全适用于云服务器(会有些问题,比如不支持虚拟ip对外访问需要提交申请)。
Haproxy版本:1.8.25
Keepalived版本:1.4.5
ip | 作用 |
---|---|
172.16.122.100 | Keepalived虚拟出来的ip |
172.16.122.101 | 部署Haproxy实例1,代理真实服务器1、2、3,主机 |
172.16.122.102 | 部署Haproxy实例2,代理真实服务器1、2、3,备用机1 |
172.16.122.103 | 部署Haproxy实例3,代理真实服务器1、2、3,备用机2 |
172.16.122.104 | 真实服务器1,已经部署应用,并对外暴露http端口10900 |
172.16.122.105 | 真实服务器2,已经部署应用,并对外暴露http端口10900 |
172.16.122.106 | 真实服务器3,已经部署应用,并对外暴露http端口10900 |
Haproxy
的安装与配置可以参考下面的链接。
Haproxy的安装与配置
本文主要介绍Keepalived
的安装和使用,对于Keepalived
的安装是采用离线安装包的方式,其手动编译过程一般不会太顺利,依赖也比较多,对环境要求比较高。而且Keepalived
不同版本之间的依赖还有差异。本人亲自实践,如果是CentOS 7.x系统,Keepalived
版本是1.x系列,那基本问题不大,安装方式大同小异,可以参考本文。
2、安装Keepalived
2.1、下载
下载地址:https://www.keepalived.org/download.html
选择一个版本进行下载,这里我用的是keepalived-1.4.5
版本。
2.2、安装
将下载的安装包上传至服务器,直接使用root
用户进行安装。
1 | tar -xvf keepalived-1.4.5.tar.gz |
可能会出现以下几种情况的报错:
configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files. !!!
执行yum -y install openssl-devel
解决。
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
执行yum -y install libnl libnl-devel
解决。
configure: error: libnfnetlink headers missing
执行yum install -y libnfnetlink-devel
解决。
再次执行./configure --prefix=/usr/local/keepalived
,直到check全部通过。
最后进行编译
1 | make && make install |
编译完成后,在路径/usr/local/
下可以看到已经安装好keepalived
了。
2.3、注册为系统服务
1 | cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ |
注册为系统服务后可以很方便地启停Keepalived
。
比如:
1 | 启动|停止|重启|状态查看 |
或者
1 | 启动|停止|重启|状态查看 |
开机自动运行
1 | systemctl enable keepalived |
关闭开机自动运行
1 | systemctl disable keepalived |
至此,主机安装已经完成,另外两台备用机也是一样的步骤进行安装;接下来就是配置了。
3、配置Keepalived
这里只贴出keepaliaved
抢占式配置,非抢占式没有主备之分,全部都为BACKUP
,并且配置文件中添加nopreempt
,用来标识为非抢占式。
3.1、创建配置文件
Keepalived
默认读取配置的路径为/etc/keepalived/keepalived.conf
1 | mkdir /etc/keepalived/ |
3.2、添加配置内容
主机配置
1 | global_defs { |
这里检测脚本使用了killall
命令,如果系统没有这个命令可以通过yum install psmisc
安装获得。
Keepalived
会定时执行检测脚本,如果检测都通过,则会选一台权重最大的作为VIP(虚拟ip)
的获得者,通过这个虚拟ip就可以访问到这台机器。
如果持有VIP机器的haproxy
进程挂了,检测脚本不通过,VIP则会漂移到另一台机器,也是根据权重进行重新分配。
如果持有VIP的机器本身挂了,另外2台备用机发现和主机这个节点的通讯异常了,则也会根据权重使其中一台获取到VIP进行流量接管;但是如果各个主备节点之间通信线路出了问题,无法接收到彼此的组播通知,但是每个节点实际都处于正常工作状态,这时多个节点均为master强行绑定虚拟ip,导致不可预料的后果,这就是脑裂。一般发生这种情况就需要人工干预了,排查防火墙、通信线路等问题。
备用机1配置
1 | global_defs { |
备用机2配置
1 | global_defs { |
4、启动Keepalived
每台机器执行以下命令启动Keepalived
1 | service keepalived start |
通过命令查看主机是否持有虚拟ip
1 | ip addr sh ens33 # ens33是具体网卡名称,可以通过ifconfig查看 |
客户端通过虚拟ip172.16.122.100
访问主机上的haproxy
端口,能访问成功说明虚拟ip已经生效,此时访问172.16.122.100
和访问172.16.122.101
效果是一样的。
杀死主机的haproxy
进程,如果VIP发生漂移,查看备用机持有VIP就说明主备配置已经生效了。客户端还是能通过172.16.122.100
这个虚拟ip进行服务访问,这就是高可用。
Keepalived
具体的日志可以通过/var/log/messages
查看。
5、脚本检测扩展
脚本检测并非一定要使用killall
这个命令,可以自定义一个shell
脚本去检测,这样可以更加灵活地处理。
比如在检测到haproxy
这个进程不存在时,执行启动haproxy
的命令,如果启动失败再切换VIP,而不是检测失败就直接切换VIP。
创建脚本vi /etc/keepalived/chk_haproxy.sh
1 | !/bin/bash |
更改健康检查配置
1 | HAProxy健康检查配置 |