ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Nginx应用与运维——Nginx集群负载与配置管理(一)

Nginx应用与运维——Nginx集群负载与配置管理(一) 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的管理器ipvsadm1.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的管理器ipvsadmipvsadm 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)其他常用命令参数其他常用命令参数格式如下# 查看IPVS配置ipvsadm-ln更多命令参数可以通过man命令查看。manipvsadm1.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{monitornginxbar.org# 接收邮件的邮箱为monitornginxbar.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_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}}VRRP本身是通过VRRP通告机制实现路由器状态切换判断的但在实际的应用场景中会存在因网络抖动等原因影响VRRP的通告传递的情况为提高状态切换的准确性Keepalived还提供了一种脚本检测机制可以让用户通过自定义脚本更精准地进行路由状态切换。相关配置关键字如表所示。Keepalived通过VRRP通告判断虚拟路由器中其他VRRP路由状态并确保路由的转移对于业务层的高可用则需要用户单独对应用进程进行同步检测。例如Nginx与Keepalived部署在同一台设备上可以通过脚本检测Nginx进程的状态如果Nginx检测失败并无法自动恢复则降低VRRP的优先级。要尽量避免在切换为MASTER状态时因自身业务层故障导致业务高可用切换失败。也可用多个脚本组合实现VRRP路由优先级的动态调整。配置样例如下vrrp_script checknginx{script/opt/data/scripts/checknginx.shinterval3# 检测脚本执行时间间隔weight-20# 当检测失败时VRRP路由优先级降低20rise3# 连续监测3次成功才确认为成功fall3# 连续监测3次失败才确认为失败}检测脚本内容如下#!/bin/bash# 检测脚本查询Nginx进程是否存在若存在则返回0若检测失败则返回1checkpsaux|grep-vgrep|grepnginx|wc-lif[$check0];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{monitornginxbar.org# 发生故障时发送邮件告警通知的邮箱}notification_email_from adminnginxbar.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{monitornginxbar.org# 发生故障时发送邮件告警通知# 的邮箱}notification_email_from adminnginxbar.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服务器集群。
返回列表