LVS四种模式及部署NAT、DR模式集群

发布于:2025-07-17 ⋅ 阅读:(20) ⋅ 点赞:(0)

1、lvs简介

LVS:Linux Virtual Server,负载调度器,内核集成,章文嵩,阿里四层SLB(ServerLoadBalance)是基于LVS+keepalived实现

LVS 官网: http://www.linuxvirtualserver.org/

LVS 相关术语
                        VS: Virtual Server,负责调度
                        RS:RealServer,负责真正提供服务

2、lvs集群体系结构

工作原理:
VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS

3、LVS概念

        VS:Virtual Server---------------------(调度器)
        RS:Real Server -----------------------(真实资源主机)
        CIP:Client IP----------------------------(用户的IP)
        VIP: Virtual serve IP VS外网的IP ---(客户访问的IP)
        DIP: Director IP VS内网的IP-----------(调度器与主机的IP)
        RIP: Real server IP ------------------------(真实资源主机的IP)
访问流程:CIP <--> VIP == DIP <--> RIP

4、lvs的调度算法

lvs调度算法类型

        ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态被分为两种:静态方法和动态方法
        静态方法:仅根据算法本身进行调度,不考虑RS的负载情况
        动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度

lvs静态调度算法

        1、RR:roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
        2、WRR:Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
        3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
        4、DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商

lvs动态调度算法

        主要根据RS当前的负载状态及调度算法进行调度Overhead=value较小的RS会被调度
1、LC:least connections(最少链接发)
         适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活动链接数)
2、WLC:Weighted LC(权重最少链接)
        默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
3、SED:Shortest Expection Delay,
        初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight
 但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接
4、NQ:Never Queue,第一轮均匀分配,后续SED
5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS

在4.15版本内核以后新增调度算法

1.FO(Weighted Fai Over)调度算法:常用作灰度发布
        在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F OVERLOAD标志)的且权重最高的真实服务器,进行调度。
        当服务器承接大量链接,我们可以对此服务器进行过载标记(IP_VS_DEST_F OVERLOAD),那么vs调度器就不会把链接调度到有过载标记的主机中。
 
2.OVF(Overflow-connection)调度算法

        基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条件:
        未过载(未设置IP_VS_DEST_F OVERLOAD标志)
        真实服务器当前的活动连接数量小于其权重值
        其权重值不为零

5、 lvs集群的类型

vs-nat: 修改请求报文的目标IP,多目标IP的DNAT
lvs-dr: 操纵封装新的MAC地址
lvs-tun: 在原请求IP报文之外新加一个IP首部
lvs-fullnat: 修改请求报文的源和目标IP

nat模式

Ivs-nat:

         本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
        RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
        请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
        支持端口映射,可修改请求报文的目标PORT
        VS必须是Linux系统,RS可以是任意OS系统

nat模式数据逻辑

1.客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口
(9000port)
2.VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口
3.RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口(9000port)
4.VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)
5.VS服务器把修改过报文的响应数据包回传给客户端
6.lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞 

        客户请求到达vip后进入PREROUTING,在没有ipvs的时候因该进入本机INPUT,当IPVS存在后访问请求在通过PREROUTING后被ipvs结果并作nat转发
        因为ipvs的作用点是在PREROUTING和INPUT链之间,所以如果在prerouting中设定规则会干扰ipvs的工作。所以在做lvs时要把iptables的火墙策略全清理掉。

 部署NAT模式集群

1.Director 服务器采用双网卡,一个是桥接网卡连接外网,一个是仅主机网卡与后端Web服务器相连
2.Web服务器采用仅主机网卡与director相连
3.Web服务器网关指向192.168.0.100
4.后端web服务器不需要连接外网

实验环境

主机名 IP VIP 角色
LVS 192.168.0.100 仅主机 172.25.254.100 调度器(VS)
RS1 192.168.0.101 仅主机,GW 192.168.0.100 null 真实服务器(RS)
RS2 192.168.0.102 仅主机,GW 192.168.0.100 null 真实服务器(RS)
client 172.25.254.111 nat 测试机

配置4台主机的环境命令

LVS:

添加一台主机(仅主机模式)

用自动化脚本设置IP

[root@aa ~]# vmset.sh eth0 172.25.254.100 LVS.timinglee.org
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)
[root@aa ~]# vmset.sh eth1 192.168.0.100 LVS.timinglee.org
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)

查看IP

关闭防火墙

[root@LVS ~]# systemctl stop firewalld
client:

用自动化脚本设置IP

[root@aa ~]# vmset.sh eth0 172.25.254.111 client.timinglee.org
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)

查看IP

关闭防火墙

[root@client ~]# systemctl stop firewalld
RS1:

设置成仅主机模式

用自动化脚本设置IP

[root@aa ~]# vmset.sh eth0 192.168.0.101 RS1.timinglee.org
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)

查看IP

设置网关(网关的IP是LVS主机的仅主机的IP)

[root@RS1 ~]# vim /etc/NetworkManager/system-connections/

[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
method=manual
address1=192.168.0.101/24,192.168.0.100
dns=8.8.8.8

[root@RS1 ~]# nmcli connection reload 
[root@RS1 ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@RS1 ~]# 

关闭防火墙打开Httpd 

[root@RS1 ~]# systemctl stop firewalld
[root@RS1 ~]# systemctl start httpd

在/var/www/html/index.html写入内容

[root@RS1 ~]# echo "RS1 server - 192.168.0.101" > /var/www/html/index.html
RS2:

设置成仅主机模式、

用自动化脚本设置IP

[root@aa ~]# vmset.sh eth0 192.168.0.102 RS2.timinglee.org
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)

查看IP

 设置网关(网关的IP是LVS主机的仅主机的IP)

[root@RS2 ~]# vim /etc/NetworkManager/system-connections/


[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
method=manual
address1=192.168.0.102/24,192.168.0.100
dns=8.8.8.8


[root@RS2 ~]# nmcli connection reload 
[root@RS2 ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@RS2 ~]# 

关闭防火墙打开Httpd

[root@RS2 ~]# systemctl stop firewalld
[root@RS2 ~]# systemctl start httpd

在/var/www/html/index.html写入内容

[root@RS2 ~]# echo "RS2 server - 192.168.0.102" > /var/www/html/index.html

环境配置完毕!!

在LVS中启用内核路由功能

[root@LVS ~]# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ip_forward.conf
[root@LVS ~]# sysctl --system
net.ipv4.ip_forward = 1

 在LVS中安装ipvsadm

[root@LVS ~]# yum install ipvsadm -y

在LVS中添加调度策略

[root@LVS ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@LVS ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.101:80 -m
[root@LVS ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.102:80 -m

查看策略

[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 rr
  -> 192.168.0.101:80             Masq    1      0          0         
  -> 192.168.0.102:80             Masq    1      0          0  

 

保存规则

[root@LVS ~]# ipvsadm -Sn
-A -t 172.25.254.100:80 -s rr
-a -t 172.25.254.100:80 -r 192.168.0.101:80 -m -w 1
-a -t 172.25.254.100:80 -r 192.168.0.102:80 -m -w 1
[root@LVS ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm-config 
[root@LVS ~]# cat /etc/sysconfig/ipvsadm-config 
-A -t 172.25.254.100:80 -s rr
-a -t 172.25.254.100:80 -r 192.168.0.101:80 -m -w 1
-a -t 172.25.254.100:80 -r 192.168.0.102:80 -m -w 1

删除所有规则

[root@LVS ~]# ipvsadm -C
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

重新加载规则

[root@LVS ~]# ipvsadm -R < /etc/sysconfig/ipvsadm-config 
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 rr
  -> 192.168.0.101:80             Masq    1      0          0         
  -> 192.168.0.102:80             Masq    1      0          0         

以上操作均为临时,如果想开机启动

[root@LVS ~]# systemctl enable --now ipvsadm.service

在client主机测试

[root@client ~]# for N in {1..6};do curl 172.25.254.100;done
RS2 server - 192.168.0.102
RS1 server - 192.168.0.101
RS2 server - 192.168.0.102
RS1 server - 192.168.0.101
RS2 server - 192.168.0.102
RS1 server - 192.168.0.101
[root@client ~]# 

修改为权重调用算法

[root@LVS ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr
[root@LVS ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.101:80 -m -w 2
[root@LVS ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.102:80 -m -w 1

#测试效果
[root@client ~]# for N in {1..6};do curl 172.25.254.100;done
RS2 server - 192.168.0.102
RS1 server - 192.168.0.101
RS1 server - 192.168.0.101
RS2 server - 192.168.0.102
RS1 server - 192.168.0.101
RS1 server - 192.168.0.101

部署NAT模式集群完成!!!

部署DR模式集群

 实验环境

主机名 IP VIP 角色
client

172.25.254.10    nat

GW   172.25.254.100

null 测试主机
router

172.25.254.100     nat

192.168.0.10         仅主机

null 路由器
LVS

192.168.0.200,   仅主机

GW 192.168.0.10 

lo:192.168.0.100 仅主机 调度器
RS1

192.168.0.101,   仅主机

GW 192.168.0.10 

lo:192.168.0.100 仅主机 web服务 器1
RS2

192.168.0.102,     仅主机

GW 192.168.0.10 

lo:192.168.0.100 仅主机 web服务 器2

配置5台主机的环境命令(已关闭防火墙,RS1与RS2已开启HTTPD)

client:

用自动化脚本设置IP

[root@aa ~]# vmset.sh eth0 172.25.254.10 client.timinglee.org
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)

 

设置网关 

[root@client ~]# vim /etc/NetworkManager/system-connections/


[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
method=manual
address1=172.25.254.10/24,172.25.254.100
dns=8.8.8.8

[root@client ~]# nmcli connection reload 
[root@client ~]# nmcli connection up eth0
           

查看IP

router:

用自动化脚本设置IP

[root@aa ~]# vmset.sh eth0 172.25.254.100 router.timinglee.org
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)

[root@aa ~]# vmset.sh eth1 192.168.0.10 router.timinglee.org
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)

查看IP

LVS:

用自动化脚本设置IP

[root@aa ~]# vmset.sh eth0 192.168.0.200 LVS.timinglee.org
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)

设置网关

[root@LVS ~]# vim /etc/NetworkManager/system-connections/


[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
method=manual
address1=192.168.0.200/24,192.168.0.10
dns=8.8.8.8
~            
[root@LVS ~]# nmcli connection reload 
[root@LVS ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/7)

查看IP

RS1:

用自动化脚本设置IP

[root@aa ~]# vmset.sh eth0 192.168.0.101 RS1.timinglee.org
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/8)

设置网关


[root@RS1 ~]# vim /etc/NetworkManager/system-connections/


[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
method=manual
address1=192.168.0.101/24,192.168.0.10
dns=8.8.8.8
~      
[root@RS1 ~]# nmcli connection reload 
[root@RS1 ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/9)
        

查看IP

RS2:

用自动化脚本设置IP

[root@aa ~]# vmset.sh eth0 192.168.0.102 RS2.timinglee.org
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)

 设置网关

[root@RS2 ~]# vim /etc/NetworkManager/system-connections/

[connection]
id=eth0
type=ethernet
interface-name=eth0

[ipv4]
method=manual
address1=192.168.0.102/24,192.168.0.10
dns=8.8.8.8

[root@RS2 ~]# nmcli connection reload 
[root@RS2 ~]# nmcli connection up eth0
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)

          

查看IP

环境配置完成!!

确保每台主机ping都可以互相通信

例如:

在LVS和 RS1与RS2中设定vip

[root@LVS ~]# ip addr add dev lo 192.168.0.100/32
[root@RS1 ~]# ip addr add dev lo 192.168.0.100/32
[root@RS2 ~]# ip addr add dev lo 192.168.0.100/32

查看IP

在RS1和RS2中解决响应问题

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

 在lvs中配置策略

[root@LVS ~]# ipvsadm -A -t 192.168.0.100:80 -s wrr
[root@LVS ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.101:80 -g
[root@LVS ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.102:80 -g
[root@LVS ~]# 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.0.100:80 wrr
  -> 192.168.0.101:80             Route   1      0          0         
  -> 192.168.0.102:80             Route   1      0          0         

测试效果:

部署DR模式集群完成!! 

防火墙标签解决轮询错误

.轮询规则中可能会遇到的错误
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出
现了一个轮询错乱的问题
当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上
问题呈现

防火墙标记解决轮询调度问题

FWM:FireWall Mark
MARK target 可用于给特定的报文打标记,
--set-mark value

其中:value 可为0xffff格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服
务:可将多个不同的应用使用同一个集群服务进行调度
实现方法:
在Director主机打标记:

在Director主机基于标记定义集群服务

lvs持久链接

        在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单粗暴,可能会导致调度失衡

解决方案
        在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上
        如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到同一台RS上。
        如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上

LVS的隧道-TUN 模式

工作原理

  1. IP隧道封装:调度器(Director)在收到客户端请求后,在原始IP数据包外再封装一层IP头(源IP为DIP,目标IP为RIP),形成隧道传输。

  2. RS处理:真实服务器(RS)解封装后,发现内层目标IP是VIP(配置在本地),直接响应客户端(不经过Director。

  3. 跨网络支持:调度器和RS可不在同一局域网,适用于跨机房或云环境。

特点

  • RS需支持IP隧道(如加载ipip模块。

  • 响应数据直接返回客户端,减轻Director负载。

  • 不支持端口映射,RS需配置VIP。

LVS的Full-NAT 模式

工作原理

  1. 双向地址转换

    • 入站:源IP(CIP→LVS内网IP),目标IP(VIP→RIP。

    • 出站:源IP(RIP→VIP),目标IP(LVS内网IP→CIP。

  2. 跨VLAN通信:通过内网IP中转,解决NAT模式必须同VLAN的限制。

特点

  • RS无需设置网关为Director,部署灵活。

  • 支持大规模水平扩展(多Director对多RS。

  • 缺点:RS无法直接获取客户端IP(需TOA模块提取TCP Option中的真实IP。

适用场景

  • 跨VLAN或复杂网络环境。

  • 需高可用且运维简化的场景(如阿里云SLB。

两种模式对比:

  • TUN:高性能、跨网络,但需RS支持隧道。

  • Full-NAT:部署灵活,但需额外处理客户端IP问题。


网站公告

今日签到

点亮在社区的每一天
去签到