LVS几种模式介绍

备注:这篇真的是水文,不看也罢。

LVS,linux virtual server,可提供IP网络层的负载均衡。

其主要模式主要有以下几种:

LVS-NAT  主要通过网络地址转换,修改目的IP实现。Network Address Translation

LVS-TUN  主要封装一层IP头 IP Tunneling

LVS-DR   主要是修改目的MAC  Direct Routing

LVS-FULLNAT   这个是阿里研发的一种模式,主要是解决多vlan的场景,它会修改请求报文的(源/目的)地址、(源/目的)端口。

先看几个LVS的名词定义:

        CIP:客户端ip

        Director:负载调度集群的主机,简称DR

        VIP:Virtual IP,向外提供服务的IP

        RIP:Real Server IP,内部真正提供服务的IP

        DIP:DR主机用于内部通信的IP

一个完整的经过LVS请求的都会涉及到上面几个角色。

1、LVS-NAT

流程示意图:

其请求处理流程:

1.客户端(Client)发送请求到LVS, 目标IP地址为VIP
2. LVS根据某种负载均衡算法选择一个Real-server,并记录连接信息到hash表中,然后修改客户端的request的目的IP地址为选择的RS(这个RIP只是内部通信用的),随后将请求发给RS,此时源IP为CIP,目的IP为RIP;
3. RS收到request包后,发现目的IP是自己的IP,于是处理请求,然后发送reply给LVS,此时源IP为RIP,目的IP是CIP;
4. LVS收到reply包后,修改reply包的的源地址为VIP,原端口为VIP端口;
5. LVS将reply发送给客户端;
6. 客户端来的属于本次连接的包,查hash表,然后发给对应的RS;
7. 客户端发送完毕,此次连接结束时,LVS自动从hash表中删除此条记录;

上面流程的特点是:

1、DR和RS必须是在同一个网段内,RS的网关配置成DIP,RIP和DIP都是用于内网机器间通信的IP。我感觉说的直白点,RS的网关为DR;

2、所有请求响应都要经过DR,这必然会导致DR会成为整个网络的瓶颈。

2、LVS-TUN

1.客户端Client 发送request包到LVS服务器, 目标地址VIP;
2. LVS按照算法选择后端的一个Real-server,并将记录一条消息到hash表中,然后将客户端的request包封装到一个新的IP包里,新IP包的目的IP是RIP,源IP是DIP,然后转发给RS;
3. RS收到包后,解封装,取出客户端的request包,发现还有一个IP包,目的地址是VIP,而RS发现在自己的虚拟网卡tunl0上有这个IP地址,于是处理客户端的请求,处理完成通过虚拟网卡发送给eth0网口发送出去,此时源IP为VIP,目的地址是CIP;
4. 该客户端的后面的request包,LVS直接按照hash表中的记录直接转发给Real-server,当传输完毕或者连接超时,那么将删除hash表中的记录。

该模式中:

RIP,VIP,DIP都可以是公网地址,可以跨网段;

请求报文都走DR,响应不走,直接由RS发送给Client。这个特点使得TUN的性能要相比NAT提升了几倍,且解决了跨网段问题,问题就在于其维护成本挺高的;

3、LVS-DR

1、客户端Client 发送request包到LVS服务器, 目标地址VIP;
2、LVS根据负载均衡算法选择一台active的Realserver,将此RIP所在网卡的mac地址作为目标mac地址,发送到局域网里,因为是在数据链路层,所以必须在同一局域网;
3、RS在局域网中收到这个帧,拆开后发现目标IP不是自己的IP,正常来讲RS会抛弃的,但由于我们在lo上配置了VIP,所以RS会接收该请求包,并进行处理。

4、处理后,RS直接经过网络发送给客户端,源IP为VIP,目的IP为CIP。

LVS-DR技术解决了NAT的DR瓶颈问题,提高性能,但其最大限制就是DR和RIP必须是同一网段的,解决不料跨网段的问题。

4、LVS-FULLNAT

这个是阿里做的。

LVS的DR和NAT模式要求RS和DR在同一个vlan中,导致部署成本过高;TUN模式虽然可以跨vlan,但RealServer上需要部署ipip隧道模块等,网络拓扑上需要连通外网,较复杂,不易运维。

为了解决上述问题,开发出FULLNAT,该模式和NAT模式的区别是:数据包进入时,除了做DNAT,还做SNAT(用户ip->内网ip),从而实现LVS-RealServer间可以跨vlan通讯,RealServer只需要连接到内网。

当客户端访问VIP后,DR会将源IP改成DIP,目的IP改成RIP,RIP同样是通过某种均衡算法找的。

剩下的就是内网调用的事情了,可以是同网段,也可以是不同网段,至于不同Vlan如何通信,这个就不用多说了把,就是路由策略配置的问题了。

FULLNAT相对于之前那三种方式,可能不是完全集中缺点,但避开了他们的很多缺点,比如配置维护都很简单,可以跨网段。现在也是LVS主流的使用模式。

小米的lvs:

参考资料:

最强lvs总结

高并发场景 LVS 安装及高可用实现

LVS 负载均衡原理及安装配置详解

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

rtthread

创建线程 线程优先级 当Thread1中遇到高优先级的线程时,Thread会先被挂起,rt_thread_delay()延时一定时间,每延时一个tick,执行一次判断,是否超时,如果超时,则调用rt_timer_init()中的rt_thread…

先进电机技术 —— 何为轮毂电机?

一、轮毂电机 轮毂电机(Hub Motor)是一种将电动机集成到车轮内部,直接驱动车轮转动的电动车驱动技术。这种设计省去了传统的传动轴、差速器、半轴等机械传动部件,使得动力传输更为直接、高效。 轮毂电机的优点: 1. 结…

源支付V7开源版2.99,修复各种提示错误

源支付V7开源版2.99,修复各种提示错误 加密说明:200拿来的,只有8.1这个文件加密,其他文件无任何加密,已修复各种提示错误 测试其他开源版安装提示错误,有几个文件是加密的 注:开发不易&#…

Java8之接口默认方法

Java8之接口默认方法 一、介绍二、代码1、接口2、实现类3、测试代码4、效果 一、介绍 在Java8中,允许为接口方法提供一个默认的实现。必须用default修饰符标记这样一个方法。默认方法也可以调用其他方法 二、代码 1、接口 public interface PersonService {void…

自定义类型(二)结构体位段,联合体,枚举

这周一时兴起,想写两篇文章来拿个卷吧,今天也是又来写一篇博客了,也是该结束自定义类型的学习与巩固了。 常常会回顾努力的自己,所以要给自己的努力留下足迹。 为今天努力的自己打个卡,留个痕迹吧 2024.03.30 小闭…

数据库工具——DBeaver的安装及使用

目录 一、DBeaver介绍 1.定义 2.支持的数据库 3.支持的操作系统 4.特点 二、DBeaver安装及使用 1.服务启动 2.查看连接类型 3.演示连接Mysql数据库 4.连接配置 5.成功连接 6.远程控制 6.1新建数据库 6.2新建数据表 6.3添加字段列 6.4使用SQL编辑器进行编辑 一…

mac怎么删除python

mac 默认安装了python2;自己后面又安装了python3;为了方便,现在想将python3换成Anaconda3。 Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。 Python3安装之后,在系统中不同目…

ESD保护二极管ESD9B3.3ST5G 以更小的空间实现强大的保护 车规级TVS二极管更给力

什么是汽车级TVS二极管? TVS二极管是一种用于保护电子电路的电子元件。它主要用于电路中的过电压保护,防止电压过高而损坏其他部件。TVS二极管通常被称为“汽车级”是因为它们能够满足汽车电子系统的特殊要求。 在汽车电子系统中,由于车辆启…

江大白 | 万字长文,深度梳理Python多线程与多进程(建议收藏 !)

本文来源公众号“江大白”,仅用于学术分享,侵权删,干货满满。 原文链接:万字长文,深度梳理Python多线程与多进程 以下文章来源于博客:标点符 作者:钱魏Way 链接:https://www.bia…

Facebook Horizon Worlds:打造数字世界的社交乐园

在数字化时代,社交媒体平台已经成为人们日常生活中不可或缺的一部分。而随着科技的不断发展,人们对于社交体验的需求也在不断演变。在这样的背景下,Facebook推出了全新的虚拟现实社交平台——Facebook Horizon Worlds,旨在打造一个…

电脑换屏总结——关于我把电脑砸了这件事!

大家好,我是工程师看海,很高兴和各位一起分享我的原创文章,喜欢和支持我的工程师,一定记得给我点赞、收藏、分享哟。 加微信[chunhou0820]与作者进群沟通交流。 【淘宝】https://m.tb.cn/h.5PAjLi7?tkvmMLW43KO7q CZ3457 「运放秘…

利用vite创建vue3项目

vue3 项目推荐使用vue官方推荐的vite手脚架创建,vue3项目,使用vue-cli 会存在一些问题 1.node的版本 目前的vue3需要至少需要node18及以上,可以安装nvm node包管理器可以快速切换node版本,因为node的版本的兼容性真是一言难尽。…

【Kubernetes】K8s 中的 Pod 驱逐

K8s 中的 Pod 驱逐 1.Pod 被驱逐的原因:抢占和节点压力2.抢占式驱逐2.1 Pod 调度2.1.1 过滤2.1.2 计分 2.2 Pod 优先级2.3 优先级示例 3.节点压力驱逐3.1 服务质量等级3.1.1 Guaranteed3.1.2 Burstable3.1.3 BestEffort 4.其他类型的驱逐4.1 API 发起的驱逐&#xf…

国内怎么使用Midjourney(终于找到免费版)

随着人工智能的大火,不管是职场人还是自由职业者,使用AI绘画工具已经成为当下必备技能,其中Midjourney便是最受大家青睐的AI绘画工具,但是由于种种原因,国内使用Midjourney非常不凡便,功夫不负有心人&#…

集合(ArrayList,HashMap,HashSet)详解+ entrySet的应用

集合 例题引入——直线题意分析根据下面的参考代码,自己模仿的参考代码(加一点点我的小tips) 1.java集合引入2.为什么要使用集合?3.List、Set、Queue和Map的区别4.ListList——ArrayList(!!实用…

最长子序列问题看得最懂的一集!(Java版)

近期做十四届蓝桥杯真题,遇到好多类似子序列的题目,发现还是不会做,于是乎回来再做一遍代码随想录相关题目,回来总结一下这几道题子序列问题(300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组&#x…

Golang生成UUID

安装依赖 go get -u github.com/google/uuid文档 谷歌UUID文档 示例 函数签名func NewV7() ( UUID ,错误) func (receiver *basicUtils) GenerateUUID() uuid.UUID {return uuid.Must(uuid.NewV7()) } uid : GenerateUUID()

springboot上

springboot spring概述 https://spring.io 特点 springboot主要特性 依赖管理 场景starter 自动配置 默认包和扫描路径 自定义包扫描路径 spring配置介绍 yml书写 常用注解介绍

项目安全性与权限管理实践与探讨

✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 目录 引言 一. 身份验证和授权 二. 输入验证和过滤 2.1. 添加O…

<QT基础(2)>QScrollArea使用笔记

项目需要设置单个检查的序列图像预览窗口,采用QScrollArea中加入QWidget窗口,每个窗口里面用Qlabel实现图像预览。 过程涉及两部分内容 引入QWidget 引入label插入图像(resize) 引入布局 组织 scrollArea内部自带Qwidget&#…