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

2023-12-19

前言

在现代互联网架构中,高可用性是至关重要的。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 可以迅速地将流量转移到备份服务器,实现了无缝的故障转移,用户几乎感知不到服务中断的情况。这种高可用性解决方案不仅提高了系统的稳定性,也为应对突发状况提供了可靠的应急措施。这种架构设计在保障持续性服务方面扮演着关键角色,对于那些对服务可靠性要求极高的应用场景尤为重要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现基于 Keepalived 和 Nginx 的高可用架构 的相关文章

  • X-FRAME-OPTIONS: DENY 通过 nginx 来自 Django 站点在哪里?

    我的 Django 网站使用django summernote https github com summernote django summernote在 iframe 中 并抛出此错误 多个具有冲突值的 X Frame Options
  • 无法以 root 身份运行 uwsgi,“bind(): 权限被拒绝”

    我尝试使用此文档配置 uWsgi Django Nginx http uwsgi docs readthedocs org en latest tutorials Django and nginx html http uwsgi docs
  • 为什么 Nginx 以相反的顺序提供客户端 SSL DN?

    我很好奇为什么某些 Web 服务器 例如 Nginx 以相反的顺序提供客户端 SSL DN Web 应用程序将 DN 发布到 Java Web 服务 该服务尝试创建 Javajavax naming ldap LdapName http d
  • 为从 nginx 反向代理转发的请求添加唯一 id

    我们运行 nginx 作为反向代理 将请求转发到运行 Compojure 的 Clojure 应用程序 Compojure 是一个封装 Jetty 的库 为我们的应用程序提供服务 Web 请求的能力 目前 我们捕获 nginx 和 Cloj
  • Amazon ECS - 在 Docker 入口点上使用 IAM 角色时权限被拒绝

    我正在寻找一种将机密 证书注入 Amazon ECS 容器的方法 就我而言 它是一个简单的 nginx 容器 我一直在使用 AWS Parameter Store 关注这篇文章 https aws amazon com blogs comp
  • 命名 Docker 卷以共享构建而不更新

    我工作的公司的开发人员要求我用 Docker 做一些不同的事情 然后我也被使用了 目标是拥有 2 个具有以下职责的容器 容器A 节点容器将构建前端 React 应用程序并将捆绑包放入名为的目录中app dist 完成后 容器将停止运行 容器
  • 为什么在生产中得到空 CSS 文件?

    我在文件中放入了很多css文件active admin css scss Active Admin s got SASS import active admin mixins import active admin base import
  • uWSGI重启时停机

    每次当我有代码更新时重新启动服务器时 我都会遇到 uwsgi 问题 当我使用 sudo restart account 重新启动 uwsgi 时 停止和启动实例之间存在一个小间隙 导致停机并停止所有当前请求 当我尝试 sudo reload
  • 比较 nginx+Apache+mod_wsgi 与 nginx+uWSGI?

    在生产中使用 nginx Apache mod wsgi 与 nginx uWSGI vurtualenv 有何优缺点 我在自 2007 年以来开发的 mod wsgi 中看到了第一个变体的优点 并且具有更稳定的版本和易于管理 第二种变体的
  • 如何将亚马逊颁发的免费证书配置到nginx.config

    我已经安装了nginx服务器在Amazon Linux 2环境 在创建弹性负载均衡器期间 我创建了 Amazon 的免费证书 现在 我想通过以下方式访问我的服务器https port 443 我该如何配置这个SSL证书在nginx conf
  • Nginx 正在向 uWSGI 发出非常旧的请求?

    我看到一种奇怪的情况 Nginx 或 uwsgi 似乎正在建立一个很长的传入请求队列 并在客户端连接超时后很长时间内尝试处理它们 我想理解并停止这种行为 以下是更多信息 My Setup 我的服务器使用 Nginx 通过 Unix 文件套接
  • Nginx 背后的多个 Meteor 站点

    这个问题与this https stackoverflow com questions 10936242 how can i correct the meteor base url in a nginx reverse proxy conf
  • 我怎样才能重写这个nginx“if”语句?

    例如 我想这样做 if http user agent MSIE 6 0 http user agent MSIE 7 0 etc etc rewrite ROOT ROOT ancient last break 而不是这个 if http
  • 如何在位置中使用 Nginx Regexp

    Web 项目将静态内容放入 some content img 文件夹中 url规则为 img some md5 但文件夹中的位置 content img 前两位数字 Example url example com img fe5afe048
  • Http POST 删除 URL 中的端口

    我有一个用 Django 构建的网络应用程序 我目前正在家里的路由器后面的笔记本电脑上运行它 我将路由器配置为将发送到特定端口的所有流量路由到该笔记本电脑 我将 Nginx 作为 Apache 的反向代理 使用 mod wsgi 来运行 D
  • 将代码从 htaccess 重写为 nginx 配置?

    我在将 htaccess 文件中的重写代码实现到 nginx 配置中时遇到问题 我已经尝试过生成器 http winnginx com htaccess http winginx com htaccess用于生成我的重写 代码 我的ngin
  • nginx 和 uwsgi 非常大的文件上传(>3Gb)

    也许有人知道该怎么做 我正在尝试上传大于 3Gb 的文件 没问题 如果我使用以下配置上传高达 2Gb 的文件 Nginx client max body size 5g client body in file only clean clie
  • Kubernetes Ingress 在 nginx 反向代理后面运行

    我已经在可以从互联网访问的服务器上安装了 minikube 我创建了一个可用的 kubernetes 服务 gt kubectl get service myservice NAME CLUSTER IP EXTERNAL IP PORT
  • Nginx 是否也缓冲来自客户端的 http 请求?

    我知道 Nginx 可以缓冲来自上游服务器的响应 我的问题是 Nginx 是否也缓冲来自客户端的 http 请求 我的意思是 如果 Nginx 从客户端收到 http 请求 它是否立即与上游服务器建立连接 或者它会在收到整个http请求后创
  • 在 docker 中将 pgadmin 连接到 postgres

    我有一个docker compose与服务文件python nginx postgres and pgadmin services postgres image postgres 9 6 env file env volumes postg

随机推荐