集群
集群分类
-
按分发器类型分 -- LVS集群 -- Nginx集群 -- haproxy集群 -- F5集群
-
按业务类型分 -- web集群 -- 数据库集群 -- 缓存集群 -- ...
-
按功能分类:
-
负载均衡集群 -- LBC: 分担服务的总体压力
-
高可用集群 -- HAC: 尽可能的保障服务状态的可用性
-
高性能运算集群 -- HPC: 提供单台服务器提供不了的计算能力
-
LVS
LVS是Linux Virtual Server 的简称,也就是 Linux 虚拟服务器。
实现4层负载均衡,性能强大,适合日常处理大并发的大型网络架构使用;
所谓四层负载均衡 ,也就是主要通过报文中的目标地址和端口,实现负载均衡;
七层负载均衡 ,也称为"内容交换",也就是主要通过报文中的真正有意义的应用层内容。

LVS和Nginx和区别
LVS优缺点
LVS的优点
-
抗负载能力强、是工作在传输层上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,对内存和 cpu 资源消耗比较低。
-
配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。
-
工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如 LVS+Keepalived。
-
无流量,LVS 只分发请求,而流量并不从它本身出去,这点保证了均衡器 IO 的性能不会受到大流量的影响。
-
应用范围比较广,因为 LVS 工作在传输层,所以它几乎可以对所有应用做负载均衡,包括 http、数据库、在线聊天室等等。
LVS的缺点
-
软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是 Nginx、HAProxy+Keepalived 的优势所在。
-
如果是网站应用比较庞大的话,LVS/DR+Keepalived 实施起来就比较复杂了,相对而言,Nginx/HAProxy+Keepalived就简单多了。
Nginx 负载均衡
Nginx 负载均衡主要是对七层网络通信模型中的第七层应用层上的 http、https 进行支持。
Nginx 是以反向代理的方式进行负载均衡的。反向代理(Reverse Proxy)方式是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
Nginx 实现负载均衡的分配策略有很多,Nginx 的 upstream 目前支持以下几种方式:
-
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
-
weight:指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
-
ip_hash:每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
-
fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
-
url_hash(第三方):按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,后端服务器为缓存时比较有效。
Nginx 的优点
-
跨平台:Nginx 可以在大多数 Unix like OS编译运行,而且也有 Windows 的移植版本
-
配置异常简单:非常容易上手。配置风格跟程序开发一样,神一般的配置
-
非阻塞、高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数
-
事件驱动:通信机制采用 epoll 模型,支持更大的并发连接
-
Master/Worker 结构:一个 master 进程,生成一个或多个 worker 进程
-
内存消耗小:处理大并发的请求内存消耗非常小。在3万并发连接下,开启的10个 Nginx 进程才消耗150M 内存(15M*10=150M)
-
内置的健康检查功能:如果 Nginx 代理的后端的某台 Web 服务器宕机了,不会影响前端访问
-
节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头
-
稳定性高:用于反向代理,宕机的概率微乎其微
Nginx 的缺点
-
Nginx 仅能支 持http、https 和 Email 协议,这样就在适用范围上面小些,这个是它的缺点。
-
对后端服务器的健康检查,只支持通过端口来检测,不支持通过 ur l来检测。
-
不支持 Session 的直接保持,但能通过 ip_hash 来解决。
LVS四种模式
-
NAT模式:
-
使用IP地址转换,将源IP和目标IP进行转换,实现负载均衡;
-
请求(入)和响应(出)都会经过负载均衡器;
-
负载均衡器会成为一个流量的瓶颈;建议10台以内的服务器使用;
-
-
TUN模式:隧道模式,报文封装,实现负载均衡;
-
请求会经过负载均衡器,响应直接返回给客户端;
-
但是需要每台后端真实服务器都要有独立的公网IP;
-
适合跨机房,跨网段的负载均衡;
-
-
DR模式(最常用):直接路由模式,使用MAC替换,实现负载均衡;
-
可以实现100+服务器的负载均衡;
-
请求会经过负载均衡器,响应直接返回给客户端;
-
不需要独立IP
-
-
FULLNAT模式:多层地址转换,超大型架构的负载均衡;(基于NAT实现,LVS 本身不支持,需要额外对内核打补丁后才能使用)
-
通过双重地址转换实现负载均衡,客户端和后端服务器双向请求都经过负载均衡器;
-
提供了跨网段负载均衡功能。
-
LVS常用缩写解释
名称 | 含义 |
---|---|
LB(Load Balancer) | 负载均衡 |
HA(High Available) | 高可用 |
Cluster | 集群 |
DS(Director Server) | 前端负载均衡节点服务器 |
RS(Real SERVER) | 后端真实服务器 |
CIP(Client IP) | 客户端IP地址 |
VIP(Virtual IP) | 负载均衡对外提供访问的IP地址,一般负载均衡IP都会通过Viirtual IP实现高可用 |
RIP(RealServer IP) | 负载均衡后端的真实服务器IP地址 |
DIP(Director IP) | 主要用于和内部主机通讯的 IP 地址 |
LVS负载均衡集群-ipvsadm
javascript
# 安装ipvsadm工作
yum install ipvsadm -y或者
apt install ipvsadm -y
# 查看是否在内核中
lsmod |grep ip_vs
# 加载ip_vs内核模块,提供负载均衡的功能,如果上面的命令没有反应可以使用
modprobe手动添加
modprobe ip_vs
# 如果编译lvs,需要使用内核,先查看内核版本
uname -r
# 会显示以下版本3.10.0-1160.71.1.el7.x86_64
# 使用 yum 包管理器安装内核开发包
yum install kernel-devel -y
# 创建软链接,将当前内核源码目录链接到/usr/src/linux
ln -s /usr/src/kernels/3.10.0-1160.114.2.el7.x86_64 /usr/src/linux
ls -l /usr/src/
总用量 0
drwxr-xr-x. 2 root root 6 4月 11 2018 debug
drwxr-xr-x. 5 root root 113 4月 2 08:16 kernels
lrwxrwxrwx 1 root root 45 4月 4 18:12 linux -> /usr/src/kernels/3.10.0-1160.71.1.el7.x86_64
安装完成之后会生成一个同名的命令工具,我们需要使用该命令来配置LVS和算法
# 用法
ipvsadm 选项 服务器地址 -s 算法
ipvsadm 选项 服务器地址 -r 真是服务器地址 [工作模式] [权重]
# 选项
-A 添加一个虚拟服务器
-E 编辑一个虚拟服务器
-D 删除一个虚拟服务器
-C 清空虚拟服务器列表
-R 从标准输入中还原虚拟服务器规则
-S 将虚拟服务器规则保存至标准输出
-a 添加一个真实服务器
-e 编辑一个真实服务器
-d 删除一个真实服务器
-l/L 查看分发列表
-t 使用tcp协议
-u 使用udp协议
-s 指定算法
-r 设置真实服务器的IP地址和端口信息
-g DR模式
-i tun模式
-m nat模式
-w 设置真实服务器的权重
-c 查看连接状态,需要配合L使用
-n 以数字形式输出
# 比如,添加一个虚拟服务器,算法为rr,所有使用tcp协议访问192.168.221.10:80
的请求,最终都被NAT模式转发给了192.168.221.20和192.168.221.30的80端口
ipvsadm -A -t 192.168.221.10:80 -s rr
ipvsadm -a -t 192.168.221.10:80 -r 192.168.221.20:80 -m
ipvsadm -a -t 192.168.221.10:80 -r 192.168.221.30:80 -m
# 查看规则
ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP localhost.localdomain:http rr
-> 192.168.221.20:http Masq 1 0 0
-> 192.168.221.30:http Masq 1 0 0
ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.221.10:80 rr
-> 192.168.221.20:80 Masq 1 0 0
-> 192.168.221.30:80 Masq 1 0 0
# 查看调度状态
[root@zuolaoshi ~]# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
NAT模式
客户端请求(CIP、VIP)-> 负载均衡器(VIP、RIP)-> 真实服务器(RIP、VIP)-> 负载均衡器(VIP、CIP)-> 客户端
负载均衡器使用NAT模式需要两张网卡:
-
A网卡让客户端访问,B网内网访问;
-
LVS实现地址转换;
配置一个LVS NAT的web集群(需要三台机器)
配置两个网卡(在192.168.221.10上配置)
* 192.168.221.10 NAT
* 192.168.1.128 仅主机,且为内部网关
真实服务器(两个)
192.168.221.20
192.168.221.30
javascript
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux,编辑配置文件
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 挂载光盘
mount /dev/cdrom /media
## 配置LVS(192.168.221.10)
# 安装ipvsadm软件包
yum install ipvsadm -y
# 开启ip转发(NAT模式必需)
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# 生效配置
sysctl -p
# 如果报错,添加ip_conntrack模块
modprobe ip_conntrack
# 配置第二张网卡(添加一个仅主机的网络)
ens33=192.168.221.10
ens36=192.168.1.128
其中网络配置文件可以修改成:
vim /etc/sysconfig/network-scripts/ifcfg-ens36
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=no # 通常第二块网卡不作为默认路由,设为no
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=no
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens36 # 改为第二块网卡名称
DEVICE=ens36 # 设备名,与文件名一致
ONBOOT=yes
IPADDR=192.168.1.128 # 第二块网卡IP
NETMASK=255.255.255.0
#GATEWAY=192.168.1.2 # 若该网段需要网关,取消注释并填写(如仅主机模式网关)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 两台真实服务器也需要同时把网络从NAT模式修改成仅主机模式
192.168.221.20 ------------> 192.168.1.20
192.168.221.30 ------------> 192.168.1.30
网关直接改成192.168.1.128,原本的注释掉
#或者可以直接写:
[root@RS1 ~]# route add default gw 192.168.1.128
[root@RS2 ~]# route add default gw 192.168.1.128
## 配置LVS NAT规则
# 如果需要清空之前的请输入
ipvsadm -C
# 设置入口ip地址:VIP(在192.168.221.10)
ipvsadm -A -t 192.168.221.10:80 -s rr
ipvsadm -a -t 192.168.221.10:80 -r 192.168.1.20:80 -m
ipvsadm -a -t 192.168.221.10:80 -r 192.168.1.30:80 -m
# 保存规则(可以省略)
ipvsadm -S > /etc/sysconfig/ipvsadm
# 启动服务
systemctl start ipvsadm && systemctl enable ipvsadm
# 在两个后端真实服务器上安装web服务,生成测试页面
RS1
yum install httpd -y
echo "<h1>RS1 - 192.168.221.20</h1>" > /var/www/html/index.html
systemctl start httpd
RS2重复同样步骤
客户端多次访问curl 192.168.221.10
浏览器访问192.168.221.10
TUN隧道模式
原理:客户端请求源地址(CIP,VIP)-> LVS负载均衡器(DIP【CIP,VIP】,RIP)-> 真实服务器(CIP,VIP)
虚拟机 | 虚拟机ip |
---|---|
VIP------ens37 | 192.168.221.128 |
LVS------ens33 | 192.168.221.10 |
真实服务器1 | 192.168.221.20 |
真实服务器2 | 192.168.221.30 |
一、配置 LVS 负载均衡器(Director)
javascript
# 1.安装软件
yum install -y ipvsadm
# 2. 加载IP隧道模块
modprobe ipip
echo "ipip" >> /etc/modules-load.d/ipvs.conf
# 3. 配置VIP
# 添加VIP
ip addr add 192.168.221.128/32 dev tunl0
# 启用tunl0接口
ip link set dev tunl0 up
# 配置路由(可选,视网络环境而定)
ip route add 192.168.221.128/32 dev tunl0
# 4.配置LVS规则
# 清除现有规则
ipvsadm -C
# 添加虚拟服务
ipvsadm -A -t 192.168.221.128:80 -s rr
# 添加后端真实服务器(TUN模式)
ipvsadm -a -t 192.168.221.128:80 -r 192.168.221.20:80 -i
ipvsadm -a -t 192.168.221.128:80 -r 192.168.221.30:80 -i
# 保存配置
ipvsadm -S > /etc/sysconfig/ipvsadm
# 5.配置系统参数
# 启用IP转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# 禁用ICMP重定向
echo "net.ipv4.conf.all.send_redirects = 0" >> /etc/sysctl.conf
echo "net.ipv4.conf.default.send_redirects = 0" >> /etc/sysctl.conf
echo "net.ipv4.conf.ens33.send_redirects = 0" >> /etc/sysctl.conf
# 应用配置
sysctl -p
# 6.设置开机自启
systemctl enable ipvsadm
systemctl start ipvsadm
二、配置后端 Web 服务器(Real Server)
在所有 Web 服务器上执行以下操作
javascript
1、安装 Web 服务器
yum install -y httpd
systemctl enable httpd
systemctl start httpd
2、创建测试页面(区分不同服务器)
# 在192.168.221.20上
echo "<h1>Web Server 1 (192.168.221.20)</h1>" > /var/www/html/index.html
# 在192.168.221.30上
echo "<h1>Web Server 2 (192.168.221.30)</h1>" > /var/www/html/index.html
3、加载 IP 隧道模块
modprobe ipip
echo "ipip" >> /etc/modules-load.d/ipvs.conf
4、配置 VIP(注意:不设置 ARP 响应)
# 添加VIP到tunl0接口
ip addr add 192.168.221.128/32 dev tunl0
# 启用tunl0接口
ip link set dev tunl0 up
# 关闭tunl0的ARP响应
echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
配置系统参数
# 禁用反向路径过滤
echo "net.ipv4.conf.all.rp_filter = 0" >> /etc/sysctl.conf
echo "net.ipv4.conf.default.rp_filter = 0" >> /etc/sysctl.conf
echo "net.ipv4.conf.tunl0.rp_filter = 0" >> /etc/sysctl.conf
echo "net.ipv4.conf.ens33.rp_filter = 0" >> /etc/sysctl.conf
# 应用配置
sysctl -p
三、验证配置
在 LVS 服务器上查看 IPVS 配置
javascript
ipvsadm -Ln
从浏览器访问 VIP(192.168.221.128),多次刷新页面,应该能看到不同 Web 服务器
的内容,证明负载均衡生效。
# 使用curl测试
curl http://192.168.221.20
curl 192.168.221.30
# 如果遇到问题,可以查看系统日志排查:
tail -f /var/log/messages
四、注意事项
-
TUN 模式要求所有服务器都支持 IP 隧道(IPIP)
-
确保防火墙规则允许相关流量通过(80 端口、IPIP 协议)
-
所有服务器必须能够相互通信
-
对于生产环境,建议添加监控和故障转移机制
-
可以根据需要调整 LVS 的调度算法(当前使用的是 rr - 轮询)
通过以上步骤,你应该已经成功在 CentOS 上部署了基于 LVS TUN 模式的 Web 集群。
LVS-DR模式
DR直接路由模式:不修改客户请求的源地址和目标地址,直接通过MAC将请求转发给RS(真实服务器),RS需要设置ARP抑制;
虚拟机 | 虚拟机ip |
---|---|
VIP------ens37 | 192.168.221.128 |
LVS------ens33 | 192.168.221.10 |
真实服务器1 | 192.168.221.20 |
真实服务器2 | 192.168.221.30 |
我是直接在TUN基础上改的
javascript
# 在LVS负载均衡上(192.168.221.10)配置
ipvsadm -C
ipvsadm -A -t 192.168.221.128:80 -s rr
ipvsadm -a -t 192.168.221.128:80 -r 192.168.221.20:80 -g
ipvsadm -a -t 192.168.221.128:80 -r 192.168.221.30:80 -g
# 查看LVS规则,看看TUN是否变成了Route
ipvsadm -ln
# 真实服务器设置(192.168.221.20和192.168.22.30同样设置)
# 配置 VIP 到回环接口
ifconfig lo:0 192.168.221.128 netmask 255.255.255.255 up
# 设置内核参数以关闭 ARP 响应(临时设置)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
# 或者可以永久设置(临时设了的话这个就省略)
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
最后执行sysctl -p立即生效
# 然后浏览器测试两个真实服务器能不能正常提供页面
# 最后浏览器测试LVS能不能访问到真实服务器
浏览器输入192.168.221.128
HAProxy
一款性能强大的负载均衡软件,同时支持四层和七层负载均衡;
javascript
# 直接在Ubuntu(192.168.221.21)安装
apt install haproxy -y
vim /etc/haproxy/haproxy.cfg
+++++++++++++++++++++++++++++输入O在文本最后添加
# 定义前端和后端设置
frontend test
bind 192.168.221.21:80
stats uri /haproxy?stats
default_backend web-servers
backend web-servers
balance roundrobin # 轮询算法
server web1 192.168.221.20:80
server web2 192.168.221.30:80
# stats auth 指令为登录用户指定用户名和密码,在浏览器访问的时候加上8080端口
即可输入用户名和密码
listen stats
bind *:8080
stats enable
stats uri /
stats refresh 5s
stats realm Haproxy\ Statistics
stats auth test:root123
+++++++++++++++++++++++++++++++++++++++++++
systemctl restart haproxy
最后弹出是这个界面就对了

HAProxy 支持两种代理模式 TCP(四层)和HTTP(七层),也是支持虚拟主机的。
HAProxy 的优点能够补充 Nginx 的一些缺点,比如支持 Session 的保持,Cookie 的引导;同时支持通过获取指定的 url 来检测后端服务器的状态。
HAProxy 跟 LVS 类似,本身就只是一款负载均衡软件;单纯从效率上来讲 HAProxy 会比 Nginx 有更出色的负载均衡速度,在并发处理上也是优于 Nginx 的。
HAProxy 支持 TCP 协议的负载均衡转发,可以对 MySQL 读进行负载均衡,对后端的 MySQL 节点进行检测和负载均衡,大家可以用 LVS+Keepalived 对 MySQL 主从做负载均衡。
HAProxy 负载均衡策略非常多:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)。
Haproxy有8种负载均衡算法(balance)
分别如下:
1.balance roundrobin # 轮询,软负载均衡基本都具备这种算法
2.balance static-rr # 根据权重,建议使用
3.balance leastconn # 最少连接者先处理,建议使用
4.balance source # 根据请求源IP,建议使用
5.balance uri # 根据请求的URI
6.balance url_param,# 根据请求的URl参数'balance url_param' requires an URL parameter name
7.balance hdr(name) # 根据HTTP请求头来锁定每一次HTTP请求
8.balance rdp-cookie(name) # 根据据cookie(name)来锁定并哈希每一次TCP请求
LVS四种模式的区别
特性 | NAT 模式 | DR 模式 | TUN 模式 | FULLNAT 模式 |
---|---|---|---|---|
核心原理 | 修改目标IP地址 | 修改目标MAC地址 | IP隧道封装 | 双向修改IP地址(源和目标) |
请求/响应路径 | 都必须经过LVS | 请求经过LVS,响应直接从RS返回给用户 | 请求经过LVS,响应直接从RS返回给用户 | 都必须经过LVS |
LVS压力 | 大(处理所有出入流量) | 小(只处理入站请求) | 中(需要封装/解封装) | 最大(处理所有流量,且需额外转换) |
Real Server配置 | 网关必须指向LVS的DIP | 必须在同一个物理网络,配置VIP在lo口,且抑制ARP | 必须支持IP隧道,拥有公网IP | 无特殊要求,网关指向其原路由器即可 |
网络要求 | LVS和RS在同一个LAN | LVS和RS在同一个广播域(通常同一个LAN) | LVS和RS可以跨机房、跨地域 | LVS和RS可以在任意网络环境 |
性能 | 较低(有往返流量瓶颈) | 最高(响应不经LVS,无瓶颈) | 高(响应不经LVS,但隧道有开销) | 较低(同NAT,且有额外开销) |
典型应用场景 | 早期或小规模应用,RS数量不多 | 最常用、性能要求高的生产环境 | 异地容灾、全局负载均衡 | 云环境或网络结构复杂,无法更改RS路由的场景 |
各模式工作流程简述与关键点
1. NAT 模式
- 工作流程:
客户端发送请求到 LVS 的 VIP。
LVS 收到请求,通过负载均衡算法选择一个 Real Server,将请求包的目标 IP 从 VIP 改为 RS 的 IP,然后转发。
RS 处理请求,准备返回响应。注意:因为RS的网关指向LVS,所以响应包会发回给LVS。
LVS 收到 RS 的响应包,将源 IP 从 RS 的 IP 改回 VIP,然后返回给客户端。
- 关键点 :LVS 是进出流量的瓶颈。RS 必须和 LVS 在同一个 LAN,且网关要指向 LVS。
2. DR 模式 - 最常用
- 工作流程:
客户端发送请求到 LVS 的 VIP。
LVS 收到请求,通过负载均衡算法选择一个 Real Server。它不修改IP地址,而是修改目标MAC地址为选定RS的MAC地址,然后转发。
RS 的网卡上配置了VIP(通常是在lo回环接口上),它收到目标MAC是自己的、目标IP是VIP的包,会进行处理。
RS 处理完请求后,直接 将响应包源IP设为VIP,目标IP设为客户端IP,通过本地路由发送出去,不再经过LVS。
- 关键点 :响应不经过LVS,性能极高。但要求所有 RS 和 LVS 必须在同一个广播域(二层可达),且 RS 需要特殊配置以隐藏 VIP,避免ARP冲突。
3. TUN 模式
- 工作流程:
客户端发送请求到 LVS 的 VIP。
LVS 收到请求,将原始IP包封装在一个新的IP包中(IP over IP),新的IP包的目标IP是远端的RS的公网IP,然后转发。
RS 收到封装包后,进行解封装,得到原始请求包(目标IP是VIP)。因为RS的lo口也配置了VIP,所以它会处理这个请求。
RS 处理完请求后,直接将响应包返回给客户端。
- 关键点:解决了 DR 模式的跨网络限制,适合异地容灾。但 RS 必须支持 IP隧道 协议,且拥有公网IP,封装和解封装有额外CPU开销。
4. FULLNAT 模式 - 非标准模式,但非常实用
- 工作流程:
客户端发送请求到 LVS 的 VIP。
LVS 收到请求,不仅将目标IP从VIP改为RS的IP,还将源IP从客户端的IP改为LVS的内部IP。
RS 收到请求,看到源IP是LVS的内部IP,目标IP是自己的IP。它处理请求并将响应发回给"源IP"(即LVS)。
LVS 收到响应后,再将目标IP从LVS的内部IP改回客户端的真实IP,源IP从RS的IP改回VIP。
- 关键点 :解耦了LVS和RS的网络部署。RS 可以处在任何网络位置,完全不需要知道LVS的存在。这是阿里云等大型云厂商对LVS的重要贡献。缺点是破坏了客户端的真实源IP(需要通过TOA等技术在第七层弥补)。
总结与选择建议
-
追求极致性能,且网络可控 :首选 DR 模式。
-
RS在异地或跨复杂网络 :考虑 TUN 模式。
-
云环境或网络结构复杂,不想改动RS配置 :使用 FULLNAT 模式(需要支持该特性的LVS版本)。
-
NAT 模式:一般只作为理解原理或临时测试使用,生产环境较少见。