LVS详解

news2024/11/15 13:29:38

一、负载均衡:必不可少的基础手段


1.1 找更多的牛来拉车吧

当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器集群等等。

 

    古人有云:当一头牛拉不动车的时候,不要去寻找一头更强壮的牛,而是用两头牛来拉车。

 

        在实际应用中,在Web服务器集群之前总会有一台负载均衡服务器,负载均衡设备的任务就是作为Web服务器流量的入口,挑选最合适的一台Web服务器,将客户端的请求转发给它处理,实现客户端到真实服务端的透明转发。最近几年很火的「云计算」以及分布式架构,本质上也是将后端服务器作为计算资源、存储资源,由某台管理服务器封装成一个服务对外提供,客户端不需要关心真正提供服务的是哪台机器,在它看来,就好像它面对的是一台拥有近乎无限能力的服务器,而本质上,真正提供服务的,是后端的集群。

1.2 负载均衡的类型

负载均衡可以采用硬件设备(例如常常听见的F5),也可以采用软件负载。

商用硬件负载设备成本通常较高(一台几十万上百万很正常),所以在条件允许的情况下我们会采用软件负载;

软件负载解决的两个核心问题是:选谁、转发,其中最著名的是LVS(Linux Virtual Server)。


二、初识LVS:Linux Virtual Server


2.1 LVS是神马东西

    LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。


2.2 LVS有神马作用

      LVS主要用于服务器集群的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。

LVS自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。可以利用LVS技术实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等等,有许多比较著名网站和组织都在使用LVS架设的集群系统,例如:Linux的门户网站(www.linux.com)、向RealPlayer提供音频视频服务而闻名的Real公司(www.real.com)、全球最大的开源网站(sourceforge.net)等。


2.3 LVS的体系结构

使用LVS架设的服务器集群系统有三个部分组成:

(1)最前端的负载均衡层,用Load Balancer表示;

(2)中间的服务器集群层,用Server Array表示;

(3)最底端的数据共享存储层,用Shared Storage表示;

在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。

2.4 LVS负载均衡机制

(1)LVS是四层负载均衡,也就是说建立在OSI模型的第四层——传输层之上,传输层上有我们熟悉的TCP/UDP,LVS支持TCP/UDP的负载均衡。因为LVS是四层负载均衡,因此它相对于其它高层负载均衡的解决办法,比如DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。

(2)LVS的转发主要通过修改IP地址(NAT模式,分为源地址修改SNAT和目标地址修改DNAT)、修改目标MAC(DR模式)来实现。

LVS调度算法

既然是负载均衡,那么后端肯定不止一台服务器,怎么去调度?LVS提供了下面的调度算法

静态调度

  1. rr (Round Robin): 轮询
  2. wrr (weight):加权
  3. sh(source hashing): 源地址散列
  4. dh(Destination Hashing): 目标地址散列

动态调度

  1. lc (Least-Connection): 最少连接
  2. wlc (Weighted Least-Connection): 加权最少连接
  3. sed (Shortest Expected Delay): 最短期望延迟
  4. nq (never queue): 永不排队
  5. LBLC (Locality-Based Least Connection): 基于本地的最少连接
  6. LBLCR (Locality-Based Least Connections withReplication): 基于本地的带复制功能的最少连接

 三、三种工作模式的解析

名词定义:

  • CIP : Client IP 客户端的IP
  • VIP : Virtual IP LVS 实例IP,一般是暴露在公网中的地址;向外部直接面向用户请求,作为用户请求的目标的IP地址
  • DIP : Director IP,主要用于和内部主机通讯的IP地址
  • RIP : Real IP 后端服务器的真实IP
  • DS : Director Server 指的是前端负载均衡器节点
  • RS : Real Server 后端真实的工作服务器

NAT模式:网络地址转换

 

NAT(Network Address Translation)是一种外网和内网地址映射的技术。NAT模式下,网络数据报的进出都要经过LVS的处理。LVS需要作为RS(真实服务器)的网关。当包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,仿佛是客户端直接发给它的一样。RS处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP。这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,这样,这个包对客户端看起来就仿佛是LVS直接返回给它的。客户端无法感知到后端RS的存在。

 

图中黄色数据包是从客户端到LVS集群的,绿色数据包是从LVS集群到客户端的,大概过程如下:

  1. 数据包CIP->VIP,如果直接将数据包塞给RS(真实服务器),RS会丢弃,因此LVS修改目标地址VIP为RIP(D-NAT),此时数据包变成CIP->RIP发给RS
  2. RS处理完成后发送数据包RIP->CIP,这个数据包直接塞给客户端,客户端是不会收的,因为客户端是发给VIP的,但是回来就变成RIP给客户端的了,客户端也会丢弃,因此LVS修改源地址为VIP(S-NAT),此时数据包变成VIP->CIP发给客户端

①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的RIP地址并将报文根据算法发送出去。

③.报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。

④.然后lvs将此报文的源地址修改为本机并发送给客户端。

注意在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端

整个过程保证一个原则:怎么来的就怎么回去,按照Socket四元组IP反向发回去!比如就客户端和LVS而言发来的是CIP->VIP,发回去就得是VIP->CIP,LVS和RS之间也是同样的道理

特点

  • RS应该使用私有地址,DIP和RIP必须在同一个网段内,RS的网关必须指向DIP(因为最终给CIP的数据包要扔回给LVS)
  • 请求和响应报文都需要经过Director Server,高负载场景中,LVS易成为性能瓶颈
  • 支持端口映射
  • RS可以使用任意操作系统

缺陷

  • 对LVS压力会比较大,请求和响应都需经过LVS(一般来说流量是非对称/倾斜的,请求报文小,响应报文大)
  • 不断得进行网络地址转换,消耗算力

既然响应报文太大,有没有办法让响应报文直接返回给CIP,不经过LVS?当然有,这就是DR模式

DR模式:直接路由

     DR负载均衡模式数据分发过程中不修改IP地址,只修改mac地址,由于实际处理请求的真实物理IP地址和数据请求目的IP地址一致,所以不需要通过负载均衡服务器进行地址转换,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。因此,DR模式具有较好的性能,也是目前大型网站使用最广泛的一种负载均衡手段。
 

数据包流向依然是黄色是去向的,绿色是回向的;RS有一个对内可见,对外隐藏的VIP

  1. 数据包CIP->VIP发送给LVS
  2. LVS通过修改MAC地址把数据包直接扔给RS,由于RS也有VIP,所以收下数据包
  3. RS处理完成后,直接封数据包VIP->CIP,返回给客户端,不经过LVS

1.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

2.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。

3.RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。

特征

  • 保证前端路由将目标地址为VIP报文统统发给LVS,而不是RS(因为RS的VIP是隐藏的)
  • RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
  • RS跟LVS必须在同一个物理网络中(因为MAC地址欺骗/ARP欺骗就只能发生在局域网中
  • 所有的请求报文经由LVS,但响应报文必须不能经过LVS
  • 不支持地址转换,也不支持端口映射(因为这是链路层/2层的处理,不涉及到IP)
  • RS可以是大多数常见的操作系统
  • RS的网关绝不允许指向DIP(因为我们不允许他经过LVS)
  • RS上的lo接口配置VIP的IP地址(对外隐藏,对内可见

缺陷

   R S和LVS必须在同一机房中,很显然,ARP欺骗条件要求LVS和DS要在同一个物理局域网内,那有没有不需要再同一个局域网内的?但是是有,那就是隧道模式

TUN模式:隧道模式

 

 

所谓隧道,最简单的理解就是数据包套数据包,一个数据包背上另一个数据包,到了目的地再放下来,整个流程如下:

  1. 数据包CIP->VIP发送给LVS
  2. LVS在源数据包外面套一层形成[DIP->RIP[CIP->VIP]],通过DIP->RIP将数据包发送给RS(DIP和RIP可以是不同的物理网络)
  3. RS拆包接收到CIP->VIP的请求处理完成之后直接封数据包VIP->CIP,返回给客户端,不经过LVS

①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。

③.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。

特征

  • RIP、VIP、DIP全是公网地址
  • RS的网关不会也不可能指向DIP
  • 所有的请求报文经由LVS,但响应报文必须不能进过LVS
  • 不支持端口映射
  • RS的系统必须支持隧道

总结

其实企业中最常用的是DR实现方式,而NAT配置上比较简单和方便,TUN模式则是综合了DR和NAT的优点


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新冠“照妖镜”,体质弱点现原形。你是啥症状?2023年,请好好善待你的身体!

新冠“照妖镜”,体质弱点现原形。你是啥症状? 阳性之后的不同症状,是我们身体发出的【预警信号】。 病毒进入时,最先攻击我们自身最薄弱的地方。 2023年,请好好【善待】你的身体! 症状1 、头疼 出现头痛…

Kurganov-Tadmor二阶中心格式:理论介绍

简介 CFD的核心问题是求解双曲偏微分方程 ∂∂tu(x,t)∂∂xf(u(x,t))0\frac{\partial}{\partial t} u(x, t)\frac{\partial}{\partial x} f(u(x, t))0 ∂t∂​u(x,t)∂x∂​f(u(x,t))0在CFD中,双曲偏微分方程一般使用Godunov型迎风格式求解。但是这种迎风格式往往实…

2022年度学习总结

2022年有焦虑也有成长,记录和总结也是成长的一部分。这一年,我也努力在不确定性中做一些确定的事情,感恩被保护的三年,三年清零抗疫结束,做好自己健康的第一责任人。研一半个学期在网课或者封校中度过,我们…

1.0、Linux-入门概述

1.0、Linux-入门概述 我们为什么要学习 Linux ? Linux诞生了这么多年,以前还喊着如何能取代 Windows 系统,现在这个口号已经小多了,任何事物发展都有其局限性;如同现在国内在搞一个社交软件取代 QQ 、微信 一样&#x…

已解决(Python语法报错)SyntaxError: invalid syntax

已解决(Python语法报错)SyntaxError: invalid syntax 文章目录报错信息报错翻译报错原因解决方法帮忙解决报错信息 粉丝群里面一个小伙伴运行Python代码,但是发生了报错(当时他心里瞬间凉了一大截,跑来找我求助&…

IDEA安装与配置教程

一、下载并安装IDEA 1、下载官网: 下载 IntelliJ IDEA (这里以Windows系统为例,其他系统类似) 2、安装 1、下载完成后,直接点击安装包安装,即可。 2、开始安装,然后下一步 3、可以在此处自定…

算法 - 蓝桥杯并查集题型

目录 合并集合 连通块中点的数量 蓝桥杯2017年第八届真题-合根植物 [蓝桥杯][2019年第十届真题] 修改数组 蓝桥幼儿园 刷了好多题,发现并查集这种思想挺妙的,是时候总结一下了; 作用与基本原理: 套路问题: 用一道…

Mac M1 Pro下载node.js

Mac M1 Pro下载node.js基本信息 Mac M1 Pronode版本:14.20.0npm版本:8.19.3cnpm版本:8.5.1 注意: 我之前是去官网下了最新版本node,但cnpm就是下载不下来,于是查了其他博主的文章,这边通过nvm…

aws codepipeline 配置 ecs 蓝绿部署

参考资料 CI/CD workshop for Amazon ECSTutorial: Create a pipeline with an Amazon ECR source and ECS-to-CodeDeploy deploymentAmazon ECS 计算平台上的部署CodeDeploy AppSpec 文件引用 之前的文章介绍了通过codepipeline对ecs服务进行滚动更新,本文主要介…

Docker 学习总结(78)—— WebAssembly 入门简介

什么是 WebAssembly? WebAssembly 是一种定义二进制指令格式的开放标准,它支持从不同的源语言创建可移植的二进制可执行文件。这些二进制文件可以在各种环境中运行。它起源于 Web,并得到各大主流浏览器的支持。 Wasm 如何在浏览器中工作? …

RCTF-pwn-diary

RCTF-pwn-diary 赛后看了一眼发现给出了源码,https://github.com/ruan777/RCTF2022/blob/main/diary/main.cpp 漏洞是erase的问题 解释一下 add(0) add(1) add(2) delete(1)这样子的话,其实就是把2给删除,把2的内容复制到1中,所…

Base64自定义编码表及破解

什么是Base64 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,Base64并不是安全领域的加密算法,其实Base64只能算是一个编码算法,对数据内容进行编码来适合传输。标准Base64编码解码无需额外信息即完全可逆,即使你自…

基于Python + Django 开发一款学生管理系统(附源码)

文章目录1.开发环境源码分享&技术交流2.项目实战1)创建Django项目2)创建应用3)配置MySQL4)数据模型层创建5)路由配置6)增删改查视图函数7)模板页面创建8)启动web服务1.开发环境 …

最大似然和贝叶斯参数估计

统计生成模型的参数估计 – Maximum Likelihood(ML) 假设参数是某个确定的值,通过使似然度最大求出参数 – Bayesian estimation 假设参数是随机变量,估计参数分布的参数 – 最大似然求出具体的参数,贝叶斯求的是参数的分布 最大似然估计 假…

献给自己技术成长的第三年

年度总结词语:幸运 献给自己技术成长的第三年一、五州一都二、if else量产三、学技术四、用真心五、设计精产六、感恩幸运一、五州一都 1.1-1.12成都、2.23-3.19广州、4.12-7.23苏州、8.12-8.20兰州、8.23-9.20湖州、其余杭州 成都。去年年底出差到成都,…

HTTP_day01

在互联网世界里,HTTP 通常跑在 TCP/IP 协议栈之上,依靠 IP 协议实现寻址和路由、TCP 协议实现可靠数据传输、DNS 协议实现域名查找、SSL/TLS 协议实现安全通信。此外,还有一些协议依赖于 HTTP,例如 WebSocket、HTTPDNS 等。这些协…

【数据结构】冒泡排序、快速排序(递归,非递归)、归并排序(递归,非递归),七大排序比较,

文章目录冒泡排序快速排序归并排序七大排序之间的对比冒泡排序 基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小…

高性能web网关之Openresty相关基础知识

高性能web网关之Openresty一、Openresty 简介二、Openresty 应用场景三、lua-nginx-module3.1、Lua 模块指令顺序3.2、Lua嵌入nginx四、责任链五、cosocket后言一、Openresty 简介 openresty 是一个基于 nginx 与 lua 的高性能 web 平台,其内部集成了大量精良的 lu…

148.排序链表

148.排序链表 题目: 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4]示例 2: 输入:head [-1,5,3,4,0] 输出:…

【论文阅读】CVPR2018-深度材料感知跨光谱立体匹配

深度材料感知跨光谱立体匹配 摘要 跨光谱成像对识别和检测任务很有帮助。通常,多个相机用于跨光谱成像,因此需要图像对齐或双目系统中的视差估计。多相机跨光谱系统逐渐被嵌入到有源RGB-D设备中(例如Kinect和iPhone X中的RGB-NIR相机&#…