Lvs
架构介绍
- Lvs全称:Linux Virtual Server(Linux虚拟服务器)
- 用户访问服务器时候,中间加一层服务器作为代理转发到后台多个真实服务器,做转发的这台服务器被叫做Lvs服务器。目的是实现负载均衡和隐藏真实服务器的IP地址作用。
- Lvs服务器可以配置为NAT模式或DR模式
NAT模式架构图
提示
- VIP全称:Virtual IP Address(虚拟IP地址)
- CIP全称:Client IP Address(客户端IP地址)
- RIP全称:Real IP Address(真实服务器IP地址)
| 流量方向 | 用到规则 | 作用 |
|---|---|---|
| 客户端 → LVS → Web (发起请求) | DNAT | 改目标 IP:VIP → 后端 RIP |
| Web → LVS → 客户端 (返回响应) | SNAT | 改源 IP:后端 RIP → VIP |
什么是DNAT和SNAT?
| 名称 | 全称 | 作用位置 | 修改什么 | 核心用途 | LVS-NAT 中角色 |
|---|---|---|---|---|---|
| DNAT | 目的网络地址转换 | 入站流量(请求) | 修改目标IP | 把访问VIP的请求,转发到后端真实服务器 | 客户端→LVS→Web:VIP 改成 RIP |
| SNAT | 源网络地址转换 | 出站流量(响应) | 修改源IP | 隐藏后端真实IP,统一用VIP回包给客户端 | Web→LVS→客户端:RIP 改成 VIP |
NAT模式案例
准备说明
- 实验过程都是用的vmware虚拟机进行模拟演练 >
- 当把Lvs服务器配置成NAT模式时,须服务器满足:有至少2块网卡,其中一块网卡连接到公网,另一块网卡连接到内网。
- 下面实验是由vmware虚拟机组成的实验环境。我的机器是1台本宿主机(即windows电脑本机),1台带有2块网卡的lvs虚拟机,2台web虚拟机。
NAT模式实验操作步骤:
- 网卡配置
- 配置Lvs服务器增加2块网卡,一块自动桥接网卡(vmnat0),一块nat网卡(vmnat8)
- 配置2台web服务器,都是一块nat模式网卡(vmnat8)
- 配置IP地址
- 配置lvs自动桥接网卡(vmnat0)的IP地址为192.168.73.65/24,另一块网卡(vmnat8)的IP地址为192.168.229.127/24
- 配置2台web服务器的IP地址为192.168.229.128/24和192.168.229.129/24
- 由于lvs有vmnat0桥接模式的网卡,本身是和windows电脑(ip地址为192.168.73.62)打通的,无需配置。
配置说明
- lvs配置2块网卡和2个IP地址,目的就是模拟一头接公网,一头接内网。
- 这里用2个局域网模拟。192.168.73.0/24(vmnat0)网段的作为公网,192.168.229.0/24(vmnat8)网段的作为内网。

- 进入虚拟机配置
shell
# LVS虚拟机配置
yum install ipvsadm -y # 安装ipvsadm工具
systemctl start ipvsadm # 启动ipvsadm服务
ipvsadm -A -t 192.168.73.65:80 -s rr # 创建一个NAT模式的Lvs服务器,VIP为192.168.73.65,端口为80,调度算法为轮询(rr)
ipvsadm -a -t 192.168.73.65:80 -r 192.168.229.128:80 -m
ipvsadm -a -t 192.168.73.65:80 -r 192.168.229.129:80 -m # 将lvs接受的请求服务转发给内网的2台web服务器 -m是nat模式
echo 1 >/proc/sys/net/ipv4/ip_forward # 开启路由转发功能
# 2台web服务器配置
yum install nginx -y # 提前安装nginx因为内网无法访问外网安装
systemctl start nginx # 启动nginx服务
route add -net 192.168.73.0 netmask 255.255.255.0 gw 192.168.229.127 # 配置路由,将返回给用户的流量给lvs再次转发到外网的用户Windows上 - 验证实验,访问VIP192.168.73.65:80,即可看到2台web服务器由于rr的轮询调度,分别被分配到不同的web服务器上
DR模式架构图
| 步骤 | 流量环节 | 源IP | 目的IP | 源MAC | 目的MAC | 核心动作 |
|---|---|---|---|---|---|---|
| 1 | 客户端请求 | 客户端公网/内网IP | VIP | 客户端MAC | LVS网卡MAC | 客户端访问VIP,二层先发给LVS |
| 2 | LVS调度转发 | 客户端IP | VIP | 不变(客户端/入口MAC) | 改成某一台RS的MAC | 只改目标MAC,IP全程不变,二层转发 |
| 3 | RS接收请求 | 客户端IP | VIP | LVS网卡MAC | RS网卡MAC | RS在lo回环绑定VIP,接收目的IP为VIP的包 |
| 4 | RS返回响应 | VIP | 客户端IP | RS网卡MAC | 网关MAC | 不经过LVS,直接找机房/局域网网关回包给客户端 |
DR模式案例
准备说明
- DR模式下,Lvs服务器,2台web服务器,都要有公网IP,也就是说模拟时候这3台服务器都要处于一个局域网。
- 与NAT模式最大的不同是,在于
数据返回时,Lvs服务器不再做返回时候转发,而是由web服务器直接返回给客户端。
DR模式实验操作步骤:
- IP配置
- lvs服务器,2台web服务器,都要处于同一局域网,模拟都处于公网有独立IP地址并且同段。这里我把3台机器网卡都用的是vmnat0桥接模式,分配了IP地址,如下。
- lvs服务器IP地址:192.168.73.65/24
- 2台web服务器IP地址:192.168.73.63/24和192.168.73.64/24
- windows电脑IP地址:192.168.73.62/24
- VIP地址:192.168.73.111/24
- 进入虚拟机配置
shell
# lvs配置绑定一个虚拟IP地址 ,外网 / 客户端访问 192.168.73.111 就能到 LVS
ifconfig ens33:0 192.168.73.111 broadcast 192.168.73.255 netmask 255.255.255.0 up
route add -host 192.168.73.111 dev ens33:0 # 核心作用:制告诉系统:访问VIP 192.168.73.111 时,必须从 ens33:0 这个虚拟网卡走,不能乱走物理网卡、不能走默认路由。
# 必关ICMP重定向
net.ipv4.conf.all.send_redirects = 0 # 所有网卡都禁止发重定向
net.ipv4.conf.default.send_redirects = 0 # 默认网卡规则禁止
net.ipv4.conf.ens33.send_redirects = 0 # 你业务网卡 ens33 单独禁止
# 若不关闭这些配置,用户访问一次之后,就绕过 LVS 直连 RS,负载均衡直接报废。
yum install ipvsadm -y # 安装ipvsadm工具
systemctl start ipvsadm # 启动ipvsadm服务
ipvsadm -A -t 192.168.73.111:80 -s rr # 创建一个DR模式的Lvs服务器,VIP为192.168.73.111,端口为80,调度算法为轮询(rr)
ipvsadm -a -t 192.168.73.111:80 -r 192.168.73.63:80 -g
ipvsadm -a -t 192.168.73.111:80 -r 192.168.73.64:80 -g # 将lvs接受的请求服务转发给内网的2台web服务器 -g是dr模式
# web服务器配置
yum install nginx -y #
systemctl start nginx # 启动nginx服务
ifconfig lo:0 192.168.73.111/32 # 在本机回环网卡绑定VIP,掩码必须 /32 只让自己认这个 VIP,不广播到其他网段。
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore # 别人发ARP 问VIP是谁 Rs→不回应
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce # RS 对外主动通告自己 IP 时,绝不把 VIP 广播出去 - 验证实验结果,访问VIP192.168.73.111:80,即可看到2台web服务器由于rr的轮询调度,分别被分配到不同的web服务器上
两种模式对比
| 对比维度 | LVS-NAT 模式 | LVS-DR 模式 |
|---|---|---|
| 转发工作层级 | 网络层(三层IP转发) | 数据链路层(二层MAC转发) |
| 流量走向 | 请求、响应双向都经过调度器 | 请求经调度器,响应直接回客户端 |
| VIP 部署位置 | 仅调度器配置VIP | 调度器 + 所有后端RS都配置VIP(回环网卡lo) |
| 端口映射支持 | 支持端口转换(如80→8080) | 不支持,VIP与RS服务端口必须一致 |
| 后端RS网关 | 必须指向LVS调度器内网IP | 不能指向调度器,使用原有默认网关 |
| 网络环境要求 | 可跨网段、跨三层 | 必须同二层广播域(同网段、同交换机) |
| ARP 配置 | 无需特殊ARP配置 | 需要内核参数抑制ARP,防止VIP地址冲突 |
| 性能瓶颈 | 调度器瓶颈严重,吞吐量低 | 仅处理入站请求,性能极高、无带宽瓶颈 |
| 后端节点容量 | 最多支持10~20台RS | 支持几十到上百台RS,扩展性强 |
| 配置复杂度 | 简单,后端无需特殊配置 | 中等,RS需配置回环VIP+调内核参数 |
| 真实IP隐藏 | 后端RS为私网,可隐藏真实地址 | 后端暴露公网/同网段IP,无法隐藏 |
| 适用场景 | 测试环境、小流量业务、需要端口映射 | 生产高并发Web/API、大流量集群服务 |
KeepAlived
介绍
- KeepAlived出现的目的是防止一台lvs挂掉后,导致整个集群瘫痪不可用。
- 大多情况下,会部署2台lvs服务器,1主1备模式,正常情况下只有主节点工作,备节点待命。这两台lvs服务器用KeepAlived软件进行相互监听,当主lvs挂掉后,备lvs会自动切换为主lvs。保证了集群的高可用(HA)。
KeepAlived实验案例
DR模式主节点故障演练
- 准备实验环境:4台服务器,2台lvs服务器,2台web服务器,1台windows电脑。(只需在上面dr模式实验再多一个lvs服务器即可)
- 模拟主节点故障,备节点会自动切换为主节点。
- 验证第二台备节点是否成功切换为主节点。
实验步骤
- 配置2台lvs服务器
shell
yum install keepalived -y # 安装keepalived工具,不用装ipvsadm工具因为keepalived内核包含了ipvs模块的功能
systemctl start keepalived # 启动keepalived服务
vim /etc/keepalived/keepalived.conf # 编辑keepalived配置文件如下 shell
# 2台lvs的配置文件都是如下,只是备节点的文件第8行state改为BACKUP
! Configuration File for keepalived
global_defs {
router_id Director1 # 两台节点此ID必须不同
}
vrrp_instance VI_1 {
state MASTER # 备节点改为 BACKUP
interface ens33 # 心跳与绑定VIP的网卡
virtual_router_id 51 # 主备节点必须完全一致
priority 150 # 备节点优先级需低于主节点
nopreempt # 当原始的主节点挂了恢复的时候,不会自动切换为主节点尽管priority优先级高
advert_int 1 # VRRP心跳广播间隔,单位秒
authentication {
auth_type PASS
auth_pass 1111 # 主备认证密码必须一致(1-8位)
}
virtual_ipaddress {
192.168.73.100/24 dev ens33 # 对外服务的浮动VIP (以前需要手动添加vip,keepalived会自动添加)
}
}
# LVS 负载均衡虚拟服务配置(DR模式)
virtual_server 192.168.73.100 80 {
delay_loop 3 # 后端RS健康检查轮询间隔,3秒
lb_algo rr # LVS调度算法:轮询(Round Robin)
lb_kind DR # LVS工作模式:直接路由DR模式
protocol TCP
# 后端真实服务器1
real_server 192.168.73.63 80 {
weight 1
TCP_CHECK {
connect_timeout 3 # TCP健康检查超时时间,3秒
}
}
# 后端真实服务器2
real_server 192.168.73.64 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
} - 启动2台web服务器
shell
yum install nginx -y # 安装nginx
systemctl start nginx # 启动nginx服务
ifconfig lo:0 192.168.73.111/32 # 在本机回环网卡绑定VIP,掩码必须 /32 只让自己认这个 VIP,不广播到其他网段。
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore # 别人发ARP 问VIP是谁 Rs→不回应
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce # RS 对外主动通告自己 IP 时,绝不把 VIP 广播出去 - 停止主lvs服务器,模拟主节点故障
shell
systemctl stop keepalived # 停止keepalived服务 - 查看备节点是否成功切换为主节点
keepalived脑裂问题
什么是脑裂?
- 当联系2个节点的“心跳线"断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。
- 由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像"裂脑人"一样,争抢“VIP”、争抢"共享资源"、争起"应用服务"。两个节点都认为自己是主节点,最终会导致两边服务都起不来,或者2边"服务"都起来了,但同时读写"共享存储",导致数据损坏。(例如用户发起对同一个数据进行增删操作,一台lvs增操作,另一台lvs执行删操作)。
- 解决: 配置2条心跳线,保持2个节点的联系.配置第三方仲裁节点。