LVS详解

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

LVS(Linux virtual server)

简介

即linux虚拟服务器

四层负载均衡基本上都会使用 LVS,据了解 BAT 等大厂都是 LVS 重度使用者,就是因为 LVS 非常出色的性能,能为公司节省巨大的成本。LVS,全称 Linux Virtual Server 是由国人章文嵩博士发起的一个开源的项目,在社区具有很大的热度,是一个基于四层、具有强大性能的反向代理服务器。它现在是标准内核的一部分。

它具备可靠性、高性能、可扩展性和可操作性的特点,从而以低廉的成本实现最优的性能。LVS工作模式分为NAT模式、TUN模式、以及DR模式

相关术语:

DS:Director Server。指的是前端负载均衡器节点。

RS:Real Server。后端真实的工作服务器。

VIP:Virtual IP 向外部直接面向用户请求,作为用户请求的目标的IP地址。

DIP:Director Server IP,主要用于和内部主机通讯的IP地址。

RIP:Real Server IP,后端服务器的IP地址。

CIP:Client IP,访问客户端的IP地址。

结构

LVS采用三层结构,分别是:

第一层: 负载调度器

第二层: 服务池

第三层:共享存储

负载调度器(load balancer/ Director),是整个集群的总代理,它有两个网卡,一个网卡面对访问网

站的客户端,一个网卡面对整个集群的内部。负责将客户端的请求发送到一组服务器上执行,而客户也

认为服务是来自这台主的。举个生动的例子,集群是个公司,负载调度器就是在外接揽生意,将接揽到

的生意分发给后台的真正干活的真正的主机们。当然需要将活按照一定的算法分发下去,让大家都公平

的干活。

服务器池(server pool/ Realserver),是一组真正执行客户请求的服务器,可以当做WEB服务器。就

是上面例子中的小员工。

共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相

同的内容,提供相同的服务。一个公司得有一个后台账目吧,这才能协调。不然客户把钱付给了A,而

换B接待客户,因为没有相同的账目。B说客户没付钱,那这样就不是客户体验度的问题了。

负载均衡策略

LVS的DR模式

DR:direct routing(直接路由技术)

原理:

  1. 客户端发送请求到DS的 VIP,数据包的目标 IP 为 VIP,目标 MAC 为调度器的 MAC

  2. 调度器接收数据包,根据负载均衡算法选择 RS

  3. 调度器不修改 IP 地址,仅将数据包的目标 MAC 地址改为 RS 的 MAC(通过 ARP 获取 RS 的 MAC 地址),然后转发给 RS。此时数据包的目标 IP 仍为 VIP,源 IP 为CIP

  4. RS 收到数据包后,发现目标 IP 是自身配置的 VIP(虽禁用 ARP 响应,但可接收发往 VIP 的数据包),于是处理请求并生成响应

  5. RS 直接将响应数据包返回给客户端(源 IP 为 VIP,目标 IP 为客户端 IP),无需经过调度器

RS 响应时使用 VIP 作为源 IP,客户端认为响应来自调度器(VIP),实现了负载均衡的透明性

  • 优点:响应速度快,因为后端服务器可以直接将响应返回给客户端,减轻了 LVS 负载均衡器的压力。

  • 限制

  • 所有服务器需要在同一个物理网络中,并且后端服务器的网关不能指向 LVS 负载均衡器。调度器与 RS 必须在同一网段(受 MAC 广播限制)

  • RS 需配置 VIP 并禁用 ARP 响应

firewall-cmd --add-masquerade
其作用是开启网络地址转换(NAT)功能,也称为 IP 伪装(Masquerading)

特性

1.请求报文一定经过ds,而返还结果一定不经过ds,直接发给client

2.rs和ds要在同一物理网络中

案例
ip配置

client

router

 lvs

rs1

rs2

1.在router中启动路由内核功能
[root@router ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@router ~]# sysctl -p
net.ipv4.ip_forward = 1
2.在rs1和rs2中解决相应问题
DR 模型中各主机上均需要配置 VIP ,解决地址冲突的方式有三种:
(1) 在前端网关做静态绑定
(2) 在各 RS 使用 arptables
(3) 在各 RS 修改内核参数,来限制 arp 响应和通告的级别
限制响应级别 :arp_ignore
0: 默认值,表示可使用本地任意接口上配置的任意地址进行响应
1: 仅在请求的目标 IP 配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别 :arp_announce
0: 默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1: 尽量避免将接口信息向非直接连接网络进行通告
2: 必须避免将接口信息向非本网络进行通告
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
[root@RS1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
 
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
[root@RS2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
3.在rs1和2中安装httpd,关闭防火墙
[root@RS1 ~]# yum install httpd -y 
[root@RS1 ~]# echo "welcome to RS1 - 192.168.0.10" > /var/www/html/index.html
[root@RS1 ~]# systemctl restart httpd
[root@RS1 ~]# systemctl stop firewalld
[root@RS1 ~]# yum install httpd -y 
[root@RS1 ~]# echo "welcome to RS1 - 192.168.0.10" > /var/www/html/index.html
[root@RS1 ~]# systemctl restart httpd
[root@RS1 ~]# systemctl stop firewalld
4.lvs中安装ipvsadm添加策略
[root@lvs ~]# yum install ipvsadm -y
 
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
[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.200:80 wrr
  -> 192.168.0.10:80              Route   1      0          0         
  -> 192.168.0.20:80              Route   2      0          0 
 
[root@lvs ~]# systemctl stop firewalld
测试
[root@client ~]# for i in {1..10}; do curl 192.168.0.200; done
welcome to RS2 - 192.168.0.20
welcome to RS1 - 192.168.0.10
welcome to RS2 - 192.168.0.20
welcome to RS2 - 192.168.0.20
welcome to RS1 - 192.168.0.10
welcome to RS2 - 192.168.0.20
welcome to RS2 - 192.168.0.20
welcome to RS1 - 192.168.0.10
welcome to RS2 - 192.168.0.20
welcome to RS2 - 192.168.0.20

LVS的NAT模式

NAT:network address translation(网络地址翻译)

  1. 当用户请求到达Director Server。此时报文的源IP为CIP,目标IP为VIP

  2. DS接收数据包,根据负载均衡算法选择一台RS

    调度器修改数据包的目标 IP 地址为 RS 的 IP,同时记录连接状态(通过 NAT 表或 conntrack 跟踪),然后转发给 RS

  3. Real Server收到数据包开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP

  4. Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP

  5. 将修改后的响应数据包转发给客户端,完成一次请求响应流程

  • 优点:配置简单,只需要一个公网 IP 地址就可以实现负载均衡。

  • 缺点:LVS 负载均衡器需要处理所有的请求和响应,容易成为性能瓶颈;而且后端服务器必须将网关指向 LVS 负载均衡器。

特性

1. dip和rip在同一网段

2.RS使用私有地址,网关指向DIP

3.请求和响应报文都需要经过Director Server

案例
ip配置

lvs配置

在 lvs 中启用内核路由功能

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

添加策略 

设置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.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20: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.10:80              Masq    1      0          0         
  -> 192.168.0.20:80              Masq    1      0          0   

安装ipvsadm 

[root@lvs ~]# yum install ipvsadm -y
在rs1和r2中安装httpd,关闭防火墙
[root@webserver1 ~]# yum install httpd -y 
[root@webserver1 ~]# echo "welcome to webserver1 - 192.168.0.10" > /var/www/html/index.html
[root@webserver1 ~]# systemctl restart httpd
[root@webserver1 ~]# systemctl stop firewalld
[root@webserver2 ~]# yum install httpd -y
[root@webserver2 ~]# echo "welcome to webserver2 - 192.168.0.20" > /var/www/html/index.html
[root@webserver2 ~]# systemctl restart httpd
[root@webserver2 ~]# systemctl stop firewalld
测试
[root@client ~]# for i in {1..10}; do curl 172.25.254.100; done
welcome to webserver2 - 192.168.0.20
welcome to webserver1 - 192.168.0.10
welcome to webserver2 - 192.168.0.20
welcome to webserver1 - 192.168.0.10
welcome to webserver2 - 192.168.0.20
welcome to webserver1 - 192.168.0.10
welcome to webserver2 - 192.168.0.20
welcome to webserver1 - 192.168.0.10
welcome to webserver2 - 192.168.0.20
welcome to webserver1 - 192.168.0.10

LVS的TUN模式

Tunnel 模式在国内使用的比较少,不过据说腾讯使用了大量的 Tunnel 模式。它也是一种单臂的模式,只有请求数据会经过 lvs,响应数据直接从后端服务器发送给客户端,性能也很强大,同时支持跨机房。下边继续看图分析原理

  1. 客户端请求阶段

    • 客户端发送请求到调度器的 VIP,数据包的目标 IP 为 VIP,源 IP 为客户端 IP。

    • 调度器接收数据包,根据负载均衡算法选择 RS。

    • 关键操作:调度器将原始数据包封装在新的 IP 数据包中(外层 IP 头的源 IP 为调度器 IP,目标 IP 为 RS 的 IP),通过 IP 隧道转发给 RS。此时原始数据包的目标 IP 仍为 VIP,源 IP 为客户端 IP。

  2. RS 解封装与响应阶段

    • RS 收到隧道数据包后,解封装获取原始数据包,发现目标 IP 是自身配置的 VIP,于是处理请求并生成响应。

    • RS 直接将响应数据包返回给客户端(源 IP 为 VIP,目标 IP 为客户端 IP),无需经过调度器。

    • 关键逻辑:RS 响应时使用 VIP 作为源 IP,客户端认为响应来自调度器(VIP),实现跨网段的负载均衡

  • 优点:后端服务器可以分布在不同的地理位置,扩展性好;LVS 负载均衡器只处理请求的转发,压力相对较小。

  • 缺点:配置复杂,需要支持 IP 隧道协议;增加了数据包的封装和解封装过程,会带来一定的性能开销。

调度算法

静态算法
rr

RR(轮询:Round Robin), 算法就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都一样的,调度器会将所有的请求平均分配给每个真实服务器。特点是将收到的访问请求按顺序轮流分配给集群中的各节点真实服务器中,不管服务器实际的连接数和系统负载。轮询 RS分别被调度,当RS配置有差别时不推荐

wrr

WRR(加权轮询:Weighted Round Robin),算法主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度器调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少

sh

SH( 源地址散列调度:Source Hashing )源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定

算法先根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同,它的算法流程与目标地址散列调度算法的基本相似。

dh

目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商

DH(目标地址散列调度:Destination Hashing )算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。

动态算法
  1. LC(最小连接调度:Least Connections )算法是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态的调度算法,它通过服务器当前活跃的连接数来估计服务器的情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中断或者超时,其连接数减1。

适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活动链接数) (集群系统的真实服务器具有相近的系统性能,采用最小连接调度算法可以比较好地均衡负载。)  

  1. WLC(加权最少连接:(Weight Least Connections )算法是最小连接调度的超集,各个服务器相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight

  2. LBLC(基于局部的最少连接调度:Locality-Based Least Connections )算法是针对请求报文的目标IP地址的 负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和Cache命中率,从而提升整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则使用’最少连接’的原则选出一个可用的服务器,将请求发送到服务器。

  3. LBLCR(带复制的基于局部性的最少连接:Locality-Based Least Connections with Replication )算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统,它与LBLC算法不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。按’最小连接’原则从该服务器组中选出一一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按’最小连接’原则从整个集群中选出一台服务器,将该服务器加入到这个服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

  4. SED (最短的期望的延迟调度:Shortest Expected Delay )算法基于WLC算法。举个例子吧,ABC三台服务器的权重分别为1、2、3 。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用SED算法后会进行一个运算 A:(1+1)/1=2 B:(1+2)/2=3/2 C:(1+3)/3=4/3 就把请求交给得出运算结果最小的服务器。 预期的延迟时间为(Ci +1)/ Ui,其中 Ci 是第 i 个服务器上的连接数,而 Ui 是第 i 个服务器的固定服务速率(权重)

初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight 但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接  

  1. NQ(最少队列调度:Never Queue )算法,无需队列。如果有realserver的连接数等于0就直接分配过去,不需要在进行SED运算。

软件相关信息

配置文件:/etc/sysconfig/ipvsadm-config
程序包: ipvsadm
Unit File: ipvsadm.service
主程序: /usr/sbin/ipvsadm
规则保存工具: /usr/sbin/ipvsadm-save
规则重载工具: /usr/sbin/ipvsadm-restore
ipvs 调度规则文件: /etc/sysconfig/ipvsadm

ipvsadm

ipvsadm命令是LVS在应用层的管理命令,我们可以通过这个命令去管理LVS的配置。
ipvsadm是一个工具,同时它也是一条命令,用于管理LVS的策略规则。

子命令
  --add-service     -A        添加一个集群服务,需要使用选项
  --edit-service    -E        编辑一个集群服务,需要使用选项
  --delete-service  -D        删除指定集群服务,需要使用选项
  --clear           -C        删除所有集群服务,包括真实服务器转发策略规则
  --restore         -R        从标准输入中恢复策略规则
  --save            -S        保存策略规则到标准输出
  --add-server      -a        添加一个真实服务器,需要使用选项
  --edit-server     -e        编辑一个真实服务器,需要使用选项
  --delete-server   -d        删除一个真实服务器,需要使用选项
  --list            -L|-l     查看集群服务列表,包括真实服务器转发策略规则
  --zero            -Z        计数器清零。清除连接数、包转发等数量统计信息
--set <超时时间>            设置TCP、TCPFIN(TCP关闭连接状态)、UDP连接超时时间,用于
                             会话保持。一般情况下TCP和UDP超时时间保持默认就好,TCPFIN
                             可以根据情况设定,指定它则用户请求连接关闭,该连接则会变
                             为非活跃(InActive)空闲等待状态,在空闲等待时间内,如果
                             来自同一源IP的请求,则还会转发给后端的同一台真实服务器上
 --start-daemon              开启连接同步守护进程。在选项后面指定自己是Master(主)还
                             是backup(备),主负载调度器会同步所有策略及连接状态到备
                             负载调度器,当主故障,备可以接替其工作
 --stop-daemon               停止连接同步守护进程
 --help            -h        显示帮助信息

选项
--tcp-service  -t  <集群服务地址>   允许集群服务使用的传输协议为TCP。<IP:Port>
 --udp-service  -u <集群服务地址>    允许集群服务使用的传输协议为UDP。<IP:Port>
 --fwmark-service  -f <防火墙标识>   使用一个整数值来防火墙标识集群服务,而不是地址、
                                     端口和协议使用它,我们可以通过结合IPtables将多
                                     个以调度器为目标的端口定义成一个防火墙标识,由
                                     ipvsdam通过此项关联标识,则可以实现对一个IP多
                                     端口调度,即实现后端服务器可以开放多个服务
 --scheduler    -s scheduler         指定集群服务使用的调度算法:rr|wrr|lc|wlc|lblc
                                     |lblcr|dh|sh|sed|nq,默认为wlc
 --persistent   -p <超时时间>        开启持久化服务,开启它则表示在指定时间内,来自同
                                     一IP的请求都会转发到后端同一台真实服务器上
 --netmask      -M <网络掩码>        使用网络掩码来屏蔽持久化来源IP的地址范围,默认值
                                     为255.255.255.255,即所有来源IP请求都会享受持久
                                     化服务
 --real-server  -r <真实服务器地址>  指定真实服务器的主机IP与端口
 --gatewaying   -g                   指定真实服务器转发工作模式,使用DR模式,默认
 --ipip         -i                   指定真实服务器转发工作模式,使用TUN模式
 --masquerading -m                   指定真实服务器转发工作模式,使用NAT模式
 --weight       -w <权重值>          指定真实服务器的权重值
 --u-threshold  -x <上阀值>          设置转发请求的最大上连接阀值,范围为0~65535,当
                                     当连接数超过指定上限时,LVS则不会转发请求                                   
 --l-threshold  -y <下阀值>          设置转发请求的下连接阀值,范围为0~65535,当连接
                                     数降低至指定值时,LVS则继续提供服务,默认值为0
 --mcast-interface interface         设置用于连接同步守护进程的组播接口
 --syncid sid                        设置连接同步守护进程的SID号,用于标识,范围0~255
 --connection   -c                   显示连接信息,一般与"-l"连用
 --timeout                           显示TCP、TCPFIN、UDP超时时间信息,一般与"-l"连用
 --daemon                            显示连接同步守护信息,一般与"-l"连用
 --stats                             显示统计信息,一般与"-l"连用
 --rate                              显示转发速率信息,一般与"-l"连用
 --exact                             显示数据包和字节计数器的确切值,扩大字符长度
 --thresholds                        显示阀值信息,一般与"-l"连用
 --persistent-conn                   显示持久化连接信息,一般与"-l"连用
 --numeric      -n                   地址和端口以数字格式显示,一般与"-l"连用
 --sched-flags  -b <标识>            设置调度算法的范围标识,用于SH算法,有两个标识:
                                     sh-fallback,如果真实服务器不可用,则将其转发到
                                     其他真实服务器上。
                                     sh-port,将源地址的端口号也添加到散列键=值中
​

网站公告

今日签到

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