当前位置: 首页 > news >正文

用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 2
    weight -20   # 检测失败时降低优先级
}

vrrp_instance VI_1 {
    state MASTER            # 初始状态
    interface eth0          # 物理网卡名称
    virtual_router_id 51    # 集群ID(必须一致)
    priority 100            # 初始优先级(主>备)
    
    advert_int 1            # 心跳间隔
    authentication {        # 认证配置
        auth_type PASS
        auth_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; then
    systemctl 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 MASTER
    virtual_router_id 52
    priority 100
    virtual_ipaddress { 192.168.1.101/24 }
}

# 节点2额外配置
vrrp_instance VI_2 {
    state BACKUP
    virtual_router_id 52
    priority 90
    virtual_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.dtcms.com/a/98202.html

相关文章:

  • [Linux]在vim中批量注释与批量取消注释
  • 进程Kill杀死后GPU显存没有释放仍然被占用,怎么杀死僵尸进程
  • 跟着StatQuest学知识08-RNN与LSTM
  • Claude 在 SVG 绘图创作中的潜力与技巧
  • 【软考-架构】10.1、软件工程概述-CMM-软件过程模型-逆向工程
  • Pycharm (十)字符串扩展:统计小串在大串中出现的次数
  • C++23:现代C++的模块化革命与零成本抽象新高度
  • 笔记:遇见未来——6G协同创新技术研讨会
  • FPGA调试笔记
  • 从代码学习深度学习 - 含并行连结的网络(GoogLeNet)PyTorch版
  • 淘宝双十一大促监控系统开发:实时追踪爆品数据与流量波动
  • 谷粒微服务高级篇学习笔记整理---异步线程池
  • SQL Server数据库引擎服务启动失败:端口冲突
  • 电源系统的热设计与热管理--以反激式充电器为例
  • 1688 店铺清单及全商品数据、关键词检索 API 介绍
  • 【蓝桥杯】每日练习 Day15
  • 【自用记录】本地关联GitHub以及遇到的问题
  • 从代码学习深度学习 - 使用块的网络(VGG)PyTorch版
  • 谈谈你对多态的理解
  • coding ability 展开第七幕(前缀和算法——进阶巩固)超详细!!!!
  • 算法基础——二叉树
  • Java 程序员面试题:从基础到高阶的深度解析
  • Elasticsearch 完全指南
  • 【HarmonyOS 5】初学者如何高效的学习鸿蒙?
  • Bitnode和Bitree有什么区别 为什么Bitree前多了*
  • 缴纳过路费--并查集+优先队列
  • Qt进阶开发:Graphics View图形视图框架
  • QT 跨平台发布指南
  • 枚举算法-day2
  • python 列表-元组-集合-字典