LVS介绍

article/2025/9/22 19:35:00

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

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

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

 

三、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的原理如下图所示:在这里插入图片描述

 

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

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

NAT地址转换模式
NAT地址转换模式是最为简单的一种模式,它的原理如下图所示(为了简洁,用户只画了一个):

在这里插入图片描述
NAT其实就是通过网络地址转换来实现负载均衡的,下面是它的请求流程:

 

分发服务器Director Server(后面简称DS)接受到请求后,通过分发策略得出要将此请求分发到Real Server1。于是将请求报文的目的地址改为RIP1,发送出去。
Real Server1收到一个目标地址为自己的数据包,于是接受并进行处理。
处理完成后,Real Server1将RIP1——>CIP的数据包发送出去。
DS接收到RIP1——>CIP的数据包后,将源地址改为VIP,然后发送出去:VIP——>CIP。 这个过程中,DS仅仅起到一个地址转换和分发的作用。在NAT模式中,请求和响应报文都要通过DS,当真实服务器的数量越来越多时,分发器DS将会成为整个集群系统的性能瓶颈。下面的DR模式解决这个问题。
DR直接路由模式
互联网应用中存在一个规律:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即在负载调度器(Director)中只负责调度请求而响应直接由RealServer返回给客户,将极大地提高整个集群系统的吞吐量。这就是DR的实现原理,原理图如下所示:

在这里插入图片描述
在DR模型中,只有在请求的时候会经过DR,响应的数据包由Real Server直接返回给用户,该模式是3中模式中最常用的。它的请求过程如下所示:

 

DR接受到请求后,通过分发策略得出要将此请求分发到Real Server2。DS就将数据帧中的目标MAC地址修改为Real Server2的MAC地址,然后再将数据帧发送出去。(为什么要用MAC地址?因为此时Real Server也有配置有VIP)
当Real Server2 收到一个源地址为CIP目标地址为VIP的数据包时,Real Server2发现目标地址为VIP,而VIP是自己,于是接受数据包并给予处理。
Real Server2处理完成后,会将一个源地址为VIP而目标地址为CIP的数据包发送出去,此时的响应请求就不会再经过DS,而是直接响应给用户了。
在这个过程中存在一个问题,由于RealServer也配置了VIP,那么当CIP——>VIP的数据包到达服务局域网,进行广播时,所有的服务器都会进行应答,此时先应答的服务器就会收到数据包,这样就失去了负载均衡的能力。因此在使用DR模式时,通常会采用一些方式来确保请求数据包只会由DS接收,例如抑制Real Server对广播的应答,或者直接在路由器中对DS进行绑定等。
TNU隧道模式
TNU模式与DR模式非常相似,它同样是只有请求信息会经过DS,应答信息由Real Server直接返回给用户。不过DR模式中,要求DS和所有的Real Server必须在一个局域网中,而TNU模式去掉了这个限制。

TNU模式原理图如下所示:

在这里插入图片描述
在TNU模式中,DS与Real Server不必在一个网络中。DS在接到请求报文之后,在报文的上面再加一层源地址为DIP,目的地址为RIP2的IP首部,然后通过广域网发送到Real Server2。
Real Server2收到报文,拆掉报文以后发现了里面还有一个封装,它就知道了,这就是隧道。后续的过程就与DR一样了。
五、 LVS的调度算法
LVS的调度算法是指LVS对于请求的分发方式。DS在向Real Server分发请求实现负载均衡时,有10种不同的算法:

 

轮询(Round Robin,rr):在Real Server之间轮流分配请求。
加权轮询(Weighted Round Robin,wrr):有权重地进行轮询。
最少链接(Least Connnections,lc):将请求发送给连接数最少的RS。
加权最少链接(Weighted Least Connnections,wlc):分发给基于权重的最少链接。
基于局部性的最少链接(Locality-Based Least Connections,lblc):首先根据目标IP地址找出最近使用的服务器,如果该服务器可用且没有超载(一半的工作负荷),则将请求发送到该服务器。否则,使用“最少链接”原则。
带复制的基于局部性最少链接(Locality-Based Least Connections with
Replication,lblcr):它与lblc的不同之处是它要维护从一个目标IP到一组服务器的映射,而lblc值维护从一个目标IP到一台服务器的映射。
目标地址散列(Destination Hashing,dh):使用请求的目标IP地址作为散列键,从静态分配的散列表找出对应的服务器,若该服务器可用且未超载,则转发请求,否则返回空。
源地址散列(Source Hashing,sh):使用请求的源IP地址作为散列键,从静态分配的散列表找出对应的服务器,若该服务器可用且未超载,则转发请求,否则返回空。
最短期望延迟(Shortest Expecte Delay,sed):“最短的期望的延迟”是基于WLC算法的,只是其计算方法不同。具体算法如下:(active+1)*256/weight
最少队列调度(Never Queue Scheduling):无需队列。如果有台
realserver的连接数=0就直接分配过去,不需要在进行SED运算。如果没有服务器连接数为空闲,则使用SED算法。
六、LVS的优缺点是什么
LVS的优点有:

工作在网络层,可以实现高性能、高可用的服务器集群技术。
廉价,可把许多低性能的服务器组合在一起形成一个水平扩展的集群服务器。
易用,配置非常简单,且有多重负载均衡的方法
稳定可靠,即使集群中的一台服务器挂掉,也不影响整体服务效果。
可扩展性好,可以用户透明地进行水平扩展,加减机器非常方便。
LVS的缺点:

由于是通用组件,因此不能对特定业务进行针对优化。
对于长连接无法进行负载均衡。
自身没有健康状态检查,需要结合脚本或者Keepalived等软件实现。
LVS (Linux Virtual Server)跟SLB(Server Load Balancing)最大的区别就是,LVS是在网络层起作用的,而SLB是在应用层起作用的
————————————————
版权声明:本文为CSDN博主「ximeneschen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cristianoxm/article/details/120546371


http://chatgpt.dhexx.cn/article/y2bAtiSX.shtml

相关文章

LVS详解

LVS简介 LVS是Linux Virtual Server的简写&#xff0c;意即Linux虚拟服务器&#xff0c;是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立&#xff0c;是中国国内最早出现的自由软件项目之一。 LVS名词解释 DS&#xff1a;director server&#xff0c;即负载均…

LVS负载均衡(LVS简介、三种工作模式、十种调度算法)

一、LVS简介 LVS&#xff08;Linux Virtual Server&#xff09;即Linux虚拟服务器&#xff0c;是由章文嵩博士主导的开源负载均衡项目&#xff0c;目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案&#xff0c;其体系结构如图1…

程序员必备的 10 大国外技术网站

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 今天给大家推荐 10 个国外比较优质的技术网站&#xff0c;希望大家喜欢。 1、dev dev社区和国内的掘金社区很相似&#xff0c;技术分类也比较多&#xff0c;像 Java、Python、js、分布式等…

程序员经常浏览的 60 个技术网站汇总,还不赶快收藏!

>>号外&#xff1a;关注“Java精选”公众号&#xff0c;菜单栏->聚合->干货分享&#xff0c;回复关键词领取视频资料、开源项目。 程序员是一个需要不断学习的职业。幸运的是&#xff0c;在这个互联网时代&#xff0c;知识就在那里&#xff0c;等着我们去获取。 作…

国内10大技术网站,你最爱和哪个玩耍?

所谓“物以类聚&#xff0c;人以群分” 所谓“士为知己者死&#xff0c;女为悦己者容” 所谓“世上的乌鸦都一般黑&#xff0c;鸽子却各有各的白” ...... CSDN&#xff0c;掘金&#xff0c;博客园等&#xff0c;说起来都是“技术”社区&#xff0c;每个却都有着不同的姿色和用…

IT网站推荐

IT网站推荐 1.首先肯定是 CSDN 啦&#xff0c;许多系统问题、软件安装问题都是在这弄好的。以及写代码时的各种懵逼&#xff0c;也可以在这里搜索解决。 觉得还是有必要附上链接 CSDN:&#xff1a;https://www.csdn.net/ 2.MSDN&#xff1a;https://msdn.itellyou.cn/ 官网系…

推荐八个技术学习网站

推荐八个技术学习网站 写在前边的话八个纯技术学习好网站 写在前边的话 我们相信努力学习一定会有收获&#xff0c;但是方法不当&#xff0c;既让人身心疲惫&#xff0c;也没有切实的回报。在众多互联网技术网站中&#xff0c;各有各的好&#xff0c;经过网上收集整理&#xf…

IT技术相关网站

OSCHINA - 中文开源技术交流社区https://www.oschina.netCSDN - 专业开发者社区https://www.csdn.netSegmentFault 思否 - 中国领先的开发者技术社区https://segmentfault.xn--com-0da有穹_一个开发者的作品发布平台https://www.youqiong.net牛客网 - 找工作神器|笔试题库|面试…

it技术交流社区与学习资料的网站大全

点击上方蓝字"优派编程"选择“加为星标”&#xff0c;第一时间关注原创干货 对国内技术社区 博客园 https://www.cnblogs.com/ 掘金 https://juejin.cn/ 思否 https://segmentfault.com/ 开源中国 https://www.oschina.net/ 51CTO https://www.51cto.com/ V2EX https…

ResourceBundle读取配置文件及路径问题

读取配置文件 今天工作过程中&#xff0c;看到获取配置文件里面的值研究了一下&#xff0c;算是自己的一点小进步&#xff0c;分享出来&#xff0c;希望帮到大家。 &#xff08;ssm项目&#xff09; java.util.ResourceBundle&#xff0c;这个类的作用就是读取资源属性文件&am…

【Java】问题——ResourceBundle读取文件时出现的问题

ResourceBundle读取文件时出现的问题 问题产生 接手的一个运维项目代码写的乱&#xff0c;看到连接数据库信息直接写在class文件里面&#xff0c;不易管理&#xff0c;就是顺手写个wfc_config.properties文件&#xff0c;专门去存储相关的配置信息。整理好信息之后更新到服务…

ResourceBundle.getBundle()从哪里查找配置文件

ResourceBundle.getBundle()方法会在classpath中寻找配置文件&#xff0c;而在idea中一个模块的classpath不是src目录&#xff0c;而是位于out/product/相应模块目录下。 比如JDBC-test模块的classpath 不是 C:\Users\Administrator\IdeaProjects\javaExercise\JDBC-test\src&a…

ResourBundle.getBundle方法

import java.util.Locale; import java.util.ResourceBundle;public class Main {public static void main(String[] args) {//对于读取properties文件&#xff0c;我们可以使用Properties和ResourceBundle这两个类//但不同的是&#xff0c;ResourceBundle可以实现实现配置文件…

java之ResourceBundle类详细分析(全)

目录 前言1. 配置文件2. 方法3. 实战 前言 主要的作用&#xff1a; 当程序需要一个特定于语言环境的资源时&#xff08;如 String&#xff09;&#xff0c;程序中可从当前的用户环境资源包中加载它。使得编写在很大程序上只是独立于当前的用户环境&#xff0c;将资源包中大部分…

ResourceBundle.getBundle读取资源文件的路径

我想用ResourceBundle.getBundle()来读取我自定义的一个hbase.properties配置文件,代码如下: public class CreateHbaseTableDemo {public static void main(String[] args) {ResourceBundle resourceBundle ResourceBundle.getBundle("hbase.properties");String p…

ResourceBundle.getBundle()方法

这个方法是从properties文件中获取值 drivercom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/db_hualian?useSSLfalse&serverTimezoneUTC&characterEncodingGBK usernameroot passwordroot 注意: properties文件必须放在被标记为Resource Root的文件夹之下。 …

【Java类001】用ResourceBundle类实现资源文件本地化

ResourceBundle类&#xff1a;资源绑定类 功能&#xff1a;根据指定的文件名和本地化信息&#xff08;语言代码&#xff0c;国别代码&#xff09;&#xff0c;找到对应的properties文件&#xff0c;获取文件内容。 properties文件名的命名规范&#xff1a;文件名_语言代码_国别…

Java国际化——ResourceBundle基本使用

背景&#xff1a;企业项目中&#xff0c;往往面对国际的。针对不同地区语言&#xff0c;ResourceBundle主要用来处理本地化资源和国际化资源的问题&#xff0c;向用户展示合理的界面显示。 ResourceBundle 官方解释&#xff1a;一堆有着相同前缀名称但有着不同语言后缀名称的…

JAVA中ResourceBundle使用详解(一)

最近在看HttpServlet源码时候&#xff0c;碰到ResourceBundle的使用&#xff0c;就此记录一下。 一、ResourceBundle是啥 在package java.util;下 这个类主要用来解决国际化和本地化问题。国际化和本地化是啥&#xff0c;另一篇文章有写&#xff0c;这里直接上用法。 这个类…

JAVA中ResourceBundle使用详解

JAVA中ResourceBundle使用详解 这个类主要用来解决国际化和本地化问题。国际化和本地化可不是两个概念&#xff0c;两者都是一起出现的。可以说&#xff0c;国际化的目的就是为了实现本地化。比如对于“取消”&#xff0c;中文中我们使用“取消”来表示&#xff0c;而英文中我…