实现基于 Keepalived 和 Nginx 的高可用架构

2023-12-21 01:53:06

前言

在现代互联网架构中,高可用性是至关重要的。Nginx是一款高性能的Web服务器,而Keepalived是一种在Linux系统上提供高可用性的解决方案。本文将介绍如何结合这两者,构建一个高可用的Nginx集群,确保系统在主服务器故障时能够无缝切换到备份服务器,从而保证服务的连续性和稳定性。

1 高可用性简介

在当今计算机系统中,高可用性是一项至关重要的特性。它代表着系统或组件在面对各种故障和异常情况时,仍能够保持持续可用的能力。通过利用多台服务器和冗余组件,构建高可用性架构旨在降低单点故障的风险,确保系统能够持续稳定地运行。这种设计理念和实践对于确保用户体验和服务连续性至关重要,特别是在对服务可靠性要求极高的应用场景下。

在这里插入图片描述

2 准备服务器和软件

  • 两台Nginx服务器
  • 两个Tomcat服务器
  • 一个虚拟IP

在两台CentOS 7虚拟机服务器上安装Nginx,并确保防火墙已开放默认的80端口。

安装Keepalived并检查安装情况:

yum install keepalived -y
rpm -q -a keepalived

3 高可用的配置(主从配置)

Keepalived的配置文件位于 /etc/keepalived/keepalived.conf。还需编写用于检测Nginx的脚本文件 /usr/local/src/nginx_check.sh

3.1 配置/etc/keepalived/keepalived.conf文件

global_defs {
    notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
    }
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 192.168.17.129
    smtp_connect_timeout 30
    router_id LVS_DEVEL
}

vrrp_script chk_http_port {
    script "/usr/local/src/nginx_check.sh"
    interval 2	#(检测脚本执行的间隔)
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP	# 备份服务器上将 MASTER 改为 BACKUP
    interface ens33	//网卡
    virtual_router_id 51	# 主、备机的 virtual_router_id 必须相同
    priority 100	# 主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    	192.168.17.50 // VRRP H 虚拟地址
    }
}

这份 Keepalived 的配置文件中包含了几个重要的部分:

  • global_defs(全局定义):

    • notification_email 部分列出了故障通知邮件的接收地址。
    • notification_email_from 指定了故障通知邮件的发件人地址。
    • smtp_server 设置了用于发送邮件的 SMTP 服务器地址。
    • smtp_connect_timeout 设置了与 SMTP 服务器建立连接的超时时间。
    • router_id 给出了 Keepalived 路由器的标识。
  • vrrp_script(VRRP 脚本):
    - chk_http_port 定义了一个 VRRP 脚本,指定了用于检测 HTTP 端口可用性的脚本文件路径。
    - interval 规定了检测脚本执行的时间间隔。
    - weight 给出了脚本执行的权重。

  • vrrp_instance(VRRP 实例):
    - VI_1 是一个 VRRP 实例的名称。
    - state 设置了该实例所在服务器的状态,这里是备份状态。
    - interface 指定了 VRRP 实例所在的网卡。
    - virtual_router_id 用于唯一标识一个 VRRP 实例,需要与其他节点相同。
    - priority 规定了实例的优先级,备份服务器的优先级一般设置为较小的值。
    - advert_int 设置了 VRRP 广播间隔。
    - authentication 部分指定了认证类型和密码。
    - virtual_ipaddress 列出了虚拟 IP 地址,这个地址会在主服务器故障时切换到备份服务器。

这个配置文件的作用是确保在主服务器发生故障时,备份服务器能够接管并使用虚拟 IP 地址继续提供服务,保证系统的高可用性。

3.2 配置/usr/local/src/nginx_check.sh脚本文件

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived
fi
fi

这段 Bash 脚本的作用是检测 Nginx 进程是否在运行。脚本执行的步骤如下:

  • 使用 ps 命令检查是否有 Nginx 进程在运行,并将结果赋值给变量 A
  • 如果没有发现 Nginx 进程(即 $A 等于 0),则尝试启动 Nginx。
  • 给 Nginx 启动一定的时间(2秒)来确保它能够完全启动。
  • 再次检查是否成功启动了 Nginx,如果仍然没有发现 Nginx 进程,则执行 killall keepalived 命令,强制关闭 Keepalived 服务。

总体来说,这段脚本用于监测并确保 Nginx 进程的运行。如果发现 Nginx 进程不存在,它会尝试重启 Nginx 并检查是否启动成功,若依然无法启动,则会强制关闭 Keepalived 服务。这样的脚本通常用于保证在 Nginx 出现故障时及时处理,以维护系统的稳定性和可用性。

4 启动软件

在启动 Nginx 之前,首先需要进入 Nginx 的安装目录,通常位于 /usr/local/nginx/ 或者自定义的安装路径。接着运行 ./nginx 命令来启动 Nginx 服务。这个命令将启动 Nginx 并开始监听来自客户端的请求,使其能够响应和处理网页访问等相关请求。

启动 Keepalived 的步骤可能涉及不同系统和发行版的差异,一种通用的方式是使用 systemctl start keepalived.service 命令。这个命令会调用系统服务管理器(如 Systemd),启动 Keepalived 服务。Keepalived 在运行中负责监测系统状态并确保在主服务器故障时实现自动故障转移,保证服务的高可用性。

这些步骤的正确执行能够确保 Nginx 和 Keepalived 正常运行,并为系统提供了高可用性保障,即使在出现主服务器故障时也能保持服务的连续性。

5 测试

当输入虚拟 IP 地址进行访问时,若能够正常访问,则表明虚拟 IP 地址的绑定是成功的。这种情况下,系统会将请求定向到正在提供服务的服务器上。这种无缝切换保证了在主服务器故障时,备份服务器可以接管并继续提供服务。

停止主服务器中的 Nginx 和 Keepalived 服务后,再次使用虚拟 IP 地址进行访问。如果依然能够正常访问,这表示备份服务器已经成功地接管了服务。在备份服务器上,可以通过执行 ip a 命令查看网络接口信息,其中会显示已绑定的虚拟 IP 地址,确认备份服务器已经接管了虚拟 IP 地址并正在处理来自客户端的请求。

这种测试能够验证整个高可用性方案的有效性,确保在主服务器出现故障时,备份服务器能够顺利接管服务并保持系统的稳定运行。

结语

融合了 Nginx 和 Keepalived 的高可用解决方案为系统带来了强大的故障转移能力。这种架构不仅能够确保服务的连续性,还能有效地应对单点故障。当主服务器遭遇问题时,Keepalived 可以迅速地将流量转移到备份服务器,实现了无缝的故障转移,用户几乎感知不到服务中断的情况。这种高可用性解决方案不仅提高了系统的稳定性,也为应对突发状况提供了可靠的应急措施。这种架构设计在保障持续性服务方面扮演着关键角色,对于那些对服务可靠性要求极高的应用场景尤为重要。

文章来源:https://blog.csdn.net/cooldream2009/article/details/135076314
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。