Nginx集群负载与配置管理
- 1、Nginx集群负载
- 1.1、多层负载均衡架构
- 1.2、LVS简介
- 1.2.1、LVS术语
- 1.2.2、LVS工作原理
- 1.2.3、LVS转发模式
- 1.2.4、LVS负载均衡算法
- 1.2.5、IPVS的管理器ipvsadm
- 1.3、Keepalived简介
- 1.3.1、Keepalived相关术语
- 1.3.2、Keepalived的工作模式
- 1.3.3、健康检测
- 1.3.4、配置关键字
- 1.4、Nginx集群负载搭建
高业务量的互联网应用服务器通常需要应对每秒几万个到几十万个请求的处理。为实现高并发的处理能力,网站架构师们会使用负载均衡设备对同一个应用的服务器集群进行负载。负载均衡设备由硬件或软件设备构成,负责把客户端的请求按照不同的策略转发给后端的应用服务器,每组应用服务器集群均可根据实际的处理性能进行横向扩展,以提高请求的处理能力。在同一企业内部,许多应用集群会共享一个或一组负载均衡设备,由于负载均衡设备会负责所有应用的负载,所以它会被实施更加严格的管理策略。互联网业务产品的复杂性及解耦需求,使得应用开发团队希望可以更加灵活地进行负载均衡负载及路由策略变更,因此会在负载均衡设备及应用服务器之间再部署一组负载均衡实现应用层的二次负载转发。这种方式既可以有效解决多个团队共用负载均衡设备的使用冲突,又可以通过二次负载均衡的横向扩展,不断提高应用服务器整体的负载能力。在实际使用中,入口的负载均衡设备仅负责在传输层(网络分层模型的第四层)实现数据包的快速转发,被转发的数据包继续由多组Nginx负载集群进行应用层(OSI七层模型的第七层)负载、路由及管控,以此实现对客户请求多层负载均衡设备转发的负载架构。
业务应用请求经Nginx集群的二次负载,可以避免多个应用团队因共享负载均衡设备产生的使用冲突,从而有效降低因部分应用负载策略频繁变更带来的影响,但同样给Nginx的配置管理带来了挑战。为了给应用团队提供更灵活的策略变更能力,需要有一套可Web化、规范化的操作平台对多组Nginx集群进行配置管理。本章将推荐一个无须编写代码,通过对现有的开源软件Jenkins、GitLab和Ansible进行组合,快速搭建一套Web化的Nginx集群配置管理框架的方法。该管理框架通过Jenkins的Web化管理界面实现了权限管理、前端配置、发布记录等功能。它结合GitLab的版本控制功能对每次的变更进行归档,并可随时实现配置回滚。通过对Ansible剧本的调用,自动化地实现了Nginx集群的配置修改、加载、灰度发布等操作。
1、Nginx集群负载
多层负载均衡架构使Nginx集群得到了广泛的应用,Nginx集群主要被应用于对应用层数据的负载转发,网络数据在传输层则由专用的传输层负载均衡硬件或软件进行负载处理。在常见的传输层负载均衡软件中,LVS集成在Linux内核中,工作在系统内核空间,在DR转发模式下,数据包在网络传输层仅被快速分发,返回的数据包路径并不经过LVS,所以其在网络传输层负载均衡软件里负载性能最强。本节将介绍使用LVS作为Nginx集群的传输层负载均衡设备,并使用Keepalived实现LVS的文件化配置和LVS服务器的高可用管理。
1.1、多层负载均衡架构
多层负载均衡架构是将网络数据在传输层与应用层分开进行负载的网络架构,在传输层使用专用的负载均衡设备或软件仅做网络分发,在应用层由Nginx进行流量路由、过滤、转发等操作。这种网络架构极大地发挥了Nginx对HTTP、HTTPS等七层协议请求的处理优势,同时提高了传输层负载均衡的效率,增加了负载集群的横向扩展能力。常见的多层负载均衡网络架构如图所示。
- 通常互联网接入都会考虑高可用的网络结构,按照网络进入的层级可以划分为接入层和负载层。
- 接入层由高可用的主备双路由设备组成。
- 多层负载均衡网络架构的负载层分为传输层负载和应用层负载。
- 传输层负载由处理逻辑较少的传输层负载均衡设备或软件组成,通常传输层负载均衡会使用高性能的硬件F5、Radware等,也可以使用LVS自建服务器实现。在云环境中,传输层负载均衡通常由云服务商自建的负载均衡集群实现。
- 应用层负载由多组Nginx集群组成。
- 外网数据访问传输层负载均衡器的虚拟IP,访问请求被转发到后端的Nginx服务器,以实现网络数据的多层负载转发。
1.2、LVS简介
LVS(Linux Virtual Server)是一个开源的负载均衡项目,是国内最早出现的开源项目之一,目前已被集成到Linux内核模块中。该项目在Linux内核中实现了基于TCP层的IP数据负载均衡分发,其工作在内核空间且仅做负载均衡分发处理,所以稳定性相对较好,性能相对较强,对内存及CPU资源的消耗也最低。
1.2.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运行规则的配置。
1.2.2、LVS工作原理
IPVS是基于Linux的Netfilter框架实现的,其以数据包的网络检测链为挂载点完成数据的负载均衡及转发处理。其工作原理如图所示。
- 客户访问虚拟IP(VIP)时,数据包先在主机内核空间被PREROUTING链检测,根据数据包的目标地址进行路由判断,若目标地址是本地,则交由INPUT链进行处理。
- IPVS工作于INPUT链,当数据包到达INPUT链时,会先由IPVS进行检查,并根据负载均衡算法选出真实服务器IP。
- IPVS转发模式为NAT模式时,将数据包由FORWARD链进行处理后由POST-ROUTING链发送给真实服务器。
- IPVS转发模式为非NAT模式时,则将数据包由POSTROUTING链发送给真实服务器。
1.2.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攻击防护。
1.2.4、LVS负载均衡算法
LVS实现了10种负载均衡算法,负载均衡算法及其功能介绍如表所示。
1.2.5、IPVS的管理器ipvsadm
ipvsadm 1.2.1版本命令的常用场景分为虚拟服务管理和真实服务器管理两类。
- (1)虚拟服务管理
在LVS配置管理中,每个VIP与端口组成一个虚拟服务。虚拟服务管理命令参数格式如下:
虚拟服务管理命令参数如表所示。ipvsadm-A[-t|u|f][vip_addr:port][-s:负载算法]
命令样例如下:# 添加虚拟服务,VIP地址为192.168.2.100:80,协议为TCP,负载均衡算法为轮询算法(rr),启用保持# 连接支持,默认超时时间为300sipvsadm-A-t192.168.2.100:80-srr-p - (2)真实服务器管理
真实服务器管理命令参数格式如下:
真实服务器管理命令参数如表所示。ipvsadm-a[-t|u|f][vip_addr:port][-r ip_addr][-g|i|m][-w指定权重]
命令样例如下:# 在虚拟服务192.168.2.100:80中添加真实服务器192.168.10.3:80,转发模式为NAT模式ipvsadm-a-t192.168.2.100:80-r192.168.10.3:80-m - (3)其他常用命令参数
其他常用命令参数格式如下:
更多命令参数可以通过man命令查看。# 查看IPVS配置ipvsadm-lnmanipvsadm
1.3、Keepalived简介
Keepalived是一款用C语言编写的开源路由软件,目前仍处于活跃开发的状态,其主要目标是基于Linux系统提供一款配置简单且功能强大的负载均衡和高可用的软件应用。负载均衡是基于LVS(IPVS)实现的,Keepalived在LVS的基础上增加了多种主动健康检测机制,可以根据后端真实服务器的运行状态,自动对虚拟服务器负载的真实服务器进行维护和管理。高可用性是通过虚拟冗余路由协议(Virtual Reduntant Routing Protocol, VRRP)实现的。VRRP是工作在网络层的一种路由容错协议,通过组播的通告机制进行网络路由快速转移,以实现网络设备的高可用。
1.3.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请求响应。
1.3.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通告。
1.3.3、健康检测
Keepalived设计了多种主动健康检测机制,每个健康检测机制都注册在全局调度框架中,通过检测真实服务器的运行状态,自动对服务池中的真实服务器进行维护和管理。常用的健康检测机制有以下4种。
- TCP检测。通过非阻塞式TCP连接超时检查机制检查真实服务器的状态,当真实服务器不响应请求或响应超时时,则确认为检测失败,并将该真实服务器从服务池中移除。
- HTTP检测。通过HTTP GET方法访问指定的URL并对返回结果进行MD5算法求值,如果与配置文件中的预设值不匹配,则确认为检测失败,并将该真实服务器从服务池中移除。该机制支持同一服务器的多URL获取检测。
- SSL检测。对HTTP检测增加了SSL支持。
- 自定义脚本。允许用户自定义检测脚本进行检测判断,支持脚本外部传递参数,执行的结果必须是0或1。0表示检测成功,1表示检测失败。
1.3.4、配置关键字
Keepalived配置文件可以分为3个部分,分别为全局配置、VRRP配置和虚拟服务配置。各部分的常用配置关键字及其功能如下。
- (1)全局配置
Keepalived全局配置关键字实现邮件告警的SMTP配置及自身VRRP路由相关的全局配置,配置关键字如表所示。
配置样例如下:
global_defs{notification_email{monitor@nginxbar.org# 接收邮件的邮箱为monitor@nginxbar.org}smtp_server smtp.nginxbar.org# SMTP服务器地址为smtp.nginxbar.orgsmtp_connect_timeout30# SMTP服务器连接超时时间为30秒router_id LVS_Nginx1# 当前设备路由ID为LVS_Nginx1}- (2)VRRP配置
Keepalived的VRRP配置关键字用于创建VRRP路由器,并为其配置运行参数。配置文件中可以创建多个不同名称的VRRP路由器实例,每个VRRP路由器实例都需要通过设定虚拟路由ID加入虚拟路由器中。VRRP路由器接收组播的VRRP通告,并根据VRRP通告切换自身状态。当切换状态时会触发配置中对应状态的shell脚本,并根据配置参数判断是否发送告警邮件。VRRP配置关键字如表所示。
配置样例如下:
VRRP本身是通过VRRP通告机制实现路由器状态切换判断的,但在实际的应用场景中会存在因网络抖动等原因影响VRRP的通告传递的情况,为提高状态切换的准确性,Keepalived还提供了一种脚本检测机制,可以让用户通过自定义脚本更精准地进行路由状态切换。相关配置关键字如表所示。vrrp_instance VI_1{state MASTER# 初始路由状态为MASTERinterface eth0# VRRP绑定接口为eth0virtual_router_id51# 虚拟路由器的VRID为51priority100# 当前设备的优先级是100nopreempt# 不参与MASTER的选举advert_int5# VRRP组播的间隔时间是5秒authentication{auth_type PASS# 认证类型为PASSauth_pass2222# 认证密码为2222}virtual_ipaddress{192.168.2.155# 虚拟服务器的VIP是192.168.2.155}}
Keepalived通过VRRP通告判断虚拟路由器中其他VRRP路由状态并确保路由的转移,对于业务层的高可用,则需要用户单独对应用进程进行同步检测。例如,Nginx与Keepalived部署在同一台设备上,可以通过脚本检测Nginx进程的状态,如果Nginx检测失败并无法自动恢复,则降低VRRP的优先级。要尽量避免在切换为MASTER状态时,因自身业务层故障导致业务高可用切换失败。也可用多个脚本组合实现VRRP路由优先级的动态调整。配置样例如下:
检测脚本内容如下:vrrp_script checknginx{script"/opt/data/scripts/checknginx.sh"interval3# 检测脚本执行时间间隔weight-20# 当检测失败时,VRRP路由优先级降低20rise3# 连续监测3次成功才确认为成功fall3# 连续监测3次失败才确认为失败}#!/bin/bash# 检测脚本查询Nginx进程是否存在,若存在则返回0,若检测失败则返回1check=`psaux|grep-vgrep|grepnginx|wc-l`if[$check>0];thenexit0elsesystemctl start nginxexit1fi - (3)虚拟服务器配置
Keepalived的虚拟服务器是负载均衡的外部访问点,通过配置关键字实现对LVS运行参数的配置,配置文件中可以为VIP绑定不同的端口创建多个虚拟服务器。虚拟服务器配置关键字如表所示。
真实服务器相关关键字如表所示。
通过Keepalived为真实服务器配置关键字不仅可以实现LVS真实服务器的运行参数配置,还可以对自身增加的真实服务器的主动健康检测进行配置。真实服务器健康检测配置关键字如表所示。
配置样例如下:
virtual_server192.168.2.15580{# 虚拟服务器IP及端口delay_loop6# 健康检测间隔时间为6slb_algo wrr# 负载均衡调度算法为加权轮询lb_kind DR# 转发模式为DRpersistence_timeout60# 保持连接的超时时间为60sprotocol TCP# 负载均衡转发协议为TCPreal_server192.168.2.10980{# 真实服务器IP及端口weight100# 真实服务器权重为100notify_down /etc/keepalived/scripts/stop.sh# 当真实服务器健康检测失败时执# 行stop.sh脚本HTTP_GET{url{path"/healthcheck"# 指定要检查的URL的路径digest bfaa324fdd71444e43eca3b7a1679a1a# 检测URL返回值的MD5计算值status_code200# 健康检测返回状态码}connect_timeout10# 连接超时时间为10snb_get_retry3# 重试3次确认失败delay_before_retry3# 失败重试的时间间隔为3s}}}# digest值的计算方法genhash-s192.168.2.109-p80-u/healthcheckKeepalived的其他配置关键字此处并未列出,更多配置关键字可以通过man命令获取。
mankeepalived.conf1.4、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负责应用层负载均衡,完成客户端请求的负载、路由分流、过滤等操作。
(1)Keepalived安装
Keepalived在CentOS 7系统下使用yum安装即可。在CentOS 7系统下,LVS已被集成到内核中,无须单独安装。yum-yinstallkeepalived systemctlenablekeepalived(2)Keepalived配置
Keepalived需要分别在两台LVS服务器上进行配置,主服务器上的Keepalived配置如下:!Configuration Fileforkeepalived global_defs{notification_email{monitor@nginxbar.org# 发生故障时发送邮件告警通知的邮箱}notification_email_from admin@nginxbar.org# 使用哪个邮箱发送smtp_server mail.nginxbar.org# 发件服务器smtp_connect_timeout30router_id LVS_01# 当前设备路由ID为LVS_01}vrrp_instance VI_1{state MASTER# 初始路由状态为MASTERinterface eth0# VRRP绑定的本地网卡接口为eth0virtual_router_id51# 虚拟路由器的VRID为51priority100# 当前设备的优先级是100advert_int5# VRRP组播的间隔时间是5sauthentication{auth_type PASS# 认证类型为PASSauth_pass2222# 认证密码为2222}virtual_ipaddress{192.168.21.155# 虚拟服务器的VIP是192.168.21.155}}virtual_server192.168.21.15580{# 虚拟服务器IP及端口delay_loop6# 健康检测间隔时间为6slb_algo wrr# 负载均衡调度算法为加权轮询lb_kind DR# 转发模式为DRpersistence_timeout60# 保持连接的超时时间为60sprotocol TCP# 负载均衡转发协议为TCPreal_server192.168.2.10880{# 真实服务器IP及端口weight100# 真实服务器权重为100notify_down /etc/keepalived/scripts/stop.sh# 当真实服务器健康检测失败时执# 行stop.sh脚本HTTP_GET{url{path"/healthcheck"# 指定要检查的URL的路径digest bfaa324fdd71444e43eca3b7a1679a1a# 检测URL返回值的MD5计算值status_code200# 健康检测返回状态码}connect_timeout10# 连接超时时间为10snb_get_retry3# 重试3次确认失败delay_before_retry3# 失败重试的时间间隔为3s}}real_server192.168.2.10980{# 真实服务器IP及端口weight100# 真实服务器权重为100notify_down /etc/keepalived/scripts/stop.sh# 当真实服务器健康检测失败时执# 行stop.sh脚本HTTP_GET{url{path"/healthcheck"# 指定要检查的URL的路径digest bfaa324fdd71444e43eca3b7a1679a1a# 检测URL返回值的MD5计算值status_code200# 健康检测返回状态码}connect_timeout10# 连接超时时间为10snb_get_retry3# 重试3次确认失败delay_before_retry3# 失败重试的时间间隔为3s}}}备份服务器上的Keepalived配置样例如下:
!Configuration Fileforkeepalived global_defs{notification_email{monitor@nginxbar.org# 发生故障时发送邮件告警通知# 的邮箱}notification_email_from admin@nginxbar.org# 使用哪个邮箱发送smtp_server mail.nginxbar.org# 发件服务器smtp_connect_timeout30router_id LVS_02# 当前设备路由ID为LVS_02,此# 处与主服务器配置不同}vrrp_instance VI_1{state BACKUP# 初始路由状态为BACKUP,此处# 与主服务器配置不同interface eth0# VRRP绑定的本地网卡接口为eth0virtual_router_id51# 虚拟路由器的VRID为51priority99# 当前设备的优先级是99,此处# 与主服务器配置不同advert_int5# VRRP组播的间隔时间是5sauthentication{auth_type PASS# 认证类型为PASSauth_pass2222# 认证密码为2222}virtual_ipaddress{192.168.21.155# 虚拟服务器的VIP是192.168.21.155}}virtual_server192.168.21.15580{# 虚拟服务器IP及端口delay_loop6# 健康检测间隔时间为6slb_algo wrr# 负载均衡调度算法为加权轮询lb_kind DR# 转发模式为DRpersistence_timeout60# 保持连接的超时时间为60sprotocol TCP# 负载均衡转发协议为TCPreal_server192.168.2.10880{# 真实服务器IP及端口weight100# 真实服务器权重为100notify_down /etc/keepalived/scripts/stop.sh# 当真实服务器健康检测失败时执# 行stop.sh脚本HTTP_GET{url{path"/healthcheck"# 指定要检查的URL的路径digest bfaa324fdd71444e43eca3b7a1679a1a# 检测URL返回值的MD5计算值status_code200# 健康检测返回状态码}connect_timeout10# 连接超时时间为10snb_get_retry3# 重试3次确认失败delay_before_retry3# 失败重试的时间间隔为3s}}real_server192.168.2.10980{# 真实服务器IP及端口weight100# 真实服务器权重为100notify_down /etc/keepalived/scripts/stop.sh# 当真实服务器健康检测失败时执# 行stop.sh脚本HTTP_GET{url{path"/healthcheck"# 指定要检查的URL的路径digest bfaa324fdd71444e43eca3b7a1679a1a# 检测URL返回值的MD5计算值status_code200# 健康检测返回状态码}connect_timeout10# 连接超时时间为10snb_get_retry3# 重试3次确认失败delay_before_retry3# 失败重试的时间间隔为3s}}}至此,高可用的LVS负载均衡就配置完成了。当主LVS服务器出现故障时,备份LVS服务器可以快速接管传输层网络数据的负载均衡工作,将数据包分发给后端的Nginx服务器集群。