用Nginx实现负载均衡与高可用架构(整合Keepalived)

前言

在分布式架构中,负载均衡高可用是保障系统稳定性的两大核心能力。本文将深入讲解如何通过Nginx实现七层负载均衡,并结合Keepalived构建无单点故障的高可用架构。文末附完整配置模板!


一、Nginx负载均衡实现方案

1. 核心原理

Nginx通过反向代理将客户端请求分发到多个后端服务器,基于Upstream模块实现流量调度,支持多种负载算法。

2. 基础配置模板
http {upstream backend {# 默认轮询算法server 192.168.1.101:80 weight=5;  # 权重配置server 192.168.1.102:80 max_fails=3 fail_timeout=30s; # 健康检查server 192.168.1.103:80 backup;    # 备用节点}server {listen 80;location / {proxy_pass http://backend;}}
}
3. 负载均衡算法对比
算法配置指令适用场景特点
轮询(默认)默认通用场景简单公平,支持权重
最少连接least_conn长连接服务(如数据库)动态分配,资源利用率高
IP哈希ip_hash会话保持需求固定用户->服务器映射
一致性哈希hash $key缓存服务器集群减少缓存击穿
4. 高级功能实现
  • 健康检查(被动模式):
    server 192.168.1.102 max_fails=3 fail_timeout=30s;
    
  • 流量分割(灰度发布):
    upstream backend {server 192.168.1.101 weight=90;  # 90%流量到新版本server 192.168.1.102 weight=10;  # 10%流量到旧版本
    }
    

二、Nginx高可用架构(Keepalived方案)

1. 架构原理

通过VRRP协议实现虚拟IP(VIP)漂移,主备节点自动切换,保障服务不间断。

2. 环境准备
  • 两台Nginx服务器(主:192.168.1.101,备:192.168.1.102)
  • 虚拟IP:192.168.1.100(对外暴露的统一入口)
3. Keepalived配置详解

主节点配置(/etc/keepalived/keepalived.conf):

global_defs {router_id nginx_master  # 标识节点名称
}vrrp_script chk_nginx {script "/etc/keepalived/check_nginx.sh"  # 健康检查脚本interval 2weight -20   # 检测失败时降低优先级
}vrrp_instance VI_1 {state MASTER            # 初始状态interface eth0          # 物理网卡名称virtual_router_id 51    # 集群ID(必须一致)priority 100            # 初始优先级(主>备)advert_int 1            # 心跳间隔authentication {        # 认证配置auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.100/24    # 虚拟IP}track_script {          # 绑定健康检查chk_nginx}
}

备节点配置(仅不同部分):

state BACKUP     # 设置为备用
priority 90      # 优先级低于主节点
4. 健康检查脚本

创建 /etc/keepalived/check_nginx.sh

#!/bin/bash
# 检测Nginx进程是否存在
if ! pgrep -x "nginx" > /dev/null; thensystemctl restart nginx || exit 1  # 尝试重启,失败则返回1
fi
# 可选:HTTP状态检测
curl -s http://localhost/health > /dev/null || exit 1

赋予执行权限:

chmod +x /etc/keepalived/check_nginx.sh
5. 启动与验证
systemctl start keepalived   # 启动服务
systemctl enable keepalived  # 设置开机自启

查看VIP绑定:

ip addr show eth0 | grep 192.168.1.100

三、高级优化方案

1. 双主模式(Active-Active)
# 节点1额外配置
vrrp_instance VI_2 {state MASTERvirtual_router_id 52priority 100virtual_ipaddress { 192.168.1.101/24 }
}# 节点2额外配置
vrrp_instance VI_2 {state BACKUPvirtual_router_id 52priority 90virtual_ipaddress { 192.168.1.101/24 }
}
2. 结合DNS轮询
  • 将多个VIP绑定到同一个域名
  • 实现多级负载均衡(DNS层+Nginx层)
3. 监控告警集成
  • Prometheus监控指标:
    # 安装nginx_exporter
    location /stub_status {stub_status;allow 127.0.0.1;deny all;
    }
    

四、常见问题与解决方案

问题现象排查步骤解决方案
VIP不漂移1. 检查防火墙是否允许VRRP协议
2. 查看keepalived日志
开放IP协议号112
脑裂(双主)1. 检查网络连通性
2. 确认virtual_router_id唯一
配置不同的router_id
健康检查误判1. 检查脚本执行权限
2. 增加curl超时设置
优化检测逻辑

总结

通过Nginx实现负载均衡可提升系统吞吐量,而结合Keepalived的高可用方案能确保服务零中断。实际部署时需注意:

  1. 根据业务场景选择合适的负载算法
  2. VIP需与物理网络在同一子网
  3. 生产环境建议使用双主+健康检查增强模式

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

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

相关文章

springBoot与ElementUI配合上传文件

以下是使用Vue CLI创建的Vue项目,结合Element UI来实现文件上传功能的完整示例。 步骤 创建Vue项目:确保你已经安装了Vue CLI,若未安装,可使用以下命令安装: npm install -g vue/cli然后创建一个新的Vue项目&#x…

黑盒测试的测试用例构成的八点要素

测试用例: 是为测试项目而设计的执行文档 作用: 防止漏测实施测试的标准 编写格式: 用例编号:项目 模块 编号用例标题:预期结果(测试点)模块/项目:所属项目或模块优先级:表示用例的重要程度或者影响力P0~p4(P0最高)前置条件:要执行此条用例&#xf…

蓝桥刷题note11(好数)

1,好数 一个整数如果按从低位到高位的顺序,奇数位 (个位、百位、万位 ⋯⋯ ) 上的数字是奇数,偶数位 (十位、千位、十万位 ⋯⋯ ) 上的数字是偶数,我们就称之为 “好数”。 给定一个正整数 NN,请计算从 1 到 NN 一共…

Keil编译生成的axf文件的介绍

在 Keil 开发环境(如 Keil MDK)中,.axf 文件是一种 可执行文件格式,主要用于 ARM 处理器的嵌入式开发。它的作用类似于 ELF(Executable and Linkable Format)格式,包含了可执行代码、调试信息、…

C#:第一性原理拆解属性(property)

目录 第一步:从最基本的需求出发 第二步:引入控制需求 第三步:优化访问方式 第四步:剖析属性的本质 第五步:进一步简化和演化 第六步:总结属性的第一性原理 我们用第一性原理(First Prin…

-PHP 应用文件上传函数缺陷条件竞争二次渲染黑白名单JS 绕过

#学习前必读: 1 、课前一定要明白: 无文件解析安全问题上,格式解析是一对一的(不能 jpg 解析 php ) 换句话来说有解析错误配置或后缀解析漏洞时才能实现格式差异解析 2 、文件上传安全指的是攻击者通过利用上传…

C++的模板(十四):更多的自动内存管理

在前文《C的模板(八):子系统》class DMM,给出了一个自动动态内存管理的例子。https://blog.csdn.net/aaasssdddd96/article/details/139921880 它使用了一个list容器,把两个类型兼容的指针存放在一起。在new的时候,随即就把得到的…

Windows下VSCode的安装

前言 VSCode的安装看起来平平无奇,但也不是轻轻松松的。笔者将最新的Windows下安装VSCode,以及运行最简单的C程序的过程记录下来,供后续的自己和大家参考。 一、官网下载安装包 Visual Studio Code - Code Editing. Redefined 二、安装 直接…

Matlab教程004:Matlab矩阵的拼接重构重排以及矩阵的运算

文章目录 1.4.3 矩阵的拼接重构重排1.4.3.1 横向拼接1.4.3.2 纵向拼接1.4.3.3 矩阵的重构重排 1.4.4 矩阵的运算1.4.4.1 算数运算1.4.4.2 矩阵加减1.4.4.3 矩阵乘法1.4.4.4 矩阵转置 1.4.3 矩阵的拼接重构重排 1.4.3.1 横向拼接 A和B的行数相同,那么使用[A,B]、[A …

Python小练习系列 Vol.3:生成有效括号组合(回溯 + DFS)

🧠 Python小练习系列 Vol.3:生成有效括号组合(回溯 DFS) 👋 本期我们来刷一道 LeetCode 热门经典题,借此掌握回溯算法的精髓 —— 生成有效括号组合,是学习递归 & DFS 的黄金题型&#xff…

实战经验深度解析 | 博睿数据制造行业精选案例集发布!

近年来,我国制造业加速迈向高端化、智能化、绿色化,为经济高质量发展注入新动能。放眼全球,制造业正加速数字化、智能化转型,5G、人工智能、边缘计算等技术与生产全流程深度融合,有力推动柔性化生产与产业链协同创新发…

[创业之路-344]:战略的本质是选择、聚焦, 是成本/效率/低毛利优先,还是差易化/效益/高毛利优先?无论是成本优先,还是差易化战略,产品聚焦是前提。

前言: 一、战略的本质是选择、聚焦 关于战略的本质,触及了商业竞争的核心矛盾:选择成本优先(效率/低毛利)还是差异化(效益/高毛利),本质上是对企业战略方向的终极拷问。 1、战略选…

项目代码第10讲【数据库运维知识——如何优化数据库查询效率?】:各种日志查看;主从复制;分库分表(MyCat);读写分离;区别数据分区、分表、分库

01. 运维-课程介绍_哔哩哔哩_bilibili 一、各种日志查看 二、主从复制 三、分库分表(MyCat) 四、读写分离 五、区别数据分区、分表、分库 1、数据库分区 上图中的ibd文件,是分区表的数据文件,可以分布在不同的物理设备上&…

OpenCV图像拼接(10)用于实现图像拼接过程中的时间流逝(timelapse)效果的一个类cv::detail::Timelapser

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::Timelapser 是 OpenCV 库中用于实现图像拼接过程中的时间流逝(timelapse)效果的一个类。它通常用于将一系列…

Transformer 通关秘籍2:利用 BERT 将文本 token 化

前面两节分别通过两个代码示例展示了模型将文本转换为 token 之后是什么样的,希望你可以对此有一个感性的认识。 本节来简要介绍一下将一个连续的文本转换为 token 序列的大致过程,这个过程被称为分词,也叫 tokenization。 在你没了解这方面…

Optional的stream方法,flatMap, filter应用

Java 8引入的Optional和Stream彻底改变了我们处理空值和集合操作的方式。本文将深入探讨如何将二者结合使用,通过四个核心场景提升代码的健壮性和简洁性。 一、Optional构成的Stream:空值自动过滤 当处理Optional集合时,我们常需要过滤掉空…

参加李继刚线下活动启发:未来提示词还会存在吗?

上周六,我参加了李继刚老师组织的线下活动。 现场干货满满,尤其是关于 AI 时代提示词的价值、与 AI 沟通的艺术等话题,李老师的分享如同醍醐灌顶,让我对 AI 人机协作有了更深的理解。 将几点核心收获整理出来,与大家…

Python基础知识第二天:从格式化到流程控制

Python基础知识第二天:从格式化到流程控制 大家好!今天我们来梳理Python的一些重要基础知识,包括格式化输出、输入函数、运算符以及流程控制语句。 1. 格式化输出 Python提供了多种格式化输出的方式: # %d, %f, %s 格式化name &q…

GDB: coredump

前言:一句话如下使用 gdb [exec_file] [core_file] # or gdb -c [core_file] [exec_file] #-c指定转储的core文件 gdb -c core.5213 spp_uc_frequent_contact_ol_worker # 进入后输入bt查看调用栈 bt #显示所有帧栈 bt 10 #显示前面10个帧栈(感觉没啥用) bt …

21_js正则_表单验证

目录 正则 一、 正则的概念 二、创建正则方式 2.1 构造函数去创建正则 2.2 字面量去创建正则 2,3 test方法 三、正则修饰符 四、 正则的方法 lastIndex test方法 exec 五、字符串方法 replace match search split 六、正则表达式的构成 元字符-- 定位符 元字…