Keepalived+HAProxy 搭建高可用负载均衡

简介: Keepalived+HAProxy 搭建高可用负载均衡


负载均衡是分布式系统中不可或缺的重要环节,通过负载均衡按照指定的调度算法将请求分发至网络中多个节点进行处理。本文将介绍基于开源软件HAProxy实现负载均衡并且通过Keepalived实现高可用的配置方法,希望读者通过参考本文的探索成果可以快速实现高可用的软件负载均衡,也希望读者能够举一反三、触类旁通,通过自我驱动进行更深入的研究来配置更多的功能来满足自身需求。

1. 概述

软件负载均衡技术是指可以为多个后端服务器节点提供前端IP流量分发调度服务的软件技术。Keepalived和HAProxy是众多软负载技术中的两种,其中Keepalived既可以实现负载均衡也可以实现高可用,而HAProxy则更加专注于提供高性能TCP和HTTP反向代理和负载均衡能力。

1.1 Keepalived

Keepalived工作在OSI模型中的四层传输层。最初它是为了管理并监控Linux虚拟服务器(LVS)集群中各服务节点的状态,后来又加入了路由冗余协议(VRRP)来实现高可用功能,所以Keepalived除了可以管理配置LVS外,还可以作为Nginx、HAProxy等的高可用解决方案。

Keepalived同时运行于主服务器(Master)和备服务器(Backup)之上,所有的服务器上运行的Keepalived之间通过VRRP交互,VRRP设计目的是为了解决静态路由单点故障问题,保证个别节点宕机时,整个网络可以不间断的运行。

Keepalived不但可以实现主备服务器的高可用性,同时还可以管理LVS实现后端服务器的负载均衡并进行后端服务器节点的健康检查。它启动核心进程时读取keepalived.conf配置文件。在主服务器上keepalived进程按照配置文件配置的负载均衡策略开启LVS转发并对后端服务进行健康检查。利用VRRP协议主服务器周期性的发送广播至备服务器,备服务器将会判断主器服务器的状态,如果在配置的同步超时时间内主服务器节点未能发出广播,那么keepalived将启动高可用切换机制选出新的主服务器。切换过程中,原有主服务器上的虚拟地址(VIP)及负载能力将由新的主服务器来接替承载。

1.2 HAProxy

HAProxy 是一款TCP/HTTP 反向代理负载均衡服务器软件,可工作在OSI模型中的四层传输层以及七层应用层。HAProxy特别适用于那些负载压力大的web站点,这些站点通常需要会话保持或七层处理。HAProxy运行在时下的服务器上,可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全地整合进现有的系统架构中,同时可以保护web服务器不被暴露到网络上。HAproxy允许用户定义多组服务代理,代理由前端和后端组成,前端定义了服务监听的IP及端口,后端则定义了一组服务器及负载均衡的算法。通过服务代理将流量由前端负载均衡至后端服务器节点上。

1.3 Keepalived和HAProxy组合

由于HAProxy会存在单点故障问题,可以由Keepalived来为HAProxy提供高可用服务,而HAProxy提供四层或七层高性能负载均衡及反向代理服务,两者共同实现高可用负载均衡,结构如图1所示。

2. Keepalived功能及安装配置

2.1 核心功能

  1. 管理LVS负载均衡软件
    Keepalived最初是专为解决LVS的问题而诞生的。因此,Keepalived和LVS可紧密结合。
  2. 实现对LVS集群节点健康检查
    当LVS集群中某个节点服务器发生故障时,Keepalived服务会自动将失效的节点从正常队列中剔除,并将请求调度到别的正常的节点服务器上,从而保证用户访问不受影响。当故障节点被修复后,Keepalived服务又会自动切换回来。
  3. 网络服务高可用功能
    Keepalived可以实现任意两台主机之间,如Master服务器和Backup服务器间的故障转移和自动切换。假设某个服务是不能停机的,如LVS负载均衡、Nginx反向代理服务器等,可以利用Keepalived保证其高可用性。

2.2 高可用原理

Keepalived高可用服务的故障切换转移是通过VRRP机制来实现的。在Keepalived服务正常运行时,Master节点会不断向Backup节点发送(多播方式)心跳信息,用以通知Master节点的存活状态。当Master节点发生故障时,就无法发送心跳信息,Backup节点也就无法检测到来自Master的心跳信息,于是调用自身的接管程序,接管Master的资源和服务。当Master恢复时,Backup又会释放Master故障时自身接管的资源和服务,恢复到原来的备用角色。无论Master如何切换,对外都应该提供相同的服务IP地址,该IP也称作虚拟地址VIP。客户端并不需要因Master的改变而修改自己的配置,对他们来说这种切换是透明的。

路由冗余协议VRRP(Virtual Router Redundancy Protocol)早期是用来解决交换机、路由器等设备单点故障。VRRP通过竞选机制来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(Multicast)包形式来发送。在一组VRRP路由器集群中,有多台物理路由器,但并不是同时工作,而是由一台Master路由器负责路由工作,其他都是Backup,Master有一些特权,比如拥有VIP地址等,拥有系统资源的Master负责转发发送给网关地址的包和响应ARP请求。只有Master路由器会一直发送心跳信息,此时Backup不会抢占Master。当Master不可用时,Backup就收不到来自Master的心跳信息,此时多台Backup中优先级最高的路由器会抢占为Master,这种抢占非常快速,以保证服务的连续性。

2.3 安装与配置

由于本文引用的技术构架中Keepalived将仅为HAProxy提供高可用服务,所以管理配置LVS负载均衡及节点健康检查功能将不准备展开篇幅,仅对高可用功能进行介绍演示。

2.3.1 安装

Keepalived支持源码安装,同时也可以通过不同操作系统安装工具进行安装,本文以CentOS的yum工具为例进行安装介绍。此时应该准备两台服务器分别作为Master节点和Backup节点,分别在两台服务器上执行以下命令进行安装。

yum install -y keepalived

2.3.2 高可用配置

yum安装后,Keepalived将生成配置文件:/etc/keepalived/keepalived.conf,可利用文本编辑器进行配置修改。

vi /etc/keepalived/keepalived.conf

配置文件中主要由全局段、VRRP实例段、脚本段组成。

  1. 全局段定义(global_defs)
    全局段定义允许用户设置全局相关信息,例如通知信息、关键参数配置等,该段配置在Master节点和Backup节点上应当一致。
global_defs {
   notification_email {
     sysadmin@example.com  
   }
   notification_email_from  noreply@example.com  
   smtp_server  127.0.0.1  
   smtp_connect_timeout  60  
   vrrp_mcast_group4  224.0.0.18
}
  1. notification_email定义报警邮件地址,当服务切换时发送报警邮件。notification_email_from定义发件人信息,smtp_server和smtp_connect_timeout分别定义了SMTP服务器及相应的连接超时时间,vrrp_mcast_group4为VRRP IPv4多播地址,默认为224.0.0.18,如果同一局域网内有多组Keepalived时需要指定不同多播地址。
  2. VRRP实例段定义(vrrp_instance)
    这部分主要用来定义具体服务的实例配置,包括Keepalived主备状态、接口、优先级、认证方式和VIP信息等,每个VRRP实例可以认为是Keepalived服务的一个实例或作为一个业务服务,在一组Keepalived服务配置中,VRRP实例可以有多个。
    注意,存在于Master节点中的VRRP实例配置在Backup节点中也要有一致的配置(除了节点角色、优先级不同),这样才能实现故障切换转移。
vrrp_instance R1{
state  MASTER  
interface  eth0  
virtual_router_id  50
priority  100  
    advert_int  1
    authentication {
        auth_type PASS
        auth_pass passwd
    }
    virtual_ipaddress {
        10.230.137.100
}
    track_script {
        chk_haproxy
    }
nopreempt
preempt_delay 2
}
  1. vrrp_instance配置段定义了一个VRRP实例并设定实例名称;
    state设定初始VRRP实例角色,配置先要为该实例所在的Keepalived服务器设定其角色,在Master服务器上设置为“MASTER”,在Backup服务器上则设置为“BACKUP”;
    priority优先级设定,范围1-254,数字越大,表示实例优先级越高,在同一个VRRP实例里,Master节点优先级要高于Backup节点;
    virtual_router_id虚拟路由ID标识,范围0-255,Master和Backup节点配置中相同VRRP实例的虚拟路由ID标识必须一致,否则将出现脑裂问题;
    advert_int用来同步通知间隔,Master节点和Backup节点之间通信检查的时间间隔,单位是秒。
    角色相关信息设定完毕后就要开始配置VIP并绑定至指定的网络接口上,在virtual_ipaddress中配置VIP,可以配置多个VIP,VIP将绑定至interface参数配置的网络接口上。
    authentication认证配置段作用于同一个VRRP实例的MASTER和BACKUP之前的通信,具体的配置内容有auth_type认证类型,auth_pass认证密码,认证类型有PASS(Simple Passwd)和AH(IPSEC),官方推荐PASS,验证密码为明文方式,最多8位。同一个VRRP实例的MASTER和BACKUP使用相同的密码才能正常通信。
    当添加nopreemp关键字时表示设置高可用模式为非抢占模式,如果去掉此关键字则为默认的抢占模式。抢占模式是指当高优先级节点恢复后会抢占低优先级节点成为MASTER,非抢占模式允许低优先级节点继续担任MASTER,preempt_delay用来设置抢占延迟,单位秒,范围0~1000,发现低优先级MASTER后多少秒开始抢占。
    track_script配置段是用于调用指定脚本,脚本相关配置请参考下一节。
  2. 脚本段定义(vrrp_script)
    默认情况下,Keepalived仅仅在节点宕机或Keepalived进程停掉的时候才会启动切换机制。但在实际工作中,有业务服务停止而Keepalived服务还存在的情况,这就会导致用户访问的VIP无法找到对应的服务,这时可以利用Keepalived触发预制的监测脚本,实现VIP漂移来继续提供服务。
vrrp_script chk_haproxy {
script  "killall -0 haproxy" 
interval  2    
weight  -2
fall  3
rise  1
}
  1. vrrp_script配置段定义一段脚本配置并设定脚本段名称。script用双引号设置引用的shell语句或者shell脚本,通过该语句或脚本执行结果来判断是否触发指定动作,成功的结果不会触发动作,执行失败会触发动作。interval设置监控间隔时间,单位为秒,weight设置当监控脚本执行结果为失败时触发priority值调整,正数为增加优先级,负数为降低优先级,范围-255~255,fall设置认定结果为失败时的执行失败次数,rise设置判定结果为成功时的执行成功次数。

2.3.3 启动

Keepalived配置完成后,在Master节点和Backup节点上使用以下命令开启Keepalived服务。

systemctl start keepalived

如果需要设置开机启动,则执行以下命令。

systemctl enable keepalived

3. HAProxy功能及安装配置

3.1 核心功能

  1. 负载均衡、会话保持
    在多个服务器间实现四层或七层负载均衡,支持多种负载均衡算法,并且根据Hash或者cookies方式实现会话保持。
  2. 健康检查
    支持TCP、HTTP两种后端服务器健康检查模式。
  3. 统计监控
    接受访问特定端口实现服务监控,并提供带有用户认证机制的服务状态报告页面。
  4. SSL卸载
    可以解析HTTPS报文并将请求解密为HTTP向后端服务器传输。
  5. 其他功能
    在HTTP请求或响应报文中添加、修改、删除首部信息;HTTP请求重写与重定向;根据访问控制路由或阻断请求。

3.2 负载均衡调度算法

HAProxy负载均衡调度算法可以在HAProxy配置文件中设定。支持配置多组后端服务组,每个组可以分别指定一种调度算法。以下是HAProxy支持的几种调度算法。

  1. 轮询
    带有权重的轮询调度算法。支持权重的运行时调整,支持慢启动(在刚启动时缓慢接收大量请求),仅支持最大4095个后端活动主机。
  2. 静态轮询
    静态轮询算法,不支持权重的运行时调整及慢启动,但后端主机数量无限制。
  3. 最少连接
    带权重的最少连接调度算法,将访问请求动态调度至连接数较少的后端服务节点上。
  4. 源地址哈希
    该算法保证在后端服务器组没有减少或增加的情况下,能将来自同一客户端IP的请求分配至同一个服务端,该算法适合在无法使用cookie插入的四层模式下使用。
  5. URI哈希
    该算法保证访问同一URI请求分配至同一服务端,适用于后端为缓存服务器的情况,以提高缓存命中率。
  6. URL参数哈希
    该算法对请求URL中的指定的参数的值作哈希计算。该算法适用于有用户识别参数的URL ,例如保证同一用户ID的请求分配至同一服务节点。如果指定的参数没有值,则降级至轮询调度算法。
  7. HTTP 首部哈希
    该算法将HTTP首部中指定的字段取出做哈希计算。如果HTTP首部字段缺失,则降级至轮询调度算法。
相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
5天前
|
负载均衡 监控 网络协议
使用haproxy实现负载均衡集群
【4月更文挑战第14天】HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,快速并且可靠的一种解决方案。
8 1
|
2月前
|
存储 缓存 运维
解密一致性哈希算法:实现高可用和负载均衡的秘诀
解密一致性哈希算法:实现高可用和负载均衡的秘诀
163 0
|
3月前
|
Kubernetes 负载均衡 监控
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装
|
4月前
|
tengine Kubernetes Cloud Native
Tengine-Ingress 高性能高可用的云原生网关
Tengine-Ingress 高性能高可用的云原生网关
|
5月前
|
负载均衡 算法 网络协议
Keepalived+LVS搭建高可用负载均衡
Keepalived+LVS搭建高可用负载均衡
185 1
|
5月前
|
负载均衡 关系型数据库 PostgreSQL
Pgpool-II实现高可用+读写分离+负载均衡(八)---- 维护工具
Pgpool提供了一些维护工具,用于日常观察Pgpool运行状态、上线、下线节点等操作。主要有:pcp_stop_pgpool,pcp_node_count,pcp_node_info,pcp_health_check_stats,pcp_proc_count,pcp_proc_info,pcp_detach_node,pcp_attach_node,pcp_recovery_node,pcp_promote_node,pcp_pool_status,pcp_watchdog_info,pcp_reload_config
189 0
|
5月前
|
负载均衡 前端开发 网络协议
Keepalived+HAProxy 搭建高可用负载均衡(二)
Keepalived+HAProxy 搭建高可用负载均衡
|
18天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
32 0
|
3月前
|
负载均衡 应用服务中间件 nginx
百度搜索:蓝易云【Nginx和tomcat实现负载均衡教程】
至此,你已经成功地使用Nginx和Tomcat实现了负载均衡。Nginx将根据配置的负载均衡策略将客户端请求分发到多个Tomcat服务器上,以提高系统的性能和可用性。请注意,在实际生产环境中,还需要进行其他配置和优化,如健康检查、会话保持等,以满足具体的需求。
34 0
|
8天前
|
负载均衡 应用服务中间件 nginx
Nginx 负载均衡
Nginx 负载均衡
22 2