高业务量的互联网应用服务器通常需要硬度每秒几万个到几十万个请求的处理。为实现高并发的处理能力,网站架构师们会使用负载均衡设备对同一个应用的服务器集群进行负载。负载均衡设备由硬件或软件设备构成,负责把客户端的请求按照不同的策略转发给后端的应用服务器,每组应用服务器集群均可根据实际的处理性能进行横向扩展,以提高请求的处理能力。在同一企业内部,许多应用集群会共享一个或一组负载均衡设备,由于负载均衡设备会负责所有应用的负载,所以它会被实施更加严格的管理策略。互联网业务产品的复杂性及解耦需求,使得应用开发团队希望可以更加灵活地进行负载均衡及路由策略变更,因此会在负载均衡设备及应用服务器之间再部署一组负载均衡实现应用层的二次负载转发。
在实际应用中,入口的负载均衡设备仅负责在传输层实现数据包的快速转发,被转发的数据包继续由多组Nginx负载集群进行应用层负载、路由及管控,以此实现对客户请求多层负载均衡设备转发的负载架构。
多层负载均衡架构
多层负载均衡架构师将网络数据在传输层与应用层分开进行负载的网络架构,在传输层使用专用的负载均衡设备或软件仅做网络分发,在应用层由Nginx进行流量路由、过滤、转发等操作。这种网络架构极大地发挥了Nginx对HTTP、HTTPS等七层协议请求的处理优势,同时提高了传输层负载均衡的效率,增加了负载集群的横向扩展能力。
常见的多层负载均衡网络架构如下图所示:
- 通常互联网接入都会考虑高可用的网络结构,按照网络进入的层级可以划分为接入层和负载层
- 接入层由高可用的主备双路由设备组成
- 多层负载均衡网络架构的负载层分为传输层负载和应用层负载
- 传输层负载由处理逻辑较少的传输层负载均衡设备或软件组成,通常传输层负载均衡会使用高性能的硬件F5、Radware等,也可以使用LVS自建服务器实现。在云环境中,传输层负载均衡通常由云服务商自建的负载均衡集群实现。
- 应用层负载由多组Nginx集群组成。
- 外网数据访问传输层负载均衡器的虚拟IP,访问请求被转发到后端的Nginx服务器,以实现网络数据的多层负载转发。
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运行规则的配置
LVS工作原理
IPVS是基于Linux的Netfilter框架实现的,其以数据包的网络检测链为挂载点完成数据的负载均衡及转发处理。其工作原理如下图所示:
- 客户访问虚拟IP(VIP)时,数据包先在主机内核空间被PREROUTING链检测,根据数据包的目标地址进行路由判断,若目标地址是本地,则交由INPUT链进行处理
- IPVS工作于INPUT链,当数据包到达INPUT链时,会先由IPVS进行检查,并根据负载均衡算法选出真实服务器IP
- IPVS转发模式为NAT模式时,将数据包由FORWARD链进行处理后由POST-ROUTING链发送给真实服务器
- IPVS转发模式为非NAT模式时,则将数据包由POSTROUTING链发送给真实服务器
LVS转发模式
LVS支持多种网络部署结构,官方版本提供了NAT、TUN及DR这3种标准转发模式,另外阿里工程师根据自身需求进行扩展,实现了FullNAT转发模式。LVS标准转发模式如下:
- NAT,该模式需要真实服务器的网关指向DS,客户端的请求包和返回包都要经过DS,该模式对DS的硬件性能的要求相对较高
- TUN,该模式是将客户端的请求包通过IPIP方式封装后分发给真实服务器,客户端的返回包则由真实服务器的本地路由自行处理,源IP地址还是VIP地址(真实服务器需要在本地回环接口配置VIP)。因DS只负责请求包转发,其处理性能比NAT模式要高,但需要真实服务器支持IPIP协议
- DR,该模式是将客户端的请求包通过修改MAC地址为真实服务器的MAC地址后将数据包分发给真实服务器,客户端的返回包则由真实服务器的本地路由自行处理,源IP地址还是VIP地址(真实服务器需要在本地回环接口配置VIP)。因DS只负责请求包转发,且与真实服务器间进行基于二层的数据分发,所以处理性能最高,但要求DS与真实服务器在同一MAC广播域内。
- FullNAT,该模式是客户端的请求包和返回包都要经过DS,但真实服务器可以在网络中的任意位置,且无须将网关配置为DS的IP地址,该方式虽然对DS的性能要求较高,但始终由DS面对客户端,有效保护了真实服务器的安全。
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 Connections | wlc | 按照配置的权重,将新请求分发给当前连接数最小的服务器 |
最短延迟调度 | Shortest Expected Delay | sed | 该算法在WLC算法的基础上增加了基于活动连接的筛选算法,并把请求分发给算法值最小的真实服务器,该算法避免了WLC算法中权重小的空闲服务器无法被分发到连接的情况 |
最少队列调度 | Never Queue | nq | 若有真实服务器的连接数为空,直接分发请求给该真实服务器,如果所有服务器都处于有连接状态,则使用SED算法进行调度 |
基于局部的最少连接 | Locality-Based Least Connections | lblc | 该算法将目标地址相同的请求尽可能地分发到上次被分发的真实服务器,真实服务器若超载或不可用,则使用最少连接算法进行分发。该方法常用在真实服务器为缓存服务器时,以提高缓存的命中率 |
带复制的基于局部性的最少连接 | Locatity-Based Least Connections with Replication | lblcr | 该算法维护一组被分发相同目标地址请求的真实服务器列表,按照最小连接算法创建和添加组成员,并在一定条件下将组内最繁忙的成员移除。目标地址相同的请求将被分发到该组列表中最少连接的成员。该方法常用在真实服务器为缓存服务器时,以提高缓存的命中率 |
IPVS管理器-ipvsadm
ipvsadm 1.2.1版本命令的常用场景分为虚拟服务管理和真实服务器管理两类。
虚拟服务管理
在LVS配置管理中,每个VIP与端口组成一个虚拟服务。虚拟服务管理命令参数格式如下:
ipvsadm -A [-t|u|f] [vip_addr:port] [-s:负载算法]
虚拟服务管理命令参数如下表所示:
参数 | 参数选项 | 参数说明 |
---|---|---|
-A | 添加虚拟服务,为虚拟服务绑定VIP地址及端口 | |
-t | 虚拟服务协议为TCP协议 | |
-u | 虚拟服务协议为UDP协议 | |
-s | 虚拟服务负载均衡算法 | |
-p | 虚拟服务负载均衡保持连接的超时时间,默认超时时间为300s。LVS会把同一个客户端的请求信息记录到LVS的hash表里,该参数设置了记录的保存时间,设定时间内的客户端连接会被转发到同一真实服务器 | |
-D | 删除虚拟服务记录 | |
-E | 修改虚拟服务记录 | |
-C | 清空所有虚拟服务记录 |
命令样例如下:
#添加虚拟服务,VIP地址为192.168.2.100:80,协议为TCP,负载均衡算法为轮询算法(rr),启用保持
#连接支持,默认超时时间为300s
ipvsadm -A -t 192.168.2.100:80 -s rr -p
真实服务器管理
真实服务器管理命令参数格式如下:
ipvsadm -a [-t|u|f] [vip_addr:port] [-r ip_addr] [-g | i | m] [-w指定权重]
真实服务器管理命令参数如下表
参数 | 参数选项 | 参数说明 |
---|---|---|
-a | 添加真实服务器 | |
-t | 与真实服务器用TCP协议建立连接 | |
-u | 与真实服务器用UDP协议建立连接 | |
-f | 真实服务器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
Keepalived
Keepalived是一款用C语言编写的开源路由软件,其主要目标是基于Linux系统提供一款配置简单且功能强大的负载均衡和高可用的软件应用。负载均衡是基于LVS(IPVS)实现的,Keepalived在LVS的基础上增加了多种主动健康检测机制,可以根据后端真实服务器的运行状态,自动对虚拟服务器负载的真实服务器进行维护和管理。高可用性是通过虚拟冗余路由协议(Virtual Reduntant Routing Protocol,VRRP)实现的。VRRP是工作在网络层的一种路由容错协议,通过组播的通告机制进行网络路由快速转移,以实现网络设备的高可用。
Keepalived相关术语
Keepalived相关术语如下:
- 虚拟IP(VIP):对外提供用户访问的IP地址,与LVS的VIP概念相同
- 真实服务器(Real Server):被负载的后端服务器
- 服务器池(Server Pool):同一虚拟IP及端口的一组真实服务器
- 虚拟服务器(Virtual Server):服务器池的外部访问点,每个虚拟IP和端口组成一个虚拟服务器
- VRRP:Keepalived实现高可用的虚拟路由器冗余协议
- VRRP路由器(VRRP Router):运行VRRP协议的路由器设备
- 虚拟路由器(Virtual Router):一个抽象对象,一组具有相同VRID(虚拟路由器标识符)的多个VRRP路由器集合
- MASTER状态:主路由状态,是VIP地址的拥有者,负责转发到达虚拟路由的三层数据包,负责对虚拟IP地址的ARP请求进行响应
- BACKUP状态:备份路由状态,当主路由状态设备故障时,负责接管数据包转发及ARP请求响应
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设计了多种主动健康检测机制,每个健康检测机制都注册在全局调度框架中,通过检测真实服务器的运行状态,自动对服务池中的真实服务器进行维护和管理。常用的健康检测机制有以下4种:
- TCP检测:通过非阻塞式TCP连接超时检查机制检查真实服务器的状态,当真实服务器不响应请求或响应超时时,则确认检测失败,并将该真实服务器从服务池中移除
- HTTP检测:通过HTTP GET方法访问指定的URL并对返回结果进行MD5算法求值,如果与配置文件中的预设值不匹配,则确认为检测失败,并将该真实服务器从服务池中移除。该机制支持同一服务器的多URL获取检测。
- SSL检测:对HTTP检测增加了SSL支持
- 自定义脚本:允许用户自定义检测脚本进行检测判断,支持脚本外部传递参数,执行的结果必须是0或1。0表示检测成功,1表示检测失败
配置关键字
Keepalived配置文件可以分为3个部分,分别为全局配置、VRRP配置和虚拟服务配置。各部分的常用配置关键字及其功能如下:
全局配置
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 {
torres@163.com #接收邮件的邮箱
}
smtp_server smtp.torres.org #SMTP服务器
smtp_connect_timeout 30 #SMTP服务器连接超时时间
router_if LVS_Nginx1 #当前设备路由
}
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秒
authentiction {
auth_type PASS #认证类型为PASS
auth_pass 2222 #认证密码为2222
}
virtual_ipaddress {
192.168.133.10 #虚拟服务器的VIP是192.168.133.10
}
}
VRRP本身是通过VRRP通告机制实现路由器状态切换判断的,但在实际的应用场景中会存在因网络抖动等原因影响VRRP的通告传递的情况,为提高状态切换的准确性,Keepalived还提供了一种脚本检测机制,可以让用户通过自定义脚本更精准地进行路由状态切换。相关配置关键字如下表:
配置关键字 | 功能描述 |
---|---|
vrrp_script | VRRP脚本配置区域标识 |
script | 指定要执行的脚本路径 |
weight | 用于调整VRRP路由器优先级的权重值,如果脚本执行成功且weight为正时,则优先级增加相应值;如果脚本执行失败且weight为负,则优先级减少相应值。优先级的取值范围为1~254 |
interval | 设置检测脚本的执行间隔,单位是秒,默认为1秒 |
timeout | 脚本执行返回结果超时时间,超过指定时间则认为检测失败 |
rise | 连续检测成功次数为设定值时才确认为成功状态 |
fail | 连续检测失败次数为设定值时才确认为失败状态 |
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次成功才确认为成功
fail 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
虚拟服务器配置
Keepalived的虚拟服务器是负载均衡的外部访问点,通过配置关键字实现对LVS运行参数的配置,配置文件中可以为VIP绑定不同的端口创建多个虚拟服务器。虚拟服务器配置关键字如下表:
配置关键字 | 功能描述 |
---|---|
virtual_server | 虚拟服务器配置区域标识 |
delay_loop | 设置健康检测的间隔时间 |
lb_algo | LVS调度算法 |
lb_kind | LVS转发模式(NAT、DR、TUN) |
persistent_timeout | 设置保持连接的超时时间,在设定时间内会把同一个客户端的连接全部转发给同一真实服务器 |
persistent_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对所有发出去的检查数据包进行标记 |
warnup | 指定一个随机延迟时间用于防止网络阻塞,如果为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 #连接超时时间为10
nb_get_retry 3 #重试3次确认失败
delay_before_retry 3 #失败重试的时间间隔为3s
}
}
}
#digest值的计算方法
genhash -s 192.168.2.109 -p 80 -u /healthcheck
Keepalived的更多配置关键字可以通过man命令获取。
man keepalived.conf
Nginx集群负载搭建
基于LVS和Keepalived的Nginx集群负载是使用LVS做传输层的负载均衡设备,将客户端请求从传输层负载到后端的多组Nginx集群,并由Nginx集群实现应用层负载均衡处理的多层负载均衡网络架构。
Keepalived通过文件配置的方式实现LVS的运行管理,并通过VRRP机制实现传输层负载的高可用,为Nginx集群提供高性能、高可用的负载应用。Nginx集群负载部署图如下:
- LVS作为传输层负载均衡与接入路由对接,负载把数据包转发给后端的Nginx服务器
- LVS选用DR转发模式,网络数据包在传输层被分发给Nginx服务器,并由Nginx经过本地路由返回给客户端
- LVS对后端Nginx服务器集群选用加权轮询(wrr)的负载均衡调度策略
- Keepalived通过VRRP协议组播通告状态信息,确保两台LVS服务器的高可用
- 当处于MASTER状态的Keepalived发生故障时,处于BACKUP状态的Keepalived切换为MASTER状态,负责与接入路由对接,把数据包转发给后端的Nginx服务器
- Keepalived通过健康检测机制检查Nginx集群内每台Nginx服务器的健康状态。
- Nginx负责应用层负载均衡,完成客户端请求的负载、路由分流、过滤等操作。
Keepalived安装
#安装
yum install -y keepalived
#开机自启动
systemctl enable keepalived
Keepalived配置
Keepalived需要分别在两台LVS服务器上进行配置,主服务器上的Keepalived配置如下:
#Configuration File for Keepalived
global_defs {
notification_email {
torres@163.com #发生故障时发送邮件告警通知的邮箱
}
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 {
torres@163.com #发生故障时发送邮件告警通知的邮箱
}
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服务器集群。