负载均衡与高可用

负载均衡笔记

一、什么是负载均衡

负载均衡就是把用户请求分发到多台服务器上,让多台服务器共同对外提供服务。

例如原来只有一台 Tomcat:

text 复制代码
用户 -> Tomcat

当访问量变大后,一台 Tomcat 可能扛不住,可以改成多台 Tomcat:

text 复制代码
用户 -> 负载均衡器 -> Tomcat1
                  -> Tomcat2
                  -> Tomcat3

负载均衡器负责接收用户请求,然后按照一定规则转发给后端服务器。

二、为什么需要负载均衡

负载均衡主要解决这些问题:

  • 提高并发能力:多台服务器一起处理请求。
  • 提高系统可用性:某台后端服务器故障后,可以把请求转给其他服务器。
  • 方便扩容:访问量变大时,可以增加新的后端节点。
  • 统一入口:用户只访问一个地址,不需要关心后面有多少台服务器。
  • 支持灰度发布:可以让一小部分流量先访问新版本。

三、常见角色

名称 含义
Client 客户端,用户浏览器或 APP
Load Balancer 负载均衡器
Real Server 真实服务器,真正处理请求的后端
VIP 虚拟 IP,对外提供访问入口
Tomcat Java Web 应用服务器
LVS Linux 内核级四层负载均衡
HAProxy 常用四层/七层负载均衡软件
Nginx 常用 Web 服务器、反向代理和七层负载均衡软件
Keepalived 实现 VIP 漂移和高可用

四、四层负载均衡和七层负载均衡

1. 四层负载均衡

四层指 OSI 七层模型中的传输层。

四层负载均衡主要根据:

text 复制代码
IP + 端口

进行转发。

例如:

text 复制代码
用户访问 192.168.1.100:80
负载均衡器转发到 192.168.1.11:8080
负载均衡器转发到 192.168.1.12:8080

常见软件:

  • LVS
  • HAProxy 的 TCP 模式
  • Nginx stream 模块

特点:

  • 性能高。
  • 转发效率好。
  • 不关心 HTTP 请求内容。
  • 不能根据 URL、Cookie、Header 做复杂转发。

2. 七层负载均衡

七层指 OSI 七层模型中的应用层。

七层负载均衡可以理解 HTTP 请求内容,例如:

  • 域名
  • URL 路径
  • 请求头
  • Cookie
  • 请求方法

例如:

text 复制代码
/api     -> Tomcat 应用服务器
/static  -> 静态资源服务器
/admin   -> 后台管理服务器

常见软件:

  • HAProxy
  • Nginx
  • Apache HTTP Server

特点:

  • 转发规则更灵活。
  • 适合 Web 应用。
  • 可以做 HTTP 健康检查。
  • 可以做会话保持、灰度发布、路径转发。
  • 性能通常不如纯四层转发极限高。

五、LVS

LVS 是 Linux Virtual Server 的缩写,是 Linux 内核级负载均衡。

LVS 工作在四层,性能非常高,适合做大流量入口。

1. LVS 重要概念

概念 说明
Director Server LVS 负载均衡器
Real Server 后端真实服务器
VIP 对外访问的虚拟 IP
DIP LVS 负载均衡器自己的 IP
RIP 后端真实服务器 IP
CIP 客户端 IP

2. LVS 常见模式

模式 说明
NAT 模式 请求和响应都经过 LVS,配置简单,但 LVS 压力较大
DR 模式 请求经过 LVS,响应由后端直接返回客户端,性能高
TUN 模式 通过隧道转发,适合跨网络场景

学习阶段重点掌握:

text 复制代码
LVS-NAT
LVS-DR

生产环境中,LVS-DR 比较常见,因为返回流量不经过 LVS,性能更好。

3. LVS 常见调度算法

算法 名称 说明
rr 轮询 请求依次分配给后端服务器
wrr 加权轮询 权重高的服务器分到更多请求
lc 最少连接 优先分配给连接数少的服务器
wlc 加权最少连接 结合权重和连接数
sh 源地址哈希 同一个客户端尽量访问同一台后端

六、HAProxy

HAProxy 是常用的负载均衡软件,可以做四层负载均衡,也可以做七层负载均衡。

HAProxy 常用于 Web 应用、Tomcat 集群、API 服务入口。

1. HAProxy 优点

  • 配置清晰。
  • 支持四层和七层。
  • 支持健康检查。
  • 支持后端权重。
  • 支持会话保持。
  • 支持按域名、URL、Header 转发。
  • 日志和排错比较方便。

2. HAProxy 简单架构

text 复制代码
用户
 |
HAProxy:80
 |
+--------------------+
|                    |
Tomcat1:8080     Tomcat2:8080

3. HAProxy 配置示例

conf 复制代码
global
    daemon
    maxconn 4096

defaults
    mode http
    timeout connect 5s
    timeout client 50s
    timeout server 50s

frontend web_front
    bind *:80
    default_backend tomcat_servers

backend tomcat_servers
    balance roundrobin
    option httpchk GET /
    server tomcat1 192.168.1.11:8080 check
    server tomcat2 192.168.1.12:8080 check

说明:

  • bind *:80:监听 80 端口。
  • default_backend tomcat_servers:默认转发到 Tomcat 后端组。
  • balance roundrobin:使用轮询算法。
  • check:开启健康检查。

七、Nginx

Nginx 是非常常见的 Web 服务器,也经常用来做反向代理和负载均衡。

它在实际项目中通常有三个常见角色:

  • 静态资源服务器:处理 HTML、CSS、JS、图片等静态文件。
  • 反向代理服务器:接收用户请求,再转发给后端 Tomcat。
  • 七层负载均衡器:根据 HTTP 请求把流量分发给多台后端服务器。

1. 正向代理和反向代理

正向代理代理的是客户端。

text 复制代码
客户端 -> 代理服务器 -> 目标网站

例如公司内网通过代理服务器访问外部网站。

反向代理代理的是服务端。

text 复制代码
用户 -> Nginx -> Tomcat

用户访问的是 Nginx,不直接访问后端 Tomcat。

在负载均衡中,Nginx 通常作为反向代理服务器使用。

2. Nginx 负载均衡架构

text 复制代码
用户
 |
Nginx:80
 |
+--------------------+
|                    |
Tomcat1:8080     Tomcat2:8080

用户访问:

text 复制代码
http://192.168.1.100

Nginx 根据配置把请求转发到后端 Tomcat。

3. Nginx 负载均衡配置示例

nginx 复制代码
upstream tomcat_servers {
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

server {
    listen 80;
    server_name localhost;

    location / {
        proxy_pass http://tomcat_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

说明:

  • upstream tomcat_servers:定义后端服务器组。
  • server 192.168.1.11:8080:添加一台 Tomcat。
  • proxy_pass http://tomcat_servers:把请求转发给后端服务器组。
  • X-Real-IP:把真实客户端 IP 传给后端。
  • X-Forwarded-For:记录经过的代理链路。

4. Nginx 常见负载均衡策略

轮询

默认策略,请求依次分发给后端服务器。

nginx 复制代码
upstream tomcat_servers {
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}
加权轮询

权重越高,分配到的请求越多。

nginx 复制代码
upstream tomcat_servers {
    server 192.168.1.11:8080 weight=3;
    server 192.168.1.12:8080 weight=1;
}

含义:

text 复制代码
Tomcat1 处理更多请求
Tomcat2 处理较少请求
ip_hash

同一个客户端 IP 尽量访问同一台后端服务器。

nginx 复制代码
upstream tomcat_servers {
    ip_hash;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

这个策略常用于简单的会话保持。

5. Nginx 健康检查

开源版 Nginx 对后端健康检查主要是被动检查。

常见参数:

nginx 复制代码
upstream tomcat_servers {
    server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
}

说明:

  • max_fails=3:失败 3 次后认为后端暂时不可用。
  • fail_timeout=30s:在 30 秒内统计失败次数,并在失败后暂停一段时间。

如果需要更强的主动健康检查,可以使用 Nginx Plus,或者选择 HAProxy。

6. Nginx 动静分离

Nginx 很适合处理静态资源,Tomcat 更适合处理 Java 动态请求。

典型架构:

text 复制代码
用户 -> Nginx
        |-> 静态资源:Nginx 直接返回
        |-> 动态请求:转发给 Tomcat

示例:

nginx 复制代码
server {
    listen 80;

    location /static/ {
        root /data/www;
    }

    location / {
        proxy_pass http://tomcat_servers;
    }
}

好处:

  • 减轻 Tomcat 压力。
  • 静态资源访问速度更快。
  • 后端应用服务器专心处理业务逻辑。

7. Nginx 和 HAProxy 的区别

对比项 Nginx HAProxy
主要定位 Web 服务器、反向代理、负载均衡 专业负载均衡软件
静态资源处理 很强 通常不用于静态资源
七层转发 支持 支持
四层转发 通过 stream 模块支持 原生支持
健康检查 开源版偏基础 更强、更适合负载均衡
配置复杂度 上手简单 负载均衡配置更专业
常见场景 网站入口、动静分离、反向代理 高并发转发、API/Tomcat 集群

简单理解:

text 复制代码
Nginx:Web 入口能力强,适合静态资源和反向代理。
HAProxy:负载均衡能力专业,适合复杂转发和健康检查。

八、Keepalived

Keepalived 主要用来解决负载均衡器本身的单点故障。

如果只有一台 HAProxy:

text 复制代码
用户 -> HAProxy -> Tomcat

一旦 HAProxy 挂了,整个系统就无法访问。

所以一般会准备两台 HAProxy:

text 复制代码
HAProxy1: 192.168.1.21
HAProxy2: 192.168.1.22
VIP:      192.168.1.100

Keepalived 让 VIP 默认绑定在主节点上:

text 复制代码
用户 -> VIP -> HAProxy1 -> Tomcat

如果 HAProxy1 故障,VIP 自动漂移到 HAProxy2:

text 复制代码
用户 -> VIP -> HAProxy2 -> Tomcat

这个过程叫:

text 复制代码
主备切换
VIP 漂移
高可用

Keepalived 底层使用 VRRP 协议。

Keepalived 主备示例

主节点:

conf 复制代码
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 123456
    }

    virtual_ipaddress {
        192.168.1.100
    }
}

备节点:

conf 复制代码
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 123456
    }

    virtual_ipaddress {
        192.168.1.100
    }
}

主备配置的关键区别:

  • 主节点 state MASTER
  • 备节点 state BACKUP
  • 主节点优先级更高,例如 priority 100
  • 备节点优先级更低,例如 priority 90

九、Tomcat 在负载均衡中的作用

Tomcat 是后端应用服务器,真正处理业务请求。

例如一个 Java Web 项目部署在两台服务器上:

text 复制代码
Tomcat1: 192.168.1.11:8080
Tomcat2: 192.168.1.12:8080

用户不直接访问 Tomcat,而是访问负载均衡器:

text 复制代码
用户 -> HAProxy/LVS -> Tomcat

这样做的好处:

  • 后端 Tomcat 可以横向扩容。
  • 某台 Tomcat 挂了,可以自动摘除。
  • 用户只记一个入口地址。
  • 可以对 Tomcat 做滚动发布。

十、典型架构:Keepalived + HAProxy/Nginx + Tomcat

这是学习阶段和中小型生产环境中很常见的一种架构。

text 复制代码
                VIP: 192.168.1.100
                         |
           +-------------+-------------+
           |                           |
 HAProxy/Nginx1 + Keepalived  HAProxy/Nginx2 + Keepalived
       192.168.1.21                192.168.1.22
          MASTER                     BACKUP
           |                           |
           +-------------+-------------+
                         |
              +----------+----------+
              |                     |
       Tomcat1:8080          Tomcat2:8080
       192.168.1.11          192.168.1.12

访问流程:

  1. 用户访问 192.168.1.100
  2. VIP 当前在 HAProxy1 上。
  3. HAProxy1 或 Nginx1 根据负载均衡算法选择一个 Tomcat。
  4. Tomcat 处理请求并返回结果。
  5. 如果 Tomcat1 故障,HAProxy 不再把请求发给 Tomcat1。
  6. 如果 HAProxy1 或 Nginx1 故障,Keepalived 把 VIP 漂移到备用节点。

十一、真实案例一:电商活动访问量暴增

场景:

一个电商网站平时访问量不大,只有一台 Tomcat:

text 复制代码
用户 -> Tomcat1

平时没有问题,但到了促销活动时,大量用户同时访问商品详情页和下单接口,Tomcat1 CPU 升高,请求变慢,甚至服务不可用。

改造方案:

text 复制代码
用户 -> Nginx/HAProxy -> Tomcat1
               -> Tomcat2
               -> Tomcat3

处理方式:

  • 部署 3 台 Tomcat。
  • Nginx 或 HAProxy 使用轮询、加权轮询等算法分发请求。
  • 对 Tomcat 开启健康检查。
  • 后续访问量继续增加时,再增加 Tomcat4、Tomcat5。

效果:

  • 单台 Tomcat 压力下降。
  • 整体并发能力提高。
  • 某台 Tomcat 故障不会导致整个网站不可访问。

十二、真实案例二:后台系统不能中断

场景:

公司内部有一个订单管理系统,后端是两台 Tomcat,前面有一台 HAProxy:

text 复制代码
用户 -> HAProxy -> Tomcat1
               -> Tomcat2

虽然 Tomcat 已经有两台,但是 HAProxy 只有一台。如果 HAProxy 宕机,用户仍然无法访问系统。

改造方案:

text 复制代码
用户 -> VIP
        |
        +-> HAProxy1 + Keepalived
        |
        +-> HAProxy2 + Keepalived

处理方式:

  • 准备两台 HAProxy。
  • 两台 HAProxy 配置相同的后端 Tomcat。
  • 两台机器安装 Keepalived。
  • 配置同一个 VIP。
  • HAProxy1 作为主节点,HAProxy2 作为备节点。

效果:

  • 正常情况下 VIP 在 HAProxy1 上。
  • HAProxy1 故障后,VIP 自动漂移到 HAProxy2。
  • 用户仍然访问同一个 VIP,不需要修改地址。

十三、真实案例三:根据 URL 分流

场景:

一个网站包含普通页面、接口服务和后台管理:

text 复制代码
/           普通页面
/api        接口服务
/admin      后台管理

如果所有请求都转发到同一组 Tomcat,管理不方便,也不利于扩容。

改造方案:

text 复制代码
/api    -> API Tomcat 集群
/admin  -> Admin Tomcat 集群
/static -> 静态资源服务器

这种情况适合使用七层负载均衡,例如 Nginx 或 HAProxy。

效果:

  • 不同业务可以独立扩容。
  • API 压力大时,只扩容 API Tomcat。
  • 后台管理可以单独做访问控制。
  • 静态资源可以交给专门的静态服务器或 CDN。

十四、真实案例四:灰度发布

场景:

项目要发布新版本,但不希望所有用户立即访问新版本。

原来:

text 复制代码
用户 -> Tomcat 旧版本

改造后:

text 复制代码
大部分用户 -> Tomcat 旧版本
少量用户   -> Tomcat 新版本

可以在 HAProxy 中通过权重控制流量:

text 复制代码
Tomcat-old 权重 90
Tomcat-new 权重 10

效果:

  • 先让少量流量访问新版本。
  • 观察日志、错误率、响应时间。
  • 如果新版本稳定,再逐步提高权重。
  • 如果新版本有问题,可以快速切回旧版本。

十五、真实案例五:Nginx 动静分离

场景:

一个 Java Web 网站既有动态接口,也有大量静态资源:

text 复制代码
/api          动态接口
/login        登录页面
/static       CSS、JS、图片
/upload       用户上传文件

如果所有请求都交给 Tomcat:

text 复制代码
用户 -> Tomcat

Tomcat 不仅要处理业务逻辑,还要返回图片、CSS、JS,压力会比较大。

改造方案:

text 复制代码
用户 -> Nginx
        |-> /static  Nginx 直接返回
        |-> /upload  Nginx 直接返回
        |-> /api     转发给 Tomcat 集群
        |-> /login   转发给 Tomcat 集群

效果:

  • 静态资源由 Nginx 高效处理。
  • Tomcat 专心处理动态业务请求。
  • 页面加载速度更快。
  • 后端服务器压力更小。

十六、LVS、HAProxy、Nginx、Keepalived 的选择

场景 推荐
学习负载均衡 HAProxy + Tomcat
Web 应用负载均衡 Nginx 或 HAProxy
静态资源和动静分离 Nginx
需要高可用入口 Keepalived + Nginx/HAProxy
超大流量四层转发 LVS
需要按 URL、域名转发 Nginx 或 HAProxy
需要更专业的健康检查 HAProxy
负载均衡器不能单点 Keepalived

简单记忆:

text 复制代码
Tomcat:真正处理请求
Nginx:Web 入口、静态资源、反向代理、七层负载均衡
HAProxy:分发 HTTP/TCP 请求
LVS:高性能四层转发
Keepalived:保证入口高可用

十七、学习实验建议

实验一:两台 Tomcat + 一台 Nginx

目标:

text 复制代码
用户 -> Nginx -> Tomcat1/Tomcat2

验证:

  • 访问 Nginx 地址能看到 Tomcat 页面。
  • 多次刷新,请求能分发到不同 Tomcat。
  • 停掉 Tomcat1 后,请求还能访问 Tomcat2。

实验二:两台 Tomcat + 一台 HAProxy

目标:

text 复制代码
用户 -> HAProxy -> Tomcat1/Tomcat2

验证:

  • 访问 HAProxy 地址能看到 Tomcat 页面。
  • 后端 Tomcat 健康检查生效。
  • 停掉 Tomcat1 后,请求还能访问 Tomcat2。

实验三:两台 Nginx/HAProxy + Keepalived

目标:

text 复制代码
用户 -> VIP -> Nginx1/Nginx2 -> Tomcat
用户 -> VIP -> HAProxy1/HAProxy2 -> Tomcat

验证:

  • 正常情况下 VIP 在主节点。
  • 停掉主节点后,VIP 漂移到备节点。
  • 用户仍然访问同一个 VIP。

实验四:LVS-DR

目标:

text 复制代码
用户 -> LVS -> Real Server

验证:

  • 用户访问 VIP。
  • LVS 负责请求转发。
  • 后端 Real Server 直接返回响应。
  • LVS 压力比 NAT 模式更小。

十八、总结

负载均衡的核心思想是:

text 复制代码
多台服务器一起对外提供服务,由负载均衡器统一分发请求。

常见组合:

text 复制代码
Nginx + Tomcat
HAProxy + Tomcat
Keepalived + Nginx + Tomcat
Keepalived + HAProxy + Tomcat
Keepalived + LVS + Tomcat
LVS + HAProxy + Tomcat

掌握:

  1. Tomcat 多节点部署。
  2. Nginx 反向代理和动静分离。
  3. HAProxy 转发请求和健康检查。
  4. Keepalived VIP 漂移。
  5. LVS NAT 和 DR 模式。

记忆:

text 复制代码
Tomcat 干活,Nginx/HAProxy/LVS 分活,Keepalived 保证分活的人不倒。
相关推荐
遇印记3 小时前
软考知识点(windows系统管理与命令)
运维·服务器·网络·windows·ddos
风曦Kisaki3 小时前
# Linux运维Day03:Nginx 反向代理(服务集群)、负载均衡、四层调度与优化
linux·运维·nginx
木雷坞3 小时前
csdn-enterpriseGitLab Runner docker pull 慢:并行流水线镜像拉取排查
运维·docker·容器·gitlab
雪度娃娃3 小时前
Asio异步读写——简单服务器和客户端异步通信
运维·服务器·网络·c++·php
sbjdhjd4 小时前
02 下 | Kubernetes Pod 实战实验完全解析
linux·运维·云原生·kubernetes·podman·kubelet·kubeless
陳10304 小时前
Linux:System V 消息队列与信号量
linux·运维·服务器
云飞云共享云桌面4 小时前
SolidWorks 服务器通过云飞云共享云桌面10人研发共享方案
运维·服务器·3d·设计模式·电脑
条俐开水喉4 小时前
高密度AI算力服务器机房U位动态调度管理方案
运维·服务器·人工智能
A_QXBlms4 小时前
企业微信社群SOP自动化执行引擎开发,SCRM高效运营技术实现
运维·自动化·企业微信