目 录CONTENT

文章目录

Nginx实现高可用

简中仙
2022-09-07 / 0 评论 / 0 点赞 / 108 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2023-10-07,若内容或图片失效,请留言反馈。 本文如有错误或者侵权的地方,欢迎您批评指正!

nginx高可用实现方案一般采用LVS+Keepalived+Nginx,它是一个高性能的服务器高可用或者热备解决方案,利用LVS做负载均衡器,同时利用Keepalived保证其高可用,基于LVS的DR模式构建Nginx集群。

1、LVS

LVS(Linux Virtual Server)是一个开源的负载均衡项目,是国内最早出现的开源项目之一,目前已被集成到Linux内核模块中。该项目在Linux内核中实现了基于TCP层的IP数据负载均衡分发,其工作在内核空间且仅做负载均衡分发处理,所以稳定性相对较好,性能相对较强,对内存及CPU资源的消耗也最低。

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包处理、负载均衡算法、系统配置管理及网络链表处理等功能
ipvsadmIPVS的管理器,工作于用户空间,负责IPVS运行规则的配置

LVS转发模式

转发模式说明
NAT该模式需要真实服务器的网关指向DS,客户端的请求包和返回包都要经过DS,该模式对DS的硬件性能的要求相对较高。
TUN该模式是将客户端的请求包通过IPIP方式封装后分发给真实服务器,客户端的返回包则由真实服务器的本地路由自行处理,源IP地址还是VIP地址(真实服务器需要在本地回环接口配置VIP)。因DS只负责请求包转发,其处理性能比NAT模式要高,但需要真实服务器支持IPIP协议
DR该模式是将客户端的请求包通过修改MAC地址为真实服务器的MAC地址后将数据包分发给真实服务器,客户端的返回包则由真实服务器的本地路由自行处理,源IP地址还是VIP地址(真实服务器需要在本地回环接口配置VIP)。因DS只负责请求包转发,且与真实服务器间进行基于二层的数据分发,所以处理性能最高,但要求DS与真实服务器在同一MAC广播域内

LVS负载均衡算法及其功能介绍

算法名称英文名称配置简称功能说明
轮询调度Round Robinrr将请求依次循环分发给负载的真实服务器
加权轮询调度Weight Round Robinwrr按照配置的权重比例将请求分发给真实服务器,权重越高,分配的请求越多
目标地址散列调度Destination Hashingdh该算法将目标地址作为散列键(Hash Key),从散列表中找出对应的真实服务器进行请求分发
源地址散列调度Source Hashingsh该算法根据源地址作为散列键(Hash Key)从散列表中找出对应的真实服务器进行请求分发
最小连接调度Least Connectionslc将新的请求分发给当前连接数最小的服务器,其通过每个真实服务器当前连接数进行统计判断
加权最小连接调度Weight Least Connec-tionswlc按照配置的权重,将新请求分发给当前连接数最小的服务器
最短延迟调度Shortest Expected Delaysed该算法在WLC算法的基础上增加了基于活动连接的筛选算法,并把请求分发给算法值最小的真实服务器,该算法避免了WLC算法中权重小的空闲服务器无法被分发到连接的情况
最少队列调度Never Queuenq若有真实服务器的连接数为空,直接分发请求给该真实服务器,如果所有服务器都处于有连接状态,则使用SED算法进行调度
基于局部的最少连接Locality-Based Least ConnectionsIblc该算法将目标地址相同的请求尽可能地分发到上次被分发的真实服务器,真实服务器若超载或不可用则使用最少连接算法进行分发。该方法常用在真实服务器为缓存服务器时,以提高缓存的命中率
带复制的基于局部性的最少连接Locality-Based Least Con-nections with Replicationlblcr该算法维护一组被分发相同目标地址请求的真实服务器列表,按照最小连接算法创建和添加组成员,并在一定条件下将组内最繁忙的成员移除。目标地址相同的请求将被分发到该列表中最少连接的成员。该方法常用在真实服务器为缓存服务器时,以提高缓存的命中率

2、Keepalived

Keepalived是一款用C语言编写的开源路由软件,目前仍处于活跃开发的状态,其主要目标是基于Linux系统提供一款配置简单且功能强大的负载均衡和高可用的软件应用。负载均衡是基于LVS(IPVS)实现的,Keepalived在LVS的基础上增加了多种主动健康检测机制,可以根据后端真实服务器的运行状态,自动对虚拟服务器负载的真实服务器进行维护和管理。高可用性是通过虚拟冗余路由协议(VirtualReduntant Routing Protocol,VRRP)实现的。VRRP是工作在网络层的一种路由容错协议,通过组播的通告机制进行网络路由快速转移,以实现网络设备的高可用。

配置关键字

全局配置

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 
}

VRRP配置

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 
    } 
}

如果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

虚拟服务器配置

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 
        } 
    } 
}

3、LVS+Keepalived+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安装

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 
        } 
    } 
}
0

评论区