Nginx + Keepalived 高可用集群

一、Nginx+Keepalived 原理

1.1.Nginx 负载均衡机制

Nginx 是一款轻量级且高性能的 Web 服务器和反向代理服务器,在负载均衡方面有着卓越的表现。其具备强大的七层流量管理能力,能够基于 URL、Cookie、HTTP 头信息等对请求进行精准路由。例如,在一个电商网站中,可将以 /product 开头的 URL 请求路由到商品展示服务器组,以 /cart 开头的请求路由到购物车处理服务器组,实现不同业务模块的分离处理,提高系统的可维护性和性能。

Nginx 提供了多种负载均衡算法,常见的有轮询、加权轮询、IP 哈希等。轮询算法会依次将请求分配到后端服务器,保证每个服务器都能均匀地接收请求;加权轮询则可以根据服务器的性能为其分配不同的权重,性能高的服务器分配更多的请求;IP 哈希算法会根据客户端的 IP 地址进行哈希计算,将同一客户端的请求始终分配到同一台后端服务器,适用于需要保持会话状态的场景,如在线游戏。

在健康检查方面,Nginx 支持被动检测和主动检测两种方式。被动检测是指当与后端服务器的连接失败时,会进行重试,达到一定次数后将该服务器标记为不可用;主动检测则可以通过第三方模块实现,定期向后端服务器发送健康检查请求,根据响应结果判断服务器的状态。

1.2.Keepalived 高可用原理

Keepalived 基于 VRRP(虚拟路由器冗余协议)实现高可用性。VRRP 协议允许将多台路由器组成一个虚拟路由器,其中有一个主路由器和多个备份路由器。主路由器承担实际的路由工作,当主路由器出现故障时,备份路由器会根据优先级选举出新的主路由器,从而实现无缝切换。

Keepalived 通过优先级管理来确定主备节点。每个节点都有一个优先级,优先级高的节点成为主节点。Keepalived 会定期对节点进行健康检查,根据检查结果动态调整节点的优先级。例如,当主节点的某个服务出现故障时,其优先级会降低,备份节点的优先级相对较高,就会接管主节点的工作。

VIP(虚拟 IP)漂移是 Keepalived 实现高可用性的关键机制。当主节点发生故障时,Keepalived 会自动将虚拟 IP 地址从主节点转移到备份节点,客户端无需进行任何配置更改,仍然可以通过虚拟 IP 地址访问服务,从而保证了服务的连续性。

1.3.协同工作流程

客户端通过访问虚拟 IP 地址发起请求,请求首先到达 Nginx 主节点。Nginx 根据配置的负载均衡算法将请求分发到后端的 RS(Real Server)主机。同时,Keepalived 会定期对 Nginx 服务进行健康检查,一旦发现 Nginx 服务出现异常,会将异常情况报告给 Keepalived。Keepalived 根据预设的规则,将虚拟 IP 地址从主节点漂移到备节点,备节点上的 Nginx 开始处理客户端的请求,确保服务不中断。

  


二、配置思路与步骤

2.1.环境准备

四台主机(rocky 8):

节点角色IP 地址组件
LVS 主节点192.168.67.110Keepalived + nginx
LVS 备节点192.168.67.120Keepalived + nginx
后端 RS1192.168.67.10HTTPD
后端 RS2192.168.67.20HTTPD
客户端任意 IP浏览器或测试工具

注意:

  • 实验环境所有主机关闭 firewalld 和 SElinux 。

  • 后端 RS 主机不需要配置 VIP 和 ARP 抑制。

2.2.RS 主机配置

2.2.1.配置 Web 服务

作用:安装 Web 服务是为了让后端 RS 服务器能够处理客户端的 HTTP 请求。在实际应用中,后端 RS 服务器通常是提供 Web 服务的服务器,如电商网站的商品展示页面、新闻网站的新闻内容页面等。通过安装 Web 服务,如 Apache 或 Nginx,后端 RS 服务器可以接收并处理客户端的请求,返回相应的网页内容。

(两个 RS 主机都需配置)

yum install httpd -y
echo hostname -I > /var/www/html/index.html
systemctl enable --now httpd

2.3.Nginx + Keepalived 配置

2.3.1.Nginx 配置

配置 Nginx 的目的

Nginx 作为核心负载均衡器,其配置目标是实现:

  1. 流量分发:将客户端请求按规则分配到后端服务器

  2. 健康检查:通过被动检测机制剔除故障节点

  3. 会话保持:确保同一客户端请求定向到同一服务器

安装 Nginx。

yum install nginx -y

编辑 Nginx 子配置文件。

(两台 Keepalived 主机都需配置)

upstream webserver {server 192.168.67.10:80 weight=1;server 192.168.67.20:80 weight=1;
}
​
server{listen 80;server_name www.yunjisuan.com;location / {proxy_pass http://webserver;index index.html;}
}

2.3.2.Keepalived 配置

安装 Keepalived 软件。

yum install keepalived -y

编写 Nginx 健康检查脚本。

配置健康检查脚本的目的

脚本 check_nginx.sh 实现:

  1. 主动服务监控:通过进程文件存在性检测 Nginx 状态

  2. 自动恢复机制:尝试重启故障服务

  3. 状态反馈:返回 0/1 供 Keepalived 判断节点健康状态

具体参数解释:

  • ps:Process Status(进程状态),用于列出当前系统中的进程信息。

  • -C nginx

    • -C 选项用于通过进程名筛选目标进程(区分大小写)。

    • nginx 是 Web 服务器软件的进程名,此处表示仅显示与 nginx 相关的进程。

  • --no-header

    • 隐藏输出结果的列名标题(如 PID、TTY、TIME 等),使输出更简洁。

vim /etc/keepalived/check_nginx.sh
​
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];
thensystemctl restart nginxsleep 3if [ `ps -C --no-header | wc -l` -eq 0 ]thensystemctl stop keepalivedfi      
fi  

该脚本会检查 Nginx 的进程文件是否存在,如果存在则表示 Nginx 服务正常,脚本返回 0;如果不存在,则尝试重启 Nginx 服务,等待 3 秒后再次检查,如果仍然不存在则返回 1,表示检查失败。

设置脚本可执行权限。

chmod +x /etc/keepalived/check_nginx.sh

编写 Keepalived 配置文件。

(两台 Keepalived 主机都需配置)

vim /etc/keepalived/keepalived.conf
​
! Configuration File for keepalived
​
global_defs {notification_email {2373179473@qq.com}notification_email_from keepalived@timinglee.orgsmtp_server 127.0.0.1smtp_connect_timeout 30router_id ka2.timinglee.orgvrrp_skip_check_adv_addrvrrp_garp_interval 0vrrp_gna_interval 0vrrp_mcast_group4 224.0.0.18
}
​
vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh"              # 要执行的脚本路径interval 1                                           # 脚本执行间隔(秒)weight -30                                           # 脚本执行失败时降低的优先级fall 2                                               # 连续失败次数阈值rise 2                                               # 连续成功次数阈值timeout 2                                            # 脚本执行超时时间(秒)
}
​
vrrp_instance VI_1 {state MASTER                                        # 备主机:需设置为 BACKUPinterface ens160virtual_router_id 100priority 100                                        # 备主机:需设置为 80 优先级advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.67.100/24 dev ens160 label ens160:1}unicast_src_ip 192.168.67.110                       # 备主机:设置为本机 IPunicast_peer {192.168.67.120                                  # 备主机:设置为 MASTER IP}track_script {                                      # 关联健康检查脚本check_nginx                                     # 引用前面定义的检查脚本}
}


三、测试

客户端做添加 VIP 的 hosts 解析。

vim /etc/hosts          # 在该文件最后添加以下内容
​
192.168.67.100  www.yunjisuan.com

3.1.负载均衡验证

在客户端上执行以下命令循环访问虚拟 IP 地址:

预期输出会交替显示 Server 192.168.67.10 和 Server 192.168.67.20,这表明 Nginx 的负载均衡功能正常工作,请求被均匀地分发到了两台后端服务器上。

3.2.脚本验证

停止主节点 Nginx 服务

在主节点上执行以下命令停止 Nginx 服务,脚本会自动检测并重启 Nginx 服务,如服务启动成功,则客户端访问无中断,且 VIP 也不会转移。

3.3.观察 VIP 漂移

手动配置 Nginx 服务错误配置文件,让 Nginx 服务重启不成功,观察 VIP 漂移情况。

Nginx 配置错误配置文件。

客户端循环访问,MASTER 停止 Nginx 服务。

systemctl stop nginx

观察客户端服务无中断,几秒后访问自动恢复正常。

VIP 漂移到备主机。

同样的方法,恢复 MASTER 主机的 Nginx 配置文件正常,删掉配置文件里错误的地方,重启服务,因为 Keepalived 配置的是抢占模式,所以,重启 Nginx 服务,VIP 会漂移回 MASTER,同样客户端访问无中断。


四、实验总结

4.1 学到了什么

  • 通过本次实验,我们深入掌握了 Nginx 七层负载均衡的配置方法,能够根据不同的业务需求基于 URL、Cookie、HTTP 头等信息对请求进行精确的路由,提高了系统的灵活性和可扩展性。

  • 理解了 VRRP 协议的工作原理,学会了使用 Keepalived 实现主备节点的自动切换,确保了服务在节点故障时能够快速恢复,提高了系统的可用性。

  • 学会了编写自定义的健康检查脚本,通过对 Nginx 服务状态的实时监测,能够及时发现并处理服务故障,增强了系统的稳定性和可靠性。

4.2 通过什么解决了什么问题

单点故障问题

通过采用主备架构和 VIP 漂移机制,成功解决了单点故障问题。当主节点出现故障时,Keepalived 会自动将虚拟 IP 地址漂移到备节点,备节点立即接管服务,客户端无需进行任何配置更改,仍然可以通过虚拟 IP 地址访问服务,服务中断时间控制在 15 秒以内。例如,在某企业官网的实际应用中,主节点的硬件出现故障导致 Nginx 服务停止,但由于采用了 Nginx+Keepalived 高可用集群方案,服务在短时间内切换到备节点,用户几乎没有察觉到服务的中断,保证了网站的正常访问。

流量不均问题

使用 Nginx 的加权轮询算法解决了流量不均的问题。根据后端服务器的性能为其分配不同的权重,性能高的服务器分配更多的请求,从而使各服务器的负载更加均衡,服务器负载差异控制在 8% 以内。在一个轻量级 API 服务的场景中,不同的后端服务器处理能力不同,通过为处理能力强的服务器设置较高的权重,使得请求能够更加合理地分配,提高了整个系统的处理效率。

服务不可用问题

通过主动健康检查和自动重启机制解决了服务不可用的问题。Keepalived 定期执行健康检查脚本,当发现 Nginx 服务异常时,会尝试重启 Nginx 服务。如果重启成功,则继续提供服务;如果重启失败,则将虚拟 IP 地址漂移到备节点。故障节点的恢复时间控制在 10 秒以内,确保了服务的高可用性。在某文件下载服务中,由于网络波动导致 Nginx 服务出现短暂中断,但通过健康检查和自动重启机制,服务很快恢复正常,保证了用户的下载体验。


五、拓展

5.1.Nginx+Keepalived 适用场景

5.1.1.企业官网

对于企业官网来说,稳定性和可靠性是至关重要的。Nginx+Keepalived 高可用集群可以支撑日均 10 万次的访问量,确保页面能够稳定加载。例如,某大型制造企业的官网采用了 Nginx+Keepalived 方案,在产品推广活动期间,大量用户访问官网,由于集群的高可用性和负载均衡能力,网站始终保持稳定运行,没有出现服务中断的情况,为企业的品牌形象和业务推广提供了有力保障。

5.1.2.轻量级 API 服务

在微服务架构下,Nginx 可以作为轻量级 API 服务的流量入口,实现对不同微服务的路由和负载均衡。Keepalived 则保证了 API 服务的高可用性。某互联网金融公司的微服务架构中,使用 Nginx+Keepalived 集群作为 API 网关,将用户的请求路由到不同的微服务中进行处理。当某个微服务节点出现故障时,集群能够自动将请求分发到其他正常节点,确保 API 服务的连续性,为用户提供稳定的金融服务。

5.1.3.文件下载服务

对于文件下载服务,需要保证用户的下载体验,避免因服务器故障导致下载中断。Nginx 的 IP 哈希算法可以实现会话保持,将同一用户的下载请求始终分配到同一台后端服务器上,保证下载的连续性。同时,Keepalived 的高可用性机制确保了在服务器故障时能够快速切换到备用服务器。某软件下载平台采用了 Nginx+Keepalived 方案,在高峰时段,大量用户同时进行软件下载,通过 IP 哈希算法和高可用集群,用户能够流畅地下载软件,没有出现下载中断的情况。

5.2.对比其他方案的优势

5.2.1.与 HAProxy+Keepalived 对比

Nginx+Keepalived 方案的配置复杂度较低,适合对配置要求不高、需要快速部署的场景。而 HAProxy+Keepalived 方案在七层负载均衡方面的功能更加优秀,健康检查能力也更强,但配置相对复杂。例如,对于一个小型创业公司的网站,由于技术团队规模较小,采用 Nginx+Keepalived 方案可以快速搭建高可用集群,满足网站的基本需求;而对于一个大型电商平台,对七层负载均衡和健康检查有更高的要求,则可以考虑采用 HAProxy+Keepalived 方案。

5.2.2.与 LVS+Keepalived 对比

LVS+Keepalived 方案具有内核级性能,支持百万级并发,但仅支持四层负载均衡,配置复杂。Nginx+Keepalived 方案则支持七层负载均衡,能够对 HTTP/HTTPS 请求进行更细致的处理,配置相对简单。在一个中型企业的内部业务系统中,业务逻辑相对复杂,需要对请求进行七层处理,采用 Nginx+Keepalived 方案可以更好地满足业务需求;而对于一个大型互联网数据中心,需要处理海量的网络流量,对并发性能要求极高,则可以考虑采用 LVS+Keepalived 方案。

5.2.3.与 F5 硬件对比

F5 硬件负载均衡器具有全功能支持和高可靠性,但成本高昂,且闭源难以定制。Nginx+Keepalived 方案是开源的,成本较低,并且可以根据业务需求进行定制开发。对于一些预算有限的企业,如小型电商企业,采用 Nginx+Keepalived 方案可以在保证服务可用性的同时,降低成本;而对于一些对可靠性和安全性要求极高的金融机构,可能会选择 F5 硬件负载均衡器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32984.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试提问(1)

面试提问 1.你能说一说C/C之间的区别吗?2.你能将一些你对构造函数和析构函数的认识吗?3.讲一下继承和多态4.你了解TCP/IP四层网络模型吗?5.你了解三次握手和四次挥手吗?6.讲一下进程和线程?7.你对二叉树的了解有哪些&a…

Adobe Genuine Service Alert 一直弹窗,老是一直弹窗【解决方法】

在使用Adobe系列软件时,若没有正版授权,则会出现弹窗,该弹窗是由Adobe Genuine Service软件弹出的,且该弹窗无法关闭,下文介绍如何永久关闭该弹窗。 方法一: 首先在任务栏鼠标右键打开任务管理器&#xff…

防汛应急包,快速响应,守护安全

根据中国水利部统计,自1949年以来,我国几乎每年都面临洪水威胁,其中20世纪90年代后洪涝灾害频率显著增加,仅1990-2009年间就发生超4000起较大灾害,直接经济损失近3万亿元,受灾人口达20亿人次。在2020年长江…

一文了解JVM的垃圾回收

Java堆内存结构 java堆内存是垃圾回收器管理的主要区域,也被称为GC堆。 为了方便垃圾回收,堆内存被分为新生代、老年代和永久代。 新创建的对象的内存会在新生代中分配,达到一定存活时长后会移入老年代,而永久代存储的是类的元数…

【人工智能 | 大数据】基于人工智能的大数据分析方法

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘,以提取有价值的信息和洞察。它结合了大数据技术、人工智能(AI)、机器学习(ML&a…

【C语言】编译和链接详解

hi,各位,让我们开启今日份博客~ 小编个人主页点这里~ 目录 一、翻译环境和运行环境1、翻译环境1.1预处理(预编译)1.2编译1.2.1词法分析1.2.2语法分析1.2.3语义分析 1.3汇编1.4链接 2.运行环境 一、翻译环境和运行环境 在ANSI C…

在Simulink中将Excel数据导入可变负载模块的方法介绍

文章目录 数据准备与格式要求Excel数据格式MATLAB预处理数据导入方法使用From Spreadsheet模块(直接导入Excel)通过MATLAB工作区中转(From Workspace模块)使用1-D Lookup Table模块(非线性负载映射)Signal Builder模块(变载工况导入)可变负载模块配置注意事项与调试在S…

Java 大视界 -- Java 大数据在智慧文旅虚拟导游与个性化推荐中的应用(130)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

【微知】tmux如何在一个会话的1个窗口中水平分割或者垂直分割窗口?(垂直 Ctrl + b, %; 切换Ctrl + b, 方向键; ctrl d关闭)

背景 除了直接创建窗口,还可以分割一个窗口。创建窗口参考兄弟篇:tmux如何在某个会话session中创建多个窗口?如何切换?(Ctrlb c创建;Ctrlb 数字 切换;Ctrlb &关闭) 命令 垂…

强化学习(赵世钰版)-学习笔记(7.时序差分学习)

本章是课程算法与方法中的第四章,介绍的时序差分学习算法是基于随机近似方法设计的强化学习方法,也是model-free的方法。 时序差分算法是一种近似估计策略状态值的算法,具体的形式如下: 本质上是在当前t时刻,被访问到的…

无公网IP也能远程控制Windows:Linux rdesktop内网穿透实战

文章目录 前言1. Windows 开启远程桌面2. Linux安装rdesktop工具3. Win安装Cpolar工具4. 配置远程桌面地址5. 远程桌面连接测试6. 设置固定远程地址7. 固定地址连接测试 前言 如今远程办公已经从一种选择变成了许多企业和个人的必修课,而如何在Linux系统上高效地访…

深度学习与大模型-矩阵

矩阵其实在我们的生活中也有很多应用,只是我们没注意罢了。 1. 矩阵是什么? 简单来说,矩阵就是一个长方形的数字表格。比如你有一个2行3列的矩阵,可以写成这样: 这个矩阵有2行3列,每个数字都有一个位置&a…

【实战ES】实战 Elasticsearch:快速上手与深度实践-8.2.1AWS OpenSearch无服务器方案

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 8.2.1AWS OpenSearch 无服务器方案深度解析与实践指南1. Serverless架构的核心价值与行业趋势1.1 传统Elasticsearch集群的运维挑战1.2 Serverless技术演进路线技术特性对比…

使用 Arduino 和 ESP8266 Wi-Fi 模块发送电子邮件

使用 Arduino Uno 和 ESP8266 Wi-Fi 模块发送电子邮件 我们正在迈向物联网 (IoT) 世界。这项技术在电子和嵌入式系统中起着非常重要的作用。从任何微控制器或嵌入式系统发送电子邮件都是非常基本的事情,这在 IoT 中是必需的。因此,在本文中,我们将学习“如何使用 Wi-Fi 和…

jmeter-AES加密

AES(全称:Advanced Encryption Standard)对称加密算法,也就是加密和解密用到的密钥是相同的,这种加密方式加密速度非常快, 适合经常发送数据的场合,如:数据加密存储、网络通信加密等。 在进行接口测试或接…

四种 No-SQL

在一个常规的互联网服务中,读取与写入的比例大约是 100:1 到 1000:1。然而,从硬盘读取时,数据库连接操作耗时,99% 的时间花费在磁盘寻址上。 为了优化读取性能,非规范化的设计通过添加冗余数据或分组数据来引入。下述…

使用 Chrome Flags 设置(适用于 HTTP 站点开发)

使用 Chrome Flags 设置(适用于 HTTP 站点开发) 在 Chrome 地址栏输入:chrome://flags/在搜索框输入 “Insecure origins” 或 “Allow invalid certificates”。找到 “Insecure origins treated as secure” 选项(或者 #allow-…

openharmony体验

openharmony5 去年已经出来了 如果以前做过android开发的,学起来不难,关键 1:环境 DevEco Studio 5.0.3 Beta2 https://developer.huawei.com/consumer/cn/deveco-studio/ win10_64bit CPU amd64(不是arm的) 2:安装 执行EXE 安装就行&#x…

【微知】plantuml在泳道图中如何将多个泳道框起来分组并且设置颜色?(box “浏览器“ #LightGreen endbox)

泳道分组并且着色 分组用 box和endbox ,颜色用#xxx,标注用"xxx" box "浏览器" #LightGreen participant "浏览器1" as Browser participant "浏览器2" as Browser2 endboxparticipant "服务端" as …

EngineerCMS完整版支持OnlyOffice8.2文档协作

这次从OO5.3那个时代的接口,改到支持8.2接口,颇费周折。centos升级和docker升级 - Powered by MinDoc (itdos.net) 1. 首先是升级centos 手动升级centos7内核(版本自行选择,亲测内核下载链接有效)_centos内核下载-CS…