LVS -- 部署NAT模式集群案例

一.NAT模式简介

1.1 背景

在互联网服务场景中,单台服务器的处理能力存在上限,当业务访问量超过单节点承载阈值时,会出现服务响应延迟甚至中断的情况。为解决这一问题,需要通过负载均衡技术将流量分发至多台后端真实服务器(RS),LVS-NAT 模式是基于网络地址转换(NAT)实现的四层负载均衡方案,适用于中小规模的流量场景。

1.2 原理

  1. 请求阶段(DNAT 转换):客户端请求到达 LVS 调度器的 VIP 后,IPVS 模块在 PREROUTING 与 INPUT 链之间拦截请求,通过 DNAT(目标地址转换)将数据包的目标地址从 VIP 修改为选定后端 RS 的 RIP(真实 IP),目标端口也可映射为 RS 的内部端口,然后转发至该 RS。
  2. 响应阶段(SNAT 转换):RS 处理请求后生成响应数据包,其源地址为自身 RIP,目标地址为客户端 CIP。由于 RS 的网关指向 LVS 的 DIP(调度器内网 IP),响应包会被发往 LVS。LVS 再通过 SNAT(源地址转换)将响应包的源地址从 RIP 修改为 VIP,源端口也映射回客户端请求的原始端口,最后转发给客户端。
  3. 双向必经特性:所有请求和响应数据包都必须经过 LVS 调度器转发,RS 与客户端无法直接通信。

1.3 目的

  1. 提升服务容量:通过多台 RS 并行处理请求,线性提升系统的整体承载能力,避免单节点性能瓶颈。
  2. 实现高可用性:当某台 RS 故障时,LVS 可自动将流量分配至其他健康节点,保证服务不中断。
  3. 隐藏后端架构:客户端仅需知晓 VIP,无需了解后端 RS 的部署细节,降低了架构复杂度和安全风险。
  4. 灵活流量调度:支持基于端口的映射,可根据业务需求将不同端口的请求分发至特定 RS,实现精细化流量管理。

二.环境设定

2.1 环境流程图

注:

1.vsnode服务器采用双网卡,一个是桥接网卡连接外网,一个是仅主机网卡与后端Web服务器相连

2.RS服务器采用仅主机网卡与vsnode相连

3.RS服务器网关指向192.168.221.100

4.后端RS服务器不需要连接外网

2.2 实验环境

2.3 环境配置

2.3.1创建虚拟机

1)vsnode虚拟机

2)RS1虚拟机

3)RS2虚拟机

注:添加并更改网卡教程

添加

更改

2.3.2 环境配置命令

1)设定网络

vsnode主机中

复制代码
[root@vsnode ~]# vmset.sh eth0 192.168.35.100 vsnode
[root@vsnode ~]# vmset.sh eth1 192.168.221.100 vsnode noroute

RS1主机中

复制代码
[root@RS1 ~]# vmset.sh eth0 192.168.221.10 RS1 noroute
[root@RS1 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.221.100
[root@RS1 ~]# nmcli connection reload
[root@RS1 ~]# nmcli connection up eth0

检测:

复制代码
[root@RS1 ~]# route  -n

RS2主机中

复制代码
[root@RS2 ~]# vmset.sh eth0 192.168.221.20 RS2 noroute
[root@RS2 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.221.20
[root@RS2 ~]# nmcli connection reload
[root@RS2 ~]# nmcli connection up eth0

测试:

复制代码
[root@RS2 ~]# route -n

2)设定访问业务真实数据

RS1虚拟机中

复制代码
[root@RS1 ~]# dnf install httpd -y
[root@RS1 ~]# systemctl enable --now httpd

[root@RS1 ~]# echo RS1 - 192.168.221.10 > /var/www/html/index.html

RS2虚拟机中:

复制代码
[root@RS2 ~]# dnf install httpd -y
[root@RS2 ~]# systemctl enable --now httpd
[root@RS2 ~]# echo RS2 - 192.168.221.20 > /var/www/html/index.html

在vsnode虚拟机中测试环境:

复制代码
[root@vsnode ~]# curl 192.168.221.10

[root@vsnode ~]# curl 192.168.221.20

三. 实现方法

3.1 Lvs

3.1.1 在调度器中部署ipvsadm

三台虚拟机中,vsnode是调度器,RS1和RS2是服从调度的,因此需要向调度器里面要安装管理LVS的工具(即ipvsadm)

复制代码
#在vsnode中
[root@vsnode ~]# dnf install ipvsadm -y  #安装ipvsadm

3.1.2 开启内核路由功能

开启内核路由功能的核心作用是让调度器具备 IP 数据包转发能力,从而实现客户端请求到后端真实服务器的流量分发与响应回传

复制代码
#在vsnode中
[root@vsnode ~]# sysctl -a | grep ip_forward      #查看当前内核路由功能是否开启(=0为没有开启,=1为已开启)
[root@vsnode ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf    #手动开启内核路由功能
[root@vsnode ~]# sysctl -p        #让更改生效

3.1.3 编写策略

编写策略是为了让 LVS 调度器明确流量转发规则、实现负载均衡、保障服务高可用,并隐藏后端架构以提升安全性。

复制代码
在vsnode中

[root@vsnode ~]# ipvsadm -A -t 192.168.35.100:80 -s rr
#创建监听 192.168.35.100:80 的 TCP 虚拟服务,并设置轮询(rr)作为负载均衡调度算法
[root@vsnode ~]# ipvsadm -a -t 192.168.35.100:80  -r 192.168.221.10 -m -w 1
#为 192.168.35.100:80 的虚拟服务添加后端真实服务器 192.168.221.10,采用 NAT 模式,权重设为 1
[root@vsnode ~]# ipvsadm -a -t 192.168.35.100:80  -r 192.168.221.20 -m -w 1
#为 192.168.35.100:80 的虚拟服务添加后端真实服务器 192.168.221.20,采用 NAT 模式,权重设为 1
[root@vsnode ~]# ipvsadm -Ln
#以数字形式列出当前 IPVS 中所有的虚拟服务和后端服务器配置规则

测试:

复制代码
[root@vsnode ~]# for i in {1..5};do curl 192.168.35.100;done
#通过 Shell 循环向 192.168.35.100 发送 5 次 HTTP 请求,测试 LVS 负载均衡的调度效果

3.1.4 更改权重

更改 LVS 后端 RS 的权重,是为了让流量分配更贴合服务器的实际性能与业务需求,从而提升整体系统的效率、稳定性和资源利用率

复制代码
vsnode中
[root@vsnode ~]# ipvsadm -e -t 192.168.35.100:80 -r 192.168.221.10:80 -m -w 2
[root@vsnode ~]# ipvsadm -Ln

测试

复制代码
[root@vsnode ~]# for i in {1..5};do curl 192.168.35.100;done

3.2 规则持久化

LVS 规则持久化的核心是,在一个设定的超时时间内,将来自同一个客户端的所有请求都固定转发到同一台后端真实服务器(RS),以保证会话的连续性

实验过程可以用过打开另外一个shell的并执行监控命令的方式进行观察

复制代码
新开一个shell的并执行监控
[root@vsnode ~]# watch -n 1 ipvsadm -Ln

监控画面示例:

3.2.1 利用自定义进行规则持久化

复制代码
[root@vsnode ~]# ipvsadm-save -n
#以数字形式(不解析主机名)显示当前系统中所有的 LVS 规则
[root@vsnode ~]# ipvsadm-save -n > /mnt/ipvs.rule
#把当前 LVS 规则以数字形式(不解析主机名)导出并保存到 /mnt/ipvs.rule 文件中
[root@vsnode ~]# ipvsadm -C     
#清空当前系统中所有的 LVS 规则
[root@vsnode ~]# ipvsadm-restore < /mnt/ipvs.rule  
#从 /mnt/ipvs.rule 文件中恢复之前保存的 LVS 规则

ipvsadm -C 清除之后

ipvsadm-restore < /mnt/ipvs.rule 恢复之后

3.2.2 利用守护进程进行规则持久化

设置之后可实现持久化开机自启动

复制代码
[root@vsnode ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
#将当前 LVS 规则以数字形式(不解析主机名)导出,并保存到系统默认的配置文件 /etc/sysconfig/ipvsadm 中,用于开机自动恢复
[root@vsnode ~]# ipvsadm -C
[root@vsnode ~]# systemctl enable --now ipvsadm.service
#立即启动 ipvsadm 服务,并设置为开机自启,确保系统重启后能自动从 /etc/sysconfig/ipvsadm 恢复 LVS 规则
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.

四.ipvsadm部署命令介绍

4.1 lvs软件相关信息

  • 程序包:ipvsadm

  • Unit File: ipvsadm.service

  • 主程序:/usr/sbin/ipvsadm

  • 规则保存工具:/usr/sbin/ipvsadm-save

  • 规则重载工具:/usr/sbin/ipvsadm-restore

  • 配置文件:/etc/sysconfig/ipvsadm-config

  • ipvs调度规则文件:/etc/sysconfig/ipvsadm

4.2.ipvsadm命令

核心功能:

  • 集群服务管理:增、删、改

  • 集群服务的RS管理:增、删、改

  • 查看

命令参数

复制代码
管理集群服务
ipvsadm -A|E -t(tcp)|u(udp)|f(防护墙标签) \
service-address(集群地址) \
[-s scheduler(调度算法)] \
[-p [timeout]] \
[-M netmask] \
[--pepersistence_engine] \
[-b sched-flags]

ipvsadm -D -t|u|f service-address 删除
ipvsadm --C 清空
ipvsadm --R 重载
ipvsadm -S [-n] 保存

管理集群中的real server
ipvsadm -a|e -t|u|f service-address -r server-address [-g | -i| -m](工作模式) [-w weight](权重)
ipvsadm -d -t|u|f service-address -r server-address	删除RS
ipvsadm -L|l [options]					查看rs
ipvsadm -Z [-t|u|f service-address]  	清楚计数器

4.3.lvs集群中的增删改

1.管理集群服务中的增删改

复制代码
-A	#添加
-E	#修改
-t	#tcp服务
-u	#udp服务
-s	#指定调度算法,默认为WLC
-p	#设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver
-f  #firewall mask 火墙标记,是一个数字

#增加
[root@DR-server ~]# ipvsadm -A -t 192.168.35.100:80 -s rr
[root@DR-server ~]# ipvsadm -A  -f 66  -p 3000

#修改
[root@DR-server ~]# ipvsadm -E -t 192.168.35.100:80  -s wrr -p 3000

#删除
[root@DR-server ~]# ipvsadm -D -t 192.168.35.100:80
[root@DR-server ~]# ipvsadm -D -f 66

2.管理集群中RealServer的曾增删改

复制代码
-a		#添加realserver
-e		#更改realserver
-t		#tcp协议
-u		#udp协议
-f		#火墙 标签
-r		#realserver地址
-g		#直连路由模式
-i		#ipip隧道模式
-m	    #nat模式
-w	    #设定权重
-Z	    #清空计数器
-C	    #清空lvs策略
-L	    #查看lvs策略
-n	    #不做解析
--rate :输出速率信息

#添加
[root@DR-server ~]# ipvsadm -a -t 192.168.35.100:80 -r 192.168.221.30 -m
[root@DR-server ~]# ipvsadm -a -t 192.168.35.100:80 -r 192.168.221.40 -m -w 2

#更改
[root@DR-server ~]# ipvsadm -e -t 192.168.35.100:80 -r 192.168.221.30 -m -w 1
[root@DR-server ~]# ipvsadm -e -t 192.168.35.100:80 -r 192.168.221.30 -i -w 1

#删除
[root@DR-server ~]# ipvsadm -d -t 192.168.35.100:80 -r 192.168.221.30

[root@DR-server ~]# ipvsadm -Ln
[root@DR-server ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  192.168.35.100:80                   0        0        0        0        0
  -> 192.168.221.30:80                     0        0        0        0        0
  -> 192.168.221.40:80                     0        0        0        0        0
#CPS: 每秒连接数,表示服务器处理新连接的速率
#InPPS:每秒入站数据包数量,即从客户端发送到负载均衡器的数据包速率
#OutPPS: 每秒出站数据包数量,即从负载均衡器向后端服务器或客户端发送数据包的速率
#InBPS:每秒入站流量(字节),即从客户端到服务器的流量速率。
#OutBPS:每秒出站流量(字节),即从服务器到客户端的流量速率。

[root@DR-server ~]# ipvsadm -Z -t 192.168.35.20:80
[root@DR-server ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  192.168.35.20:80                    0        0        0        0        0
  -> 192.168.221.30:80                     0        0        0        0        0
  -> 192.168.221.40:80                     0        0        0        0        0

#清空策略
[root@DR-server ~]# ipvsadm -C

五.常见问题

Q1:在编写策略时,不清楚有没有残留策略存在?

解决方法:

在调度器(vsnode虚拟机)中用命令 ipvsadm -Ln 查看是否存在不需要的策略,

若存在,即编写新策略前用 ipvsadm -C 一键清除所有策略后在编写。

六.总结

LVS-NAT 模式本质上是一个 "一站式前厅经理" 的角色,它通过 NAT 技术实现了请求的分发和响应的伪装,让多台后端服务器可以协同对外提供服务。它的优点是配置简单、支持端口映射,后端 RS 可以是任意操作系统;但缺点也很明显 ------ 所有流量都要经过调度器,容易成为性能瓶颈,因此更适合中小规模的业务场景。

相关推荐
翼龙云_cloud2 小时前
阿里云渠道商:如何优化阿里云弹性伸缩的性能?
服务器·阿里云·云计算
我怎么又饿了呀2 小时前
CentOs 10 虚拟机安装【解决方法】VMware无法打开内核设备,未能启动虚拟机
linux·运维·centos
H Journey2 小时前
Centos与Ubuntu差异总结
linux·ubuntu·centos
阿拉伯柠檬2 小时前
Git原理与使用(一)
大数据·linux·git·elasticsearch·面试
冰冰的coco2 小时前
如何设置需要sudo的命令开机自启动
linux·运维·服务器
辞旧 lekkk2 小时前
【Linux】Linux进程控制(三)自主实现简易shell命令行解释器
linux·运维·服务器·学习·萌新
HIT_Weston2 小时前
119、【Ubuntu】【Hugo】首页板块配置:Template Lookup Order
linux·运维·ubuntu
wangt59522 小时前
Ubuntu22.04.5的网络配置在重启后被重置的问题
linux·运维·服务器
不被定义的程序猿2 小时前
如何使用docker搭建一个 aarch-linux-gun-gcc的交叉编译环境
linux·运维·服务器