Keepalived + Nginx 主备容灾方案介绍

Keepalived + Nginx 主备容灾方案介绍

服务器 IP地址 角色
Srv01 192.168.249.100 VIP: 192.168.249.110 Nginx+Keepalive
Srv02 192.168.249.101 Nginx+Keepalive

概述

Keepalived 和 Nginx 的组合是一个常见的高可用性(HA)方案,尤其适用于 Web 服务。通过 Keepalived 实现的虚拟 IP 地址(VIP)在主从服务器之间的切换,可以确保当主服务器(Master)出现故障时,从服务器(Backup)能够迅速接管服务,从而达到业务的高可用性和容灾目的。

方案架构

  • 主服务器(Srv01):

    • IP 地址:192.168.249.100
    • VIP 地址:192.168.249.110
    • 角色:Nginx + Keepalived(Master)
  • 备服务器(Srv02):

    • IP 地址:192.168.249.101
    • 角色:Nginx + Keepalived(Backup)

关键组件

  1. Nginx Nginx 作为一个高性能的反向代理服务器,可以处理大量的 HTTP 请求。它在这个架构中负责处理客户端的请求,并将其转发到后端的应用服务器。
  2. Keepalived Keepalived 是一个用于实现高可用性和故障转移的服务。它通过 VRRP(虚拟路由冗余协议)来管理虚拟 IP 地址,并检测主服务器的健康状态。一旦检测到主服务器出现故障,Keepalived 会自动将 VIP 切换到备服务器上。

工作流程

  1. 正常运行状态:

    • 在正常情况下,VIP 地址(192.168.249.110)绑定在主服务器(Srv01)上。
    • 客户端请求通过 VIP 地址到达 Srv01,Nginx 处理这些请求。
  2. 故障切换:

    • 如果 Keepalived 检测到 Srv01 不可用(例如由于硬件故障或网络问题),它会自动将 VIP 地址切换到备服务器(Srv02)。
    • Srv02 上的 Nginx 接管请求,确保服务不中断。
  3. 恢复:

    • 当 Srv01 恢复正常运行时,Keepalived 可以将 VIP 地址切回 Srv01,或者继续由 Srv02 处理请求,视配置而定。

Nginx 配置 Nginx 的配置通常不会因为 Keepalived 而有所不同,但是你可以配置一个简单的 HTTP 服务来测试高可用性。

测试步骤

  • 确保两台服务器上 Nginx 和 Keepalived 均正常启动。
  • 通过 VIP 地址(192.168.249.110)访问 Web 服务,确认能够正常访问。
  • 模拟主服务器(Srv01)故障,观察 VIP 地址是否切换到备服务器(Srv02),并继续访问 Web 服务,确认服务不中断。

结论 这种主备架构提供了一个简单而有效的高可用性方案,适用于对服务可靠性有较高要求的场景。在实际生产环境中,还可以进一步优化配置,如使用更复杂的健康检查脚本、设置自动恢复策略等。

Server01,Server02前期配置

禁用 SELinux

  1. 编辑 SELinux 配置文件:

    arduino 复制代码
    vim /etc/selinux/config
  2. 找到 SELINUX=enforcing 并将其改为 SELINUX=disabled

    ini 复制代码
    SELINUX=disabled
  3. 保存并退出,然后重启系统以使更改生效:

    reboot
    

清除 iptables 规则

  1. 清除所有 iptables 规则:

    r 复制代码
     iptables -F
     iptables -X
     iptables -t nat -F
     iptables -t nat -X
     iptables -t mangle -F
     iptables -t mangle -X
     iptables -t raw -F
     iptables -t raw -X
  2. 保存规则以确保重启后仍保持清除状态:

     service iptables save
    

关闭防火墙

  1. 停止防火墙服务:
arduino 复制代码
 systemctl stop firewalld
  1. 禁用防火墙开机自启:
bash 复制代码
 systemctl disable firewalld
  1. 查看防火墙状态:
lua 复制代码
 systemctl status firewalld

各个节点时间同步,启用时间同步服务

  1. 确保安装了 chrony

     yum install chrony -y
    
  2. 启动并启用 chronyd 服务:

    bash 复制代码
     systemctl start chronyd
     systemctl enable chronyd
  3. 查看 chronyd 服务状态:

  1. 检查时间同步状态:

    chronyc tracking

启用多播功能

首先,确保网络接口启用了多播功能。

检查多播设置

使用以下命令检查多播是否启用:

bash 复制代码
ip link show ens33

如果输出中没有 MULTICAST 标志,则需要启用多播。

启用多播

使用以下命令启用多播:

bash 复制代码
ip link set ens33 multicast on

Server01,Server02安装 Nginx

添加 Nginx 仓库

首先,添加官方 Nginx 仓库:

arduino 复制代码
 yum install -y epel-release

安装 Nginx

 yum install nginx -y

启动 Nginx 服务

启动并启用 Nginx 服务:

bash 复制代码
 systemctl start nginx
 systemctl enable nginx

检查 Nginx 状态

检查 Nginx 服务状态:

lua 复制代码
 systemctl status nginx

安装配置Keepalived集群

所有节点安装 keepalived

yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
yum install -y keepalived

配置 keepalived

主节点(Server01)配置

  1. 编辑 keepalived 配置文件:

    bash 复制代码
     vi /etc/keepalived/keepalived.conf
  2. 检测脚本chknginx.sh

    bash 复制代码
    #!/bin/bash
     
    #检测nginx是否正常运行
    if /usr/sbin/pidof nginx  &>/dev/null ;then
        exit 0
    else
        exit 1
    fi
    ​
    ​
    ​

    这个脚本的主要功能是检测 Nginx 服务是否正常运行,并通过返回状态码来指示检测结果。以下是对脚本各部分的详细介绍:

    脚本解析
    bash 复制代码
    #!/bin/bash
    • #!/bin/bash : 这是一个 shebang 行,用于指定解释器的路径。在这个例子中,脚本将使用 /bin/bash 作为解释器来执行。
    bash 复制代码
    #检测nginx是否正常运行
    • 注释行 : 以 # 开头的行是注释,不会被脚本执行。在这里,它说明了脚本的目的,即检测 Nginx 是否正常运行。
    bash 复制代码
    if /usr/sbin/pidof nginx  &>/dev/null ;then
        exit 0
    else
        exit 1
    fi
    • /usr/sbin/pidof nginx:

      • pidof 是一个 Linux 命令,用于查找指定程序的进程 ID (PID)。在这个例子中,它查找的是 nginx 进程。
      • 如果 nginx 正在运行,那么 pidof 会返回一个或多个进程 ID。
    • &>/dev/null:

      • 这是一个重定向操作符,表示将标准输出 (stdout) 和标准错误 (stderr) 都重定向到 /dev/null,即忽略输出。
      • 这意味着无论 pidof 返回什么信息,都不会在终端上显示出来。
    • if 语句:

      • if /usr/sbin/pidof nginx &>/dev/null ;then:这个语句用于检查 pidof nginx 命令的返回值。
      • 如果 pidof 成功找到 nginx 进程(返回值为 0),则执行 then 块中的命令(即 exit 0)。
      • 如果 pidof 没有找到 nginx 进程(返回值为非 0),则执行 else 块中的命令(即 exit 1)。
    • exit 0:

      • exit 命令用于终止脚本的执行,并返回一个状态码。
      • exit 0 表示脚本成功执行,意味着 Nginx 正在运行。
    • exit 1:

      • exit 1 表示脚本执行失败,意味着 Nginx 未运行。
    • fi:

      • fi 用于结束 if 语句块。
    脚本的作用

    这个脚本的作用是检查 Nginx 服务是否正在运行。它通过 pidof 查找 Nginx 进程,如果找到,则返回状态码 0,表示正常运行;如果找不到,则返回状态码 1,表示 Nginx 未运行或已经停止。

    使用场景
    1. Keepalived 健康检查: 在 Keepalived 的配置中,这个脚本可以用作健康检查脚本。Keepalived 定期运行这个脚本,并根据返回值决定是否将 VIP 切换到另一台服务器。

    2. 自动化监控: 这个脚本可以集成到自动化监控系统中,用于检测 Nginx 的健康状况。如果 Nginx 停止运行,监控系统可以触发报警或尝试重新启动服务。

    3. 定期巡检: 在定期的服务器健康检查中,这个脚本可以帮助管理员快速验证 Nginx 是否处于运行状态。

  3. 配置文件内容示例:

    perl 复制代码
    global_defs {
      router_id lvs-nginx01
    }
    vrrp_script chknginx 
    {
      script "/etc/keepalived/chknginx.sh"
      interval 1
      weight -30         
    }
    vrrp_instance VI_1 {
        state MASTER
        interface ens33  # 使用的网络接口
        virtual_router_id 51
        priority 100  # 备份节点优先级应低于主节点
        advert_int 1
    ​
        authentication {
            auth_type PASS
            auth_pass 1111  # 认证密码,确保主备节点一致
        }
    ​
        virtual_ipaddress {
            192.168.249.110  # 虚拟IP地址
        }
       track_script {
            chknginx
      }
    }
    ​
    ​
    ​

这个配置文件是 Keepalived 的配置示例,配置文件定义了使用 VRRP(虚拟路由冗余协议)来管理高可用性的设置。在这个示例中,Keepalived 被配置为与 Nginx 一起使用,以确保 Nginx 服务的高可用性。以下是对配置文件各部分的详细介绍。

配置文件解析
global_defs
global_defs {
  router_id lvs-nginx01
}
  • global_defs:这是 Keepalived 的全局配置块。

  • router_id lvs-nginx01

    • router_id 用于标识运行 Keepalived 的路由器或服务器的唯一标识符。
    • lvs-nginx01 是一个自定义名称,用来唯一标识这台服务器在 VRRP 集群中的身份。
vrrp_script
sql 复制代码
vrrp_script chknginx 
{
  script "/etc/keepalived/chknginx.sh"
  interval 1
  weight -30         
}
  • vrrp_script chknginx :定义了一个 VRRP 跟踪脚本,名字为 chknginx

  • script "/etc/keepalived/chknginx.sh"

    • 指定要执行的脚本路径。在这个示例中,/etc/keepalived/chknginx.sh 是用于检测 Nginx 服务是否运行的脚本。
    • 这个脚本的返回值将影响 Keepalived 的行为。
  • interval 1

    • 设置脚本的执行间隔时间,单位为秒。在这里,Keepalived 每 1 秒执行一次该脚本。
  • weight -30

    • weight 表示优先级的增量或减量。如果脚本检测失败,Keepalived 会减少 30 点的优先级。这种配置可以确保主服务器在 Nginx 服务失败时降低其优先级,从而让备服务器接管。
vrrp_instance
kotlin 复制代码
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
​
    authentication {
        auth_type PASS
        auth_pass 1111
    }
​
    virtual_ipaddress {
        192.168.249.110
    }
   track_script {
        chknginx
  }
}
  • vrrp_instance VI_1

    • 定义了一个 VRRP 实例,名称为 VI_1。该实例负责管理虚拟 IP 地址的分配。
  • state MASTER

    • 定义了当前节点的状态为 MASTER。在主备模式下,MASTER 节点是默认持有虚拟 IP 地址的节点。
  • interface ens33

    • 指定用于 VRRP 通信的网络接口。在这个示例中,ens33 是该服务器的网络接口名。
  • virtual_router_id 51

    • virtual_router_id 是一个标识 VRRP 路由器实例的 ID。该值在主备节点间必须一致。
  • priority 100

    • 定义该节点的优先级。优先级数值越高,该节点越有可能成为 MASTER。在主备模式中,主节点通常设置较高的优先级(这里为 100),备节点优先级应低一些。
  • advert_int 1

    • advert_int 是 VRRP 广播间隔时间,单位为秒。这里设置为每秒发送一次 VRRP 广播包。
  • authentication

    • auth_type PASS:指定认证方式为简单密码验证。
    • auth_pass 1111:指定密码为 1111。这个密码必须在主备节点间保持一致,以确保安全通信。
  • virtual_ipaddress

    • 192.168.249.110:定义了虚拟 IP 地址(VIP),该 IP 地址将在 MASTER 节点和 BACKUP 节点之间进行切换。客户端通过访问这个 VIP 来获得服务。
  • track_script

    • chknginx:指定跟踪脚本为上面定义的 chknginx。如果该脚本检测到 Nginx 服务不可用,Keepalived 会降低当前节点的优先级,触发故障转移。
工作原理
  • 正常情况下 : 在 MASTER 节点正常运行时,它持有虚拟 IP 地址,并处理所有客户端请求。如果 chknginx.sh 脚本检测到 Nginx 正常运行,MASTER 节点将继续保持现状。
  • Nginx 服务异常时 : 如果 chknginx.sh 脚本检测到 Nginx 服务未运行,Keepalived 会根据 weight -30 的设置降低当前节点的优先级。假设优先级降低后低于备节点,则备节点将接管 VIP,成为新的 MASTER,从而保证服务的持续可用性。
使用场景
  • 高可用性 Nginx 集群: 该配置适用于需要高可用性的 Nginx 服务器集群,通过 Keepalived 实现主备故障切换,确保在主服务器出现问题时,备服务器可以快速接管,避免服务中断。
  • 关键业务系统: 在金融、医疗、电子商务等对业务连续性要求极高的场景中,这种高可用性架构能够显著提升系统的可靠性。

备份节点(Server02)配置

  1. 编辑 keepalived 配置文件:

    bash 复制代码
     vi /etc/keepalived/keepalived.conf
  2. 配置文件内容示例:

    perl 复制代码
    global_defs {
      router_id lvs-nginx02
    }
    vrrp_script chknginx 
    {
      script "/etc/keepalived/chknginx.sh"
     interval 1
     weight -30         
    }
    vrrp_instance VI_1 {
        state BACKUP
        interface ens33  # 使用的网络接口
        virtual_router_id 51
        priority 90  # 备份节点优先级应低于主节点
        advert_int 1
    ​
        authentication {
           auth_type PASS
           auth_pass 1111  # 认证密码,确保主备节点一致
        }
    ​
        virtual_ipaddress {
            192.168.249.110  # 虚拟IP地址
        }
        track_script {
            chknginx
       }
    }
    ​
    ​
    ​
    1. 检测脚本chknginx.sh
bash 复制代码
#!/bin/bash
 
#检测nginx是否正常运行
if /usr/sbin/pidof nginx  &>/dev/null ;then
    exit 0
else
    exit 1
fi
​

启动 keepalived 服务

在所有节点上启动并启用 keepalived 服务:

bash 复制代码
 systemctl start keepalived
 systemctl enable keepalived

验证配置

在所有节点上检查 keepalived 服务状态:

lua 复制代码
 systemctl status keepalived

可以通过以下命令查看虚拟IP地址是否已经分配:

sql 复制代码
ip addr show
相关推荐
也无晴也无风雨36 分钟前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
2401_857610034 小时前
多维视角下的知识管理:Spring Boot应用
java·spring boot·后端
代码小鑫4 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计
颜淡慕潇5 小时前
【K8S问题系列 | 9】如何监控集群CPU使用率并设置告警?
后端·云原生·容器·kubernetes·问题解决
独泪了无痕6 小时前
WebStorm 如何调试 Vue 项目
后端·webstorm
怒放吧德德7 小时前
JUC从实战到源码:JMM总得认识一下吧
java·jvm·后端
代码小鑫7 小时前
A025-基于SpringBoot的售楼管理系统的设计与实现
java·开发语言·spring boot·后端·毕业设计
前端SkyRain7 小时前
后端SpringBoot学习项目-项目基础搭建
spring boot·后端·学习
梦想画家7 小时前
理解Rust 生命周期、所有权和借用机制
开发语言·后端·rust
编程乐趣8 小时前
推荐一个.NetCore开源的CMS项目,功能强大、扩展性强、支持插件的系统!
后端