LVS(Linux Virtual Server)+Nginx 高可用集群
LVS(Linux虚拟服务器)
LVS(Linux Virtual Server)是一个开源的负载均衡项目,是国内最早出现的开源项目之一,目前已被集成到 Linux 内核模块中。该项目在 Linux 内核中实现了基于 TCP 层的 IP 数据负载均衡分发,其工作在内核空间且仅做负载均衡分发处理,所以稳定性相对较好,性能相对较强,对内存及 CPU 资源的消耗也最低。
![多层负载均衡网络架构](https://www.weixueyuan.net/uploads/allimg/200909/8-200Z9151011T8.gif)
图:多层负载均衡网络架构
![LVS 工作原理](https://www.weixueyuan.net/uploads/allimg/200909/8-200Z9150J6392.gif)
图:LVS 工作原理
客户访问虚拟 IP(VIP)时,数据包先在主机内核空间被 PREROUTING 链检测,根据数据包的目标地址进行路由判断,若目标地址是本地,则交由 INPUT 链进行处理。
IPVS 工作于 INPUT 链,当数据包到达 INPUT 链时,会先由 IPVS 进行检查,并根据负载均衡算法选出真实服务器 IP。
IPVS 转发模式为 NAT 模式时,将数据包由 FORWARD 链进行处理后由 POST-ROUTING 链发送给真实服务器。
IPVS 转发模式为非 NAT 模式时,则将数据包由 POSTROUTING 链发送给真实服务器。
TUN,该模式是将客户端的请求包通过 IPIP 方式封装后分发给真实服务器,客户端的返回包则由真实服务器的本地路由自行处理,源 IP 地址还是 VIP 地址(真实服务器需要在本地回环接口配置 VIP)。因 DS 只负责请求包转发,其处理性能比 NAT 模式要高,但需要真实服务器支持 IPIP 协议。
DR,该模式是将客户端的请求包通过修改 MAC 地址为真实服务器的 MAC 地址后将数据包分发给真实服务器,客户端的返回包则由真实服务器的本地路由自行处理,源 IP 地址还是 VIP 地址(真实服务器需要在本地回环接口配置 VIP)。
因 DS 只负责请求包转发,且与真实服务器间进行基于二层的数据分发,所以处理性能最高,但要求 DS 与真实服务器在同一 MAC 广播域内。
阿里扩展版本还针对 LVS 官方版本在安全方面进行了增强,提供了 SYNPROXY 功能支持,该功能在 LVS 上增加了一层 foold 类型的攻击包防护,实现了 UDP/IP FRAG DDOS 攻击防护。
命令样例如下:
命令样例如下:
![多层负载均衡网络架构](https://www.weixueyuan.net/uploads/allimg/200909/8-200Z9151011T8.gif)
图:多层负载均衡网络架构
1、LVS术语
LVS 相关术语说明如下。- DS(Director Server):控制器服务器,部署 LVS 软件的服务器;
- RS(Real Server):真实服务器,被负载的后端服务器;
- VIP(Virtual IP):虚拟 IP,对外提供用户访问的 IP 地址;
- DIP(Director Server IP):控制器服务器 IP,控制器服务器的 IP 地址;
- RIP(Real Server IP):真实服务器 IP,真实服务器的 IP 地址;
- CIP(Client IP):客户端 IP,客户端的 IP 地址;
- IPVS(IP Virtual Server):LVS 的核心代码,工作于内核空间,主要有 IP 包处理、负载均衡算法、系统配置管理及网络链表处理等功能;
- ipvsadm:IPVS 的管理器,工作于用户空间,负责 IPVS 运行规则的配置。
2、LVS工作原理
IPVS 是基于 Linux 的 Netfilter 框架实现的,其以数据包的网络检测链为挂载点完成数据的负载均衡及转发处理。其工作原理如下图所示。![LVS 工作原理](https://www.weixueyuan.net/uploads/allimg/200909/8-200Z9150J6392.gif)
图:LVS 工作原理
客户访问虚拟 IP(VIP)时,数据包先在主机内核空间被 PREROUTING 链检测,根据数据包的目标地址进行路由判断,若目标地址是本地,则交由 INPUT 链进行处理。
IPVS 工作于 INPUT 链,当数据包到达 INPUT 链时,会先由 IPVS 进行检查,并根据负载均衡算法选出真实服务器 IP。
IPVS 转发模式为 NAT 模式时,将数据包由 FORWARD 链进行处理后由 POST-ROUTING 链发送给真实服务器。
IPVS 转发模式为非 NAT 模式时,则将数据包由 POSTROUTING 链发送给真实服务器。
3、LVS转发模式
LVS 支持多种网络部署结构,官方版本提供了 NAT、TUN 及 DR 这 3 种标准转发模式,另阿里巴巴工程师根据自身需求进行扩展,实现了 FullNAT 转发模式。1) LVS标准转发模式如下:
NAT,该模式需要真实服务器的网关指向 DS,客户端的请求包和返回包都要经过 DS,该模式对 DS 的硬件性能的要求相对较高。TUN,该模式是将客户端的请求包通过 IPIP 方式封装后分发给真实服务器,客户端的返回包则由真实服务器的本地路由自行处理,源 IP 地址还是 VIP 地址(真实服务器需要在本地回环接口配置 VIP)。因 DS 只负责请求包转发,其处理性能比 NAT 模式要高,但需要真实服务器支持 IPIP 协议。
DR,该模式是将客户端的请求包通过修改 MAC 地址为真实服务器的 MAC 地址后将数据包分发给真实服务器,客户端的返回包则由真实服务器的本地路由自行处理,源 IP 地址还是 VIP 地址(真实服务器需要在本地回环接口配置 VIP)。
因 DS 只负责请求包转发,且与真实服务器间进行基于二层的数据分发,所以处理性能最高,但要求 DS 与真实服务器在同一 MAC 广播域内。
2) 阿里扩展版本转发模式如下:
FullNAT,该模式是客户端的请求包和返回包都要经过 DS,但真实服务器可以在网络中的任意位置,且无须将网关配置为 DS 的 IP 地址,该方式虽然对 DS 的性能要求较高,但始终由 DS 面对客户端,有效保护了真实服务器的安全。阿里扩展版本还针对 LVS 官方版本在安全方面进行了增强,提供了 SYNPROXY 功能支持,该功能在 LVS 上增加了一层 foold 类型的攻击包防护,实现了 UDP/IP FRAG DDOS 攻击防护。
4、LVS负载均衡算法
LVS 实现了 10 种负载均衡算法,负载均衡算法及其功能介绍如下表所示。算法名称 | 英文名称 | 配置简称 | 功能说明 |
---|---|---|---|
轮询调度 | Round Robin | rr | 将请求依次循环分发给负载的真实服务器 |
加权轮询调度 | Weight Round Robin | wrr | 按照配置的权重比例将请求分发给真实服务器,权重越高,分配的请求越多 |
目标地址散列调度 | Destination Hashing | dh | 该算法将目标地址作为散列键(Hash Key),从散列表中找出对应的真实服务器进行请求分发 |
源地址散列调度 | Source Hashing | sh | 该算法根据源地址作为散列键(Hash Key)从散列表中找出对应的真实服务器进行请求分发 |
最小连接调度 | Least Connections | lc | 将新的请求分发给当前连接数最小的服务器,其通过每个真实服务器当前连接数进行统计判断 |
加权最小连接调度 | Weight Least Connec-tions | wlc | 按照配置的权重,将新请求分发给当前连接数最小的服务器 |
最短延迟调度 | Shortest Expected Delay | sed | 该算法在 WLC 算法的基础上增加了基于活动连接的筛选算法,并把请求分发给算法值最小的真实服务器,该算法避免了 WLC 算法中权重小的空闲服务器无法被分发到连接的情况 |
最少队列调度 | Never Queue | nq | 若有真实服务器的连接数为空,直接分发请求给该真实服务器,如果所有服务器都处于有连接状态,则使用 SED 算法进行调度 |
基于局部的最少连接 | Locality-Based Least Connections | lblc | 该算法将目标地址相同的请求尽可能地分发到上次被分发的真实服务器,真实服务器若超载或不可用则使用最少连接算法进行分发。该方法常用在真实服务器为缓存服务器时,以提高缓存的命中率 |
带复制的基于局部性的最少连接 | Locality-Based Least Connections with Replication | lblcr | 该算法维护一组被分发相同目标地址请求的真实服务器列表,按照最小连接算法创建和添加组成员,并在一定条件下将组内最繁忙的成员移除。目标地址相同的请求将被分发到该组列表中最少连接的成员。该方法常用在真实服务器为缓存服务器时,以提高缓存的命中率 |
5、IPVS的管理器ipvsadm
ipvsadm 1.2.1 版本命令的常用场景分为虚拟服务管理和真实服务器管理两类。1) 虚拟服务管理
在 LVS 配置管理中,每个 VIP 与端口组成一个虚拟服务。虚拟服务管理命令参数格式如下:ipvsadm -A [-t|u|f] [vip_addr:port] [-s:负载算法]
虚拟服务管理命令参数如下表所示。参数 | 参数选项 | 参数说明 |
---|---|---|
-A | 添加虚拟服务,为虚拟服务绑定 VIP 地址及端口 | |
-t | 虚拟服务协议为 TCP 协议 | |
-u | 虚拟服务协议为 UDP 协议 | |
-s | 虚拟服务负载均衡算法 | |
-p | 虚拟服务负载均衡保持连接的超时时间,默认超时时间为 360s。LVS 会把同一个客户端的请求信息记录到 LVS 的 hash 表里,该参数设置了记录的保存时间,设定时间内的客户端连接会被转发到同一真实服务器 | |
-D | 删除虚拟服务记录 | |
-E | 修改虚拟服务记录 | |
-С | 清空所有虚拟服务记录 |
命令样例如下:
# 添加虚拟服务,VIP地址为192.168.2.100:80,协议为TCP,负载均衡算法为轮询算法(rr),启用保持
# 连接支持,默认超时时间为300s
ipvsadm -A -t 192.168.2.100:80 -s rr -p
2) 真实服务器管理
真实服务器管理命令参数格式如下:ipvsadm -a [-t|u|f] [vip_addr:port] [-r ip_addr] [-g|i|m] [-w指定权重]
真实服务器管理命令参数如下图所示。参数 | 参数选项 | 参数说明 |
---|---|---|
-a | 添加真实服务器 | |
-t | 与真实服务器用 TCP 协议建立连接 | |
-u | 与真实服务器用 UDP 协议建立连接 | |
-r | 真服务器 IP | |
-g | 与真实服务器的转发模式为 DR 模式 | |
-i | 与真实服务器的转发模式为 TUN 模式 | |
-m | 与真实服务器的转发模式为 NAT 模式 | |
-w | 指定真实服务器的权重 | |
-d | 删除真实服务器记录 | |
-e | 修改真实服务器记录 |
命令样例如下:
# 在虚拟服务192.168.2.100:80中添加真实服务器192.168.10.3:80,转发模式为NAT模式
ipvsadm -a -t 192.168.2.100:80 -r 192.168.10.3:80 -m
3) 其他常用命令参数
其他常用命令参数格式如下:# 查看IPVS配置
ipvsadm -ln
man ipvsadm
Keepalived配置简述
Keepalived 是一款用C语言编写的开源路由软件,目前仍处于活跃开发的状态,其主要目标是基于 Linux 系统提供一款配置简单且功能强大的负载均衡和高可用的软件应用。负载均衡是基于 LVS(IPVS)实现的,Keepalived 在 LVS 的基础上增加了多种主动健康检测机制,可以根据后端真实服务器的运行状态,自动对虚拟服务器负载的真实服务器进行维护和管理。
高可用性是通过虚拟冗余路由协议(Virtual Reduntant Routing Protocol,VRRP)实现的。VRRP 是工作在网络层的一种路由容错协议,通过组播的通告机制进行网络路由快速转移,以实现网络设备的高可用。
![Keepalived 的工作模式示意图](https://www.weixueyuan.net/uploads/allimg/200909/8-200Z9160411W7.gif)
图:Keepalived 的工作模式示意图
配置样例如下:
配置样例如下:
Keepalived 通过 VRRP 通告判断虚拟路由器中其他 VRRP 路由状态并确保路由的转移,对于业务层的高可用,则需要用户单独对应用进程进行同步检测。例如,Nginx 与 Keepalived 部署在同一台设备上,可以通过脚本检测 Nginx 进程的状态,如果 Nginx 检测失败并无法自动恢复,则降低 VRRP 的优先级。要尽量避免在切换为 MASTER 状态时,因自身业务层故障导致业务高可用切换失败。也可用多个脚本组合实现 VRRP 路由优先级的动态调整。配置样例如下:
真实服务器相关关键字如下表所示。
通过 Keepalived 为真实服务器配置关键字不仅可以实现 LVS 真实服务器的运行参数配置,还可以对自身增加的真实服务器的主动健康检测进行配置。真实服务器健康检测配置关键字如下表所示。
配置样例如下:
高可用性是通过虚拟冗余路由协议(Virtual Reduntant Routing Protocol,VRRP)实现的。VRRP 是工作在网络层的一种路由容错协议,通过组播的通告机制进行网络路由快速转移,以实现网络设备的高可用。
1、Keepalived相关术语
Keepalived相关术语如下:- 虚拟 IP(VIP):对外提供用户访问的 IP 地址,与 LVS 的 VIP 概念相同;
- 真实服务器(Real Server):被负载的后端服务器;
- 服务器池(Server Pool):同一虚拟 IP 及端口的一组真实服务器;
- 虚拟服务器(Virtual Server):服务器池的外部访问点,每个虚拟 IP 和端口组成一个虚拟服务器;
- 虚拟服务(Virtual Service):与 VIP 关联的 TCP/UDP 服务;
- VRRP:Keepalived 实现高可用的虚拟路由器冗余协议;
- VRRP 路由器(VRRP Router):运行 VRRP 协议的路由器设备;
- 虚拟路由器(Virtual Router):一个抽象对象,一组具有相同 VRID(虚拟路由器标识符)的多个 VRRP 路由器集合;
- MASTER 状态:主路由状态,是 VIP 地址的拥有者,负责转发到达虚拟路由的三层数据包,负责对虚拟 IP 地址的 ARP 请求进行响应;
- BACKUP 状态:备份路由状态,当主路由状态设备故障时,负责接管数据包转发及ARP请求响应。
2、Keepalived的工作模式
Keepalived 为 LVS 提供了文件形式的配置方式,并为真实服务器提供了多种主动健康检测机制,通过 VRRP 协议为 LVS 提供了高可用的负载集群解决方案。Keepalived 的工作模式如下图所示。- 处于 MASTER 状态的 Keepalived 主机是 VIP 的拥有者,负责上层路由 VIP 的 ARP 查询响应和数据包转发;
- 处于 MASTER 状态的 Keepalived 主机通过 VRRP 协议在局域网内组播 VRRP 通告信息;
- 处于 MASTER 状态的 Keepalived 主机通过配置的健康检测机制主动检查服务器池中真实服务器的状态;
- 处于 BACKUP 状态的 Keepalived 主机接收 VRRP 通告信息,并根据通告信息判断本机状态是否变更;
- 当处于 MASTER 状态的路由发生故障时,处于 BACKUP 状态的路由确认主路由状态的 VRRP 通告超时时,则改变自身状态为 MASTER 状态,负责上层路由 IP 地址的 ARP 请求响应,并对外组播 VRRP 通告。
![Keepalived 的工作模式示意图](https://www.weixueyuan.net/uploads/allimg/200909/8-200Z9160411W7.gif)
图:Keepalived 的工作模式示意图
3、健康检测
Keepalived 设计了多种主动健康检测机制,每个健康检测机制都注册在全局调度框架中,通过检测真实服务器的运行状态,自动对服务池中的真实服务器进行维护和管理。常用的健康检测机制有以下 4 种。- TCP 检测。通过非阻塞式 TCP 连接超时检查机制检查真实服务器的状态,当真实服务器不响应请求或响应超时时,则确认为检测失败,并将该真实服务器从服务池中移除。
- HTTP 检测。通过 HTTP GET 方法访问指定的 URL 并对返回结果进行 MD5 算法求值,如果与配置文件中的预设值不匹配,则确认为检测失败,并将该真实服务器从服务池中移除。该机制支持同一服务器的多 URL 获取检测。
- SSL 检测。对 HTTP 检测增加了 SSL 支持。
- 自定义脚本。允许用户自定义检测脚本进行检测判断,支持脚本外部传递参数,执行的结果必须是 0 或 1。0 表示检测成功,1 表示检测失败。
4、配置关键字
Keepalived 配置文件可以分为 3 个部分,分别为全局配置、VRRP 配置和虚拟服务配置。各部分的常用配置关键字及其功能如下。1) 全局配置
Keepalived 全局配置关键字实现邮件告警的 SMTP 配置及自身 VRRP 路由相关的全局配置,配置关键字如下表所示。配置关键字 | 功能描述 |
---|---|
global_defs | 全局配置区域标识 |
notification_email | 设置接收告警邮件的地址列表 |
notification_email_from | 设置发送邮件的地址列表 |
smtp_server | 设置用于发送邮件的 SMTP 服务器地址 |
smtp_connection_timeout | 设置 SMTP 服务器连接超时时间 |
router_id | 设置当前设备的路由 ID,每个设备均不相同 |
vrrp_version | VRRP 协议版本 |
nopreempt | 是否启用非抢占模式,即不参与 MASTER 的选举,默认为抢占模式 |
配置样例如下:
global_defs{ notification_email { monitor@nginxbar.org # 接收邮件的邮箱为monitor@nginxbar.org } smtp_server smtp.nginxbar.org # SMTP服务器地址为smtp.nginxbar.org smtp_connect_timeout 30 # SMTP服务器连接超时时间为30秒 router_id LVS_Nginx1 # 当前设备路由ID为LVS_Nginx1 }
2) VRRP配置
Keepalived 的 VRRP 配置关键字用于创建 VRRP 路由器,并为其配置运行参数。配置文件中可以创建多个不同名称的 VRRP 路由器实例,每个 VRRP 路由器实例都需要通过设定虚拟路由 ID 加入虚拟路由器中。VRRP 路由器接收组播的 VRRP 通告,并根据 VRRP 通告切换自身状态。当切换状态时会触发配置中对应状态的 shell 脚本,并根据配置参数判断是否发送告警邮件。VRRP 配置关键字如下表所示。配置关键字 | 功能描述 |
---|---|
vrrp_instance | VRRP 实例配置区域标识 |
state | 设置当前 VRRP 路由的初始状态 |
interface | 设置 VRRP 绑定的设备网络接口 |
virtual_router_id | 设置当前设备所属的虚拟路由 ID |
priority | 设置当前 VRRP 路由的初始优先级,优先级最高的会被选举为 MASTER,优先级取值范围为 1~254 |
advert_int | 发送组播包的间隔时间,默认为 1 秒 |
nopreempt | 是否启用非抢占模式,即不参与 MASTER 的选举,默认为抢占模式 |
preempt_delay | 设置抢占延时,取值范围为 0~1000,默认为 0,单位为秒。即等待多少秒才参与 MASTER 选举 |
authentication | VRRP 通信认证配置区域标识 |
auth_type | 指定 VRRP 通信的认证类型,有 PASS 简单密码认证和 AH:IPSEC 认证两种类型 |
auth_pass | 指定 VRRP 通信密码字符串,最大为 8 位 |
virtual_ipaddress | VIP 地址配置区域标识 |
notify_master | 指定一个转换为 MASTER 状态后执行的 shell 脚本 |
notify_backup | 指定一个转换为 BACKUP 状态后执行的 shell 脚本 |
notify_fault | 指定一个转换为 FAULT 状态后执行的 shell 脚本 |
smtp_alert | 使用 SMTP 的配置发送邮件告警通知 |
配置样例如下:
vrrp_instance VI_1 { state MASTER # 初始路由状态为MASTER interface eth0 # VRRP绑定接口为eth0 virtual_router_id 51 # 虚拟路由器的VRID为51 priority 100 # 当前设备的优先级是100 nopreempt # 不参与MASTER的选举 advert_int 5 # VRRP组播的间隔时间是5秒 authentication { auth_type PASS # 认证类型为PASS auth_pass 2222 # 认证密码为2222 } virtual_ipaddress { 192.168.2.155 # 虚拟服务器的VIP是192.168.2.155 } }VRRP 本身是通过 VRRP 通告机制实现路由器状态切换判断的,但在实际的应用场景中会存在因网络抖动等原因影响 VRRP 的通告传递的情况,为提高状态切换的准确性,Keepalived 还提供了一种脚本检测机制,可以让用户通过自定义脚本更精准地进行路由状态切换。相关配置关键字如下表所示。
配置关键字 | 功能描述 |
---|---|
vrrp_script | VRRP 脚本配置区域标识 |
scrip | 指定要执行的脚本路径 |
weight | 用于调整 VRRP 路由器优先级的权重值,如果脚本执行成功且 weight 为正时,则优先级增力相应值;如果脚本执行失败且 weight 为负,则优先级减少相应值。优先级的取值范围为 1~254 |
interval | 设置检测脚本的执行间隔。单位是 s。默认为 1s |
timeout | 脚本执行返回结果超时时间,超过指定时间则认为检测失败 |
rise | 连续检测成功次数为设定值时才确认为成功状态 |
fall | 连续检测失败次数为设定值时才确认为失败状态 |
init_fail | 设置脚本初始检测状态为失败状态 |
Keepalived 通过 VRRP 通告判断虚拟路由器中其他 VRRP 路由状态并确保路由的转移,对于业务层的高可用,则需要用户单独对应用进程进行同步检测。例如,Nginx 与 Keepalived 部署在同一台设备上,可以通过脚本检测 Nginx 进程的状态,如果 Nginx 检测失败并无法自动恢复,则降低 VRRP 的优先级。要尽量避免在切换为 MASTER 状态时,因自身业务层故障导致业务高可用切换失败。也可用多个脚本组合实现 VRRP 路由优先级的动态调整。配置样例如下:
vrrp_script checknginx { script "/opt/data/scripts/checknginx.sh" interval 3 # 检测脚本执行时间间隔 weight -20 # 当检测失败时,VRRP路由优先级降低20 rise 3 # 连续监测3次成功才确认为成功 fall 3 # 连续监测3次失败才确认为失败 }检测脚本内容如下:
#!/bin/bash # 检测脚本查询Nginx进程是否存在,若存在则返回0,若检测失败则返回1 check = `ps aux | grep -v grep | grep nginx | wc -l` if [ $check > 0 ]; then exit 0 else systemctl start nginx exit 1 fi
3) 虚拟服务器配置
Keepalived 的虚拟服务器是负载均衡的外部访问点,通过配置关键字实现对 LVS 运行参数的配置,配置文件中可以为 VIP 绑定不同的端口创建多个虚拟服务器。虚拟服务器配置关键字如下表所示。配置关键字 | 功能描述 |
---|---|
virtual_server | 虚拟服务器配置区域标识 |
delay_loop | 设置健康检测的间隔时间 |
lb_algo | LVS 调度算法 |
lb_kind | LVS 转模式(NAT、DR、TUN) |
persistence_timeout | 设置保持连接的超时时间,在设定时间内会把同一个客户端的连接全部转发给同一真实服务器 |
persistence_granularity | 对启用保持连接的客户端 IP 进行掩码调整,当 IP 为 255.255.255.255 时,则仅限这个 IP 的客户端;当 IP 为 255.255.255.0 时,则为这个客户端所在子网网段内 IP 的所有客户端 |
virtualhost | 为 HTTP_GET 或 SSL_GET 设置执行要检测的虚拟主机 |
protocol | 转发协议类型(TCP、UDP、SCTP) |
sorry_server | 设置一个服务池中所有真实服务器都无法访问时的备用服务器 |
真实服务器相关关键字如下表所示。
配置关键字 | 功能描述 |
---|---|
real_server | 配置真实服务器 IP 及端口 |
weight | 设置真实服务器的权重,默认为 1 |
inhibit_on_failure | 当健康检测失败时,将当前服务器权重设置为 0,而不将其从服务器池中移除 |
notify_up | 当前服务器健康检查成功时执行的脚本 |
notify_down | 当前服务器健康检查失败时执行的脚本 |
uthreshold | 当前服务器的最大连接数 |
lthreshold | 当前服务器的最小连接数 |
TCP_CHECK | TCP 检测设置区域标识 |
MISC_CHECK | 自定义检测脚本设置区域标识 |
HTTP_GET | HTTP 检测设置区域标识 |
SSL_GET | SSL HTTP 检测设置区域标识 |
通过 Keepalived 为真实服务器配置关键字不仅可以实现 LVS 真实服务器的运行参数配置,还可以对自身增加的真实服务器的主动健康检测进行配置。真实服务器健康检测配置关键字如下表所示。
配置关键字 | 功能描述 |
---|---|
url | HTTP_GET 和 SSL_GET 的 URL 检测标识 |
path | HTTP_GET 和 SSL_GET 的 URL 检测路径 |
digest | HTTP_GET 和 SSL_GET 的返回结果的 MD5 计算值 |
status_code | HTTP_GET 和 SSL_GET 的健康检测返回状态码 |
connect_ip | 检测的 IP 地址,默认为真实服务器的 IP 地址 |
connect_port | 检测的端口,默认为真实服务器的端口 |
bindto | 发起检测连接的接口地址,默认为本地 IP 地址 |
bind_port | 发起检测连接的源端口,默认为随机端口 |
connect_timeout | 检测连接的超时时间,默认为 5s |
fwmark | 使用 fwmark 对所有发出去的检查数据包进行标记 |
warmup | 指定一个随机延迟时间用于防止网络阻塞,如果为 0,则表示关闭该功能 |
nb_get_retry | GET 尝试次数,仅 HTTP_GET 和 SSL_GET 有效 |
retry | 重试次数,默认是 1 次,仅 TCP_CHECK 有效 |
delay_before_retry | 设置在重试之前延迟的秒数 |
配置样例如下:
virtual_server 192.168.2.155 80 { # 虚拟服务器IP及端口 delay_loop 6 # 健康检测间隔时间为6s lb_algo wrr # 负载均衡调度算法为加权轮询 lb_kind DR # 转发模式为DR persistence_timeout 60 # 保持连接的超时时间为60s protocol TCP # 负载均衡转发协议为TCP real_server 192.168.2.109 80 { # 真实服务器IP及端口 weight 100 # 真实服务器权重为100 notify_down /etc/keepalived/scripts/stop.sh # 当真实服务器健康检测失败时执行stop.sh脚本 HTTP_GET { url { path "/healthcheck" # 指定要检查的URL的路径 digest bfaa324fdd71444e43eca3b7a1679a1a # 检测URL返回值的MD5计算值 status_code 200 # 健康检测返回状态码 } connect_timeout 10 # 连接超时时间为10s nb_get_retry 3 # 重试3次确认失败 delay_before_retry 3 # 失败重试的时间间隔为3s } } } # digest值的计算方法 genhash -s 192.168.2.109 -p 80 -u /healthcheckKeepalived 的其他配置关键字此处并未列出,更多配置关键字可以通过 man 命令获取。
man keepalived.conf
Nginx集群负载(基于LVS和Keepalived)搭建
基于 LVS 和 Keepalived 的 Nginx 集群负载是使用 LVS 做传输层的负载均衡设备,将客户端请求从传输层负载到后端的多组 Nginx 集群,并由 Nginx 集群实现应用层负载均衡处理的多层负载均衡网络架构。Keepalived 通过文件配置的方式实现 LVS 的运行管理,并通过 VRRP 机制实现传输层负载的高可用,为 Nginx 集群提供高性能、高可用的负载应用。
Nginx 集群负载部署图如下图所示。
![Nginx 集群负载部署图](https://www.weixueyuan.net/uploads/allimg/200909/8-200Z9163540624.gif)
图:Nginx 集群负载部署图
Nginx 集群负载部署图如下图所示。
- LVS 作为传输层负载均衡与接入路由对接,负责把数据包转发给后端的 Nginx 服务器。
- LVS 选用 DR 转发模式,网络数据包在传输层被分发到 Nginx 服务器,并由 Nginx 经过本地路由返回给客户端。
- LVS 对后端 Nginx 服务器集群选用加权轮询(wrr)的负载均衡调度策略。
- Keepalived 通过 VRRP 协议组播通告状态信息,确保两台 LVS 服务器的高可用。
- 当处于 MASTER 状态的 Keepalived 发生故障时,处于 BACKUP 状态的 Keepalived 切换为 MASTER 状态,负责与接入路由对接,把数据包转发给后端的 Nginx 服务器。
- Keepalived 通过健康检测机制检测 Nginx 集群内每台 Nginx 服务器的健康状态。
- Nginx 负责应用层负载均衡,完成客户端请求的负载、路由分流、过滤等操作。
![Nginx 集群负载部署图](https://www.weixueyuan.net/uploads/allimg/200909/8-200Z9163540624.gif)
图:Nginx 集群负载部署图
1) Keepalived安装
Keepalived 在 CentOS 7 系统下使用 yum 安装即可。在 CentOS 7 系统下,LVS 已被集成到内核中,无须单独安装。yum -y install keepalived
systemctl enable keepalived
2) Keepalived配置
Keepalived 需要分别在两台 LVS 服务器上进行配置,主服务器上的 Keepalived 配置如下:! Configuration File for keepalived global_defs { notification_email { monitor@nginxbar.org # 发生故障时发送邮件告警通知的邮箱 } notification_email_from admin@nginxbar.org # 使用哪个邮箱发送 smtp_server mail.nginxbar.org # 发件服务器 smtp_connect_timeout 30 router_id LVS_01 # 当前设备路由ID为LVS_01 } vrrp_instance VI_1 { state MASTER # 初始路由状态为MASTER interface eth0 # VRRP绑定的本地网卡接口为eth0 virtual_router_id 51 # 虚拟路由器的VRID为51 priority 100 # 当前设备的优先级是100 advert_int 5 # VRRP组播的间隔时间是5s authentication { auth_type PASS # 认证类型为PASS auth_pass 2222 # 认证密码为2222 } virtual_ipaddress { 192.168.21.155 # 虚拟服务器的VIP是192.168.21.155 } } virtual_server 192.168.21.155 80 { # 虚拟服务器IP及端口 delay_loop 6 # 健康检测间隔时间为6s lb_algo wrr # 负载均衡调度算法为加权轮询 lb_kind DR # 转发模式为DR persistence_timeout 60 # 保持连接的超时时间为60s protocol TCP # 负载均衡转发协议为TCP real_server 192.168.2.108 80 { # 真实服务器IP及端口 weight 100 # 真实服务器权重为100 notify_down /etc/keepalived/scripts/stop.sh # 当真实服务器健康检测失败时执 # 行stop.sh脚本 HTTP_GET { url { path "/healthcheck" # 指定要检查的URL的路径 digest bfaa324fdd71444e43eca3b7a1679a1a # 检测URL返回值的MD5计算值 status_code 200 # 健康检测返回状态码 } connect_timeout 10 # 连接超时时间为10s nb_get_retry 3 # 重试3次确认失败 delay_before_retry 3 # 失败重试的时间间隔为3s } } real_server 192.168.2.109 80 { # 真实服务器IP及端口 weight 100 # 真实服务器权重为100 notify_down /etc/keepalived/scripts/stop.sh # 当真实服务器健康检测失败时执 # 行stop.sh脚本 HTTP_GET { url { path "/healthcheck" # 指定要检查的URL的路径 digest bfaa324fdd71444e43eca3b7a1679a1a # 检测URL返回值的MD5计算值 status_code 200 # 健康检测返回状态码 } connect_timeout 10 # 连接超时时间为10s nb_get_retry 3 # 重试3次确认失败 delay_before_retry 3 # 失败重试的时间间隔为3s } } }备份服务器上的 Keepalived 配置样例如下:
! Configuration File for keepalived global_defs { notification_email { monitor@nginxbar.org # 发生故障时发送邮件告警通知 # 的邮箱 } notification_email_from admin@nginxbar.org # 使用哪个邮箱发送 smtp_server mail.nginxbar.org # 发件服务器 smtp_connect_timeout 30 router_id LVS_02 # 当前设备路由ID为LVS_02,此 # 处与主服务器配置不同 } vrrp_instance VI_1 { state BACKUP # 初始路由状态为BACKUP,此处 # 与主服务器配置不同 interface eth0 # VRRP绑定的本地网卡接口为eth0 virtual_router_id 51 # 虚拟路由器的VRID为51 priority 99 # 当前设备的优先级是99,此处 # 与主服务器配置不同 advert_int 5 # VRRP组播的间隔时间是5s authentication { auth_type PASS # 认证类型为PASS auth_pass 2222 # 认证密码为2222 } virtual_ipaddress { 192.168.21.155 # 虚拟服务器的VIP是192.168.21.155 } } virtual_server 192.168.21.155 80 { # 虚拟服务器IP及端口 delay_loop 6 # 健康检测间隔时间为6s lb_algo wrr # 负载均衡调度算法为加权轮询 lb_kind DR # 转发模式为DR persistence_timeout 60 # 保持连接的超时时间为60s protocol TCP # 负载均衡转发协议为TCP real_server 192.168.2.108 80 { # 真实服务器IP及端口 weight 100 # 真实服务器权重为100 notify_down /etc/keepalived/scripts/stop.sh # 当真实服务器健康检测失败时执 # 行stop.sh脚本 HTTP_GET { url { path "/healthcheck" # 指定要检查的URL的路径 digest bfaa324fdd71444e43eca3b7a1679a1a # 检测URL返回值的MD5计算值 status_code 200 # 健康检测返回状态码 } connect_timeout 10 # 连接超时时间为10s nb_get_retry 3 # 重试3次确认失败 delay_before_retry 3 # 失败重试的时间间隔为3s } } real_server 192.168.2.109 80 { # 真实服务器IP及端口 weight 100 # 真实服务器权重为100 notify_down /etc/keepalived/scripts/stop.sh # 当真实服务器健康检测失败时执 # 行stop.sh脚本 HTTP_GET { url { path "/healthcheck" # 指定要检查的URL的路径 digest bfaa324fdd71444e43eca3b7a1679a1a # 检测URL返回值的MD5计算值 status_code 200 # 健康检测返回状态码 } connect_timeout 10 # 连接超时时间为10s nb_get_retry 3 # 重试3次确认失败 delay_before_retry 3 # 失败重试的时间间隔为3s } } }至此,高可用的 LVS 负载均衡就配置完成了。当主 LVS 服务器出现故障时,备份 LVS 服务器可以快速接管传输层网络数据的负载均衡工作,将数据包分发给后端的 Nginx 服务器集群。