前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Haproxy和Keepalived实现高可用的负载均衡

使用Haproxy和Keepalived实现高可用的负载均衡

作者头像
砒霜拌辣椒
发布2023-08-23 17:21:13
5011
发布2023-08-23 17:21:13
举报
文章被收录于专栏:Hercules

尽管HAProxy非常稳定,但仍然无法规避操作系统故障、主机硬件故障、网络故障甚至断电带来的风险。所以必须对HAProxy实施高可用方案。

Keekpalived工作原理:通过vrrp协议(虚拟路由冗余协议)实现。

下文将介绍利用Keepalived实现HAProxy的热备方案。即三台主机上的三个HAProxy实例同时在线,其中权重较高的实例为MASTERMASTER出现问题时,另外两台备份的会选出一台自动接管所有流量。

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用户进行安装。

代码语言:javascript
复制
tar -xvf keepalived-1.4.5.tar.gz
cd keepalived-1.4.5
./configure --prefix=/usr/local/keepalived

可能会出现以下几种情况的报错:

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全部通过。

最后进行编译

代码语言:javascript
复制
make && make install

编译完成后,在路径/usr/local/下可以看到已经安装好keepalived了。

2.3、注册为系统服务
代码语言:javascript
复制
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
# 以下拷贝的原路径要替换成实际安装包解压后的路径
cp /root/keepalived-1.4.5/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /root/keepalived-1.4.5/keepalived/etc/init.d/keepalived /etc/init.d/
# 赋予可执行权限
chmod +x /etc/init.d/keepalived
# 重启系统服务
systemctl daemon-reload

注册为系统服务后可以很方便地启停Keepalived

比如:

代码语言:javascript
复制
# 启动|停止|重启|状态查看
service keepalived start|stop|restart|status

或者

代码语言:javascript
复制
# 启动|停止|重启|状态查看
systemctl start|stop|restart|status keepalived

开机自动运行

代码语言:javascript
复制
systemctl enable keepalived

关闭开机自动运行

代码语言:javascript
复制
systemctl disable keepalived

至此,主机安装已经完成,另外两台备用机也是一样的步骤进行安装;接下来就是配置了。

3、配置Keepalived

这里只贴出keepaliaved抢占式配置,非抢占式没有主备之分,全部都为BACKUP,并且配置文件中添加nopreempt,用来标识为非抢占式。

3.1、创建配置文件

Keepalived默认读取配置的路径为/etc/keepalived/keepalived.conf

代码语言:javascript
复制
mkdir /etc/keepalived/
vi /etc/keepalived/keepalived.conf
3.2、添加配置内容

主机配置

代码语言:javascript
复制
global_defs {
    router_id haproxy1                  # 虚拟路由名称
}

# HAProxy健康检查配置
vrrp_script chk_haproxy {
    script "killall -0 haproxy"         # 使用killall -0检查haproxy实例是否存在,性能高于ps命令
    interval 2                          # 脚本运行周期,秒
}

# 虚拟路由配置
vrrp_instance VI_1 {
    state MASTER                        # 本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP
    interface ens33                     # 本机网卡名称,使用ifconfig命令查看
    virtual_router_id 51                # 虚拟路由编号,主备机保持一致
    priority 101                        # 本机初始权重,备机请填写小于主机的值(例如99)
    advert_int 1                        # 争抢虚地址的周期,秒
    authentication {
        auth_type PASS
        auth_pass 4gjfethTonUY7kXU      # 认证类型和密码主备一样,要不然无法互相认证
    }
    virtual_ipaddress {
        172.16.122.100                  # 虚地址IP,主备机保持一致
    }
    track_script {
        chk_haproxy                     # 对应的健康检查配置
    }
}

这里检测脚本使用了killall命令,如果系统没有这个命令可以通过yum install psmisc安装获得。

Keepalived会定时执行检测脚本,如果检测都通过,则会选一台权重最大的作为VIP(虚拟ip)的获得者,通过这个虚拟ip就可以访问到这台机器。

如果持有VIP机器的haproxy进程挂了,检测脚本不通过,VIP则会漂移到另一台机器,也是根据权重进行重新分配。

如果持有VIP的机器本身挂了,另外2台备用机发现和主机这个节点的通讯异常了,则也会根据权重使其中一台获取到VIP进行流量接管;但是如果各个主备节点之间通信线路出了问题,无法接收到彼此的组播通知,但是每个节点实际都处于正常工作状态,这时多个节点均为master强行绑定虚拟ip,导致不可预料的后果,这就是脑裂。一般发生这种情况就需要人工干预了,排查防火墙、通信线路等问题。

备用机1配置

代码语言:javascript
复制
global_defs {
    router_id haproxy2                  # 虚拟路由名称
}

# HAProxy健康检查配置
vrrp_script chk_haproxy {
    script "killall -0 haproxy"         # 使用killall -0检查haproxy实例是否存在,性能高于ps命令
    interval 2                          # 脚本运行周期,秒
}

# 虚拟路由配置
vrrp_instance VI_1 {
    state BACKUP                        # 本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP
    interface ens33                     # 本机网卡名称,使用ifconfig命令查看
    virtual_router_id 51                # 虚拟路由编号,主备机保持一致
    priority 100                        # 本机初始权重,备机请填写小于主机的值(例如99)
    advert_int 1                        # 争抢虚地址的周期,秒
    authentication {
        auth_type PASS
        auth_pass 4gjfethTonUY7kXU      # 认证类型和密码主备一样,要不然无法互相认证
    }
    virtual_ipaddress {
        172.16.122.100                  # 虚地址IP,主备机保持一致
    }
    track_script {
        chk_haproxy                     # 对应的健康检查配置
    }
}

备用机2配置

代码语言:javascript
复制
global_defs {
    router_id haproxy3                  # 虚拟路由名称
}

# HAProxy健康检查配置
vrrp_script chk_haproxy {
    script "killall -0 haproxy"         # 使用killall -0检查haproxy实例是否存在,性能高于ps命令
    interval 2                          # 脚本运行周期,秒
}

# 虚拟路由配置
vrrp_instance VI_1 {
    state BACKUP                        # 本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP
    interface ens33                     # 本机网卡名称,使用ifconfig命令查看
    virtual_router_id 51                # 虚拟路由编号,主备机保持一致
    priority 99                         # 本机初始权重,备机请填写小于主机的值(例如99)
    advert_int 1                        # 争抢虚地址的周期,秒
    authentication {
        auth_type PASS
        auth_pass 4gjfethTonUY7kXU      # 认证类型和密码主备一样,要不然无法互相认证
    }
    virtual_ipaddress {
        172.16.122.100                  # 虚地址IP,主备机保持一致
    }
    track_script {
        chk_haproxy                     # 对应的健康检查配置
    }
}

4、启动Keepalived

每台机器执行以下命令启动Keepalived

代码语言:javascript
复制
service keepalived start

通过命令查看主机是否持有虚拟ip

代码语言:javascript
复制
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

代码语言:javascript
复制
#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 0 ];then
   su - haproxy -c "/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg"
   sleep 10
   if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
       /etc/init.d/keepalived stop
   fi
fi

更改健康检查配置

代码语言:javascript
复制
# HAProxy健康检查配置
vrrp_script chk_haproxy {
    script "/etc/keepalived/chk_haproxy.sh"     # 执行自定义脚本
    interval 2                                  # 脚本运行周期,秒
}

参考链接

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、安装说明
  • 2、安装Keepalived
    • 2.1、下载
      • 2.2、安装
        • 2.3、注册为系统服务
        • 3、配置Keepalived
          • 3.1、创建配置文件
            • 3.2、添加配置内容
            • 4、启动Keepalived
            • 5、脚本检测扩展
            • 参考链接
            相关产品与服务
            负载均衡
            负载均衡(Cloud Load Balancer,CLB)提供安全快捷的四七层流量分发服务,访问流量经由 CLB 可以自动分配到多台后端服务器上,扩展系统的服务能力并消除单点故障。轻松应对大流量访问场景。 网关负载均衡(Gateway Load Balancer,GWLB)是运行在网络层的负载均衡。通过 GWLB 可以帮助客户部署、扩展和管理第三方虚拟设备,操作简单,安全性强。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档