LVS原理——详细介绍

目录

lvs简介

LVS作用

[LVS 的优势与不足](#LVS 的优势与不足)

LVS概念与相关术语

LVS的3种工作模式

LVS调度算法

LVS-dr模式

LVS-tun模式

ipvsadm工具使用


lvs简介

LVS 是Linux Virtual Server的简称,也就是 Linux 虚拟服务器,是一个极好的负载均衡解决方案,它将一个真实服务器集群虚拟成一台服务器来对外提供服务,同时在真实服务器集群中实现了负载均衡。该技术由章文嵩博客发起,从linux2.4开始已经被收录到linux核心中。

是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,因此性能较高。

LVS作用

通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。

随着互联网在人们生活中的普及,企业级应用迎来了海量数据的冲击,如微信、美团外卖、微信支付等应用每天的使用人数都在千万以上,仅靠单台机器提供服务已经行不通了。

我们可以使用多台服务器分摊这些压力,当一定数量的服务器作为一个整体对外提供服务,并且分摊压力时,我们可以称这些服务器为"负载均衡集群"。LVS就是一个优秀的负载均衡集群方案,它理论上能够无限水平扩展,使得服务能够应对海量数据的冲击。

LVS 的优势与不足

优势

**高并发连接:**LVS基于内核网络层面工作,有超强的承载能力和并发处理能力。单台LVS负载均衡器,可支持上万并发连接。

**稳定性强:**是工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低。

**成本低廉:**硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,性价比极高。

**配置简单:**LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。

**支持多种算法:**支持多种论调算法,可根据业务场景灵活调配进行使用

**支持多种工作模型:**可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。

**应用范围广:**因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等等。

不足

软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优势所在。

如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂。

LVS概念与相关术语

LVS中的一些术语:

VS:Virtual Server 虚拟服务器,通常是分发器

RS:Real Server 实际提供服务器的真实服务器

CIP:Client IP 客户的客户端IP

VIP:Virtual Server IP 虚拟服务器的IP

RIP:Real Server IP 真实服务器的IP

DIP:Director IP 分发器的IP

CIP <--> VIP == DIP <--> RIP 客户端访问VIP,DIP将请求转发到RIP

LVS的原理如下图所示:

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

分发服务器以VIP对外提供服务器,当接收到客户端服务请求时,便根据预定的分发策略(例如轮询)将请求分发到Real Server中,由Real Server做实际的业务处理。当Real Server处理完成后,根据不同的模式,会使用不同的方式返回请求结。

LVS的3种工作模式

根据服务返回方式和集群分布的不同,LVS有3中不同的工作模式,他们分别是:NAT(地址转换)模式、DR(直接路由)模式和TUN(隧道)模式。

LVS/NAT:网络地址转换模式,进站/出站的数据流量经过分发器(IP负载均衡,他修改的是IP地址) --利用三层功能

LVS/TUN: 隧道模式,只有进站的数据流量经过分发器

LVS/full-nat: 双向转换:通过请求报文的源地址为DIP,目标为RIP来实现转发:对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发

LVS调度算法

ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态

分为两种:静态方法和动态方法

静态方法

仅根据算法本身进行调度(重点加粗)

1、RR:roundrobin,轮询(轮着来),较常用

2、WRR:Weighted RR,加权轮询,较常用(根据性能情况按比例分配)

3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定,避免调度到其他机器导致session丢失,需要重新登录,但是有小的问题,很多人用同一个公网ip,被调度到同一服务器。

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

动态方法

1、WRR:加权轮训调度,它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值低的RS更多。相同权值的RS得到相同数目的连接数。

2、LC:最小连接数调度(least-connection),IPVS表存储了所有活动的连接。LB会比较将连接请求发送到当前连接最少的RS.

3、LBLC:基于地址的最小连接数调度(locality-based least-connection):将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑。

4、LBLC:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制 到负载轻的RS

LVC-nat模式

**原理:**就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此RS来处理,RS处理完成后把数据交给经过负载均衡器,负载均衡器再把数据包的源IP地址改为自己的IP,将目的地址改为客户端IP地址即可。期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器。

**优点:**集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址。

**缺点:**扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!

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的调度机容易阻塞

LVS-dr模式

原理

负载均衡器和RS都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致)并将请求分发给这台RS。这时RS收到这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。

互联网应用中存在一个规律:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即在负载调度器(Director)中只负责调度请求而响应直接由RealServer返回给客户,将极大地提高整个集群系统的吞吐量。

原理如下图

1.DR接受到请求后,通过分发策略得出要将此请求分发到Real Server2。DS就将数据帧中的目标MAC地址修改为Real Server2的MAC地址,然后再将数据帧发送出去。(为什么要用MAC地址?因为此时Real Server也有配置有VIP)

2.当Real Server2 收到一个源地址为CIP目标地址为VIP的数据包时,Real Server2发现目标地址为VIP,而VIP是自己,于是接受数据包并给予处理。

Real Server2处理完成后,会将一个源地址为VIP而目标地址为CIP的数据包发送出去,此时的响应请求就不会再经过DS,而是直接响应给用户了。

3.在这个过程中存在一个问题,由于RealServer也配置了VIP,那么当CIP------>VIP的数据包到达服务局域网,进行广播时,所有的服务器都会进行应答,此时先应答的服务器就会收到数据包,这样就失去了负载均衡的能力。因此在使用DR模式时,通常会采用一些方式来确保请求数据包只会由DS接收,例如抑制Real Server对广播的应答,或者直接在路由器中对DS进行绑定等。

LVS-tun模式

TNU模式与DR模式非常相似,它同样是只有请求信息会经过DS,应答信息由Real Server直接返回给用户。不过DR模式中,要求DS和所有的Real Server必须在一个局域网中,而TNU模式去掉了这个限制。

原理:

互联网上的大多Internet服务的请求包很短小,而应答包通常很大。那么隧道模式就是,把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器。注意,由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTUNNEL协议。所以,在RS的内核中,必须编译支持IPTUNNEL这个选项 ​


1.IP隧道技术又称为IP封装技术,它可以将带有源和目标IP地址的数据报文使用新的源和目标IP进行二次封装,这样这个报文就可以发送到一个指定的目标主机上。

2.隧道模式下,调度器和后端服务器组之间使用IP隧道技术。当客户端发送的请求(CIP-->VIP)被director接收后,director修改该报文,加上IP隧道俩端的IP地址作为新的源和目标地址,并将请求转发给后端被选中的一个目标。

3.当后端服务器接收到报文后,首先解封该报文原有的CIP--->VIP,该后端服务器发现自身的tun接口上配置了VIP,因此接受该数据包。

4.当请求处理完成后,结果将不会重新交给director,而是直接返回给客户端。此时响应数据包的源IP为VIP,目标IP为CIP。

在TNU模式中,DS与Real Server不必在一个网络中。DS在接到请求报文之后,在报文的上面再加一层源地址为DIP,目的地址为RIP2的IP首部,然后通过广域网发送到Real Server2。

Real Server2收到报文,拆掉报文以后发现了里面还有一个封装,它就知道了,这就是隧道。后续的过程就与DR一样了。

tun模式的特点

1.DIP, VIP, RIP都应该是公网地址

2.RS的网关一般不能指向DIP

3.请求报文要经由Director,但响应不能经由Director

4.不支持端口映射 5.RS的OS须支持隧道功能

ipvsadm工具使用

LVS-server安装lvs管理软件

yum -y install ipvsadm

程序包:ipvsadm(LVS管理工具)

主程序:/usr/sbin/ipvsadm

规则保存工具:/usr/sbin/ipvsadm-save > /path/to/file

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

命令选项

-A --add-service #在服务器列表中新添加一条新的虚拟服务器记录
-s --scheduler #使用的调度算法, rr | wrr | lc | wlc | lblb | lblcr | dh | sh | sed | nq 默认调度算法是 wlc
例:ipvsadm -A -t 192.168.1.2:80 -s wrr
-a --add-server #在服务器表中添加一条新的真实主机记录
-t --tcp-service #说明虚拟服务器提供tcp服务
-u --udp-service #说明虚拟服务器提供udp服务
-r --real-server #真实服务器地址
-m --masquerading #指定LVS工作模式为NAT模式
-w --weight #真实服务器的权值
-g --gatewaying #指定LVS工作模式为直接路由器模式(也是LVS默认的模式)
-i --ip #指定LVS的工作模式为隧道模式
-p #会话保持时间,定义流量被转到同一个realserver的会话存留时间
例:ipvsadm -a -t 192.168.1.2:80 -r 192.168.2.10:80 -m -w 1
-E -edit-service #编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D -delete-service #删除内核虚拟服务器表中的一条虚拟服务器记录。
-C -clear #清除内核虚拟服务器表中的所有记录。
-R -restore #恢复虚拟服务器规则
-S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
-e -edit-server #编辑一条虚拟服务器记录中的某条真实服务器记录
-d -delete-server #删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l --list #显示内核虚拟服务器表
--numeric, -n:#以数字形式输出地址和端口号
--exact: #扩展信息,精确值
--connection,-c: #当前IPVS连接输出
--stats: #统计信息
--rate : #输出速率信息
参数也可以从/proc/net/ip_vs*映射文件中查看
-Z --zero #虚拟服务表计数器清零(清空当前的连接数量等)

管理集群服务中的增删改(大写)--Virtual Services

-A --add-service #在服务器列表中新添加一条新的虚拟服务器记录

ipvsadm -A -t 172.25.254.100:80 -s rr

-E -edit-service #编辑内核虚拟服务器表中的一条虚拟服务器记录。

ipvsadm -E -t 172.25.254.100:80 -s wlc

-D -delete-service #删除内核虚拟服务器表中的一条虚拟服务器记录。

ipvsadm -D -t 172.25.254.100:80

管理集群中的曾增删改(小写)--RealServer

-a --add-server #在服务器表中添加一条新的真实主机记录

ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.30 -m

-d -delete-server #删除一条虚拟服务器记录中的某条真实服务器记录

ipvsadm -d -t 172.25.254.100:80 -r 192.168.0.30

-e -edit-server #编辑一条虚拟服务器记录中的某条真实服务器记录

ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -w 2

相关推荐
^Lim2 分钟前
esp32 JTAG 串口 bootload升级
java·linux·网络
小林熬夜学编程25 分钟前
【Linux系统编程】第五十弹---构建高效单例模式线程池、详解线程安全与可重入性、解析死锁与避免策略,以及STL与智能指针的线程安全性探究
linux·运维·服务器·c语言·c++·安全·单例模式
玖玖玖 柒染26 分钟前
windows下sqlplus连接到linux oracle不成功
linux·windows·oracle
LuckyTHP27 分钟前
CentOS 9 无法启动急救方法
linux·运维·centos
Bonne journée28 分钟前
centos和ubuntu有什么区别?
linux·ubuntu·centos
vvw&30 分钟前
如何在 Ubuntu 22.04 上安装带有 Nginx 的 ELK Stack
linux·运维·nginx·ubuntu·elk·elasticsearch·开源项目
Linux运维老纪31 分钟前
交换机配置从IP(Switch Configuration from IP)
linux·服务器·网络·安全·运维开发·ip
OneSea32 分钟前
Debian源码管理
linux
加载中loading...36 分钟前
C/C++实现tcp客户端和服务端的实现(从零开始写自己的高性能服务器)
linux·运维·服务器·c语言·网络
大筒木老辈子38 分钟前
Linux笔记---进程:初识进程
linux·服务器·笔记