0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

负载均衡能否能直接从LVS打到站点层

开关电源芯片 来源:码海 作者:坤哥 2021-08-17 10:29 次阅读

上一篇负载均衡的文章有一个点不少人有疑问,所以我觉得有必要单独写篇文章解释一下,先看下上篇文章展示的架构图:

4b41a5ba-fe81-11eb-9bcf-12bb97331649.png

这里一些朋友的疑问点是 Nginx 是否多此一举,能否能直接从 LVS 打到站点层?即改成下面的架构

4b567bb6-fe81-11eb-9bcf-12bb97331649.jpg

答案是不行,为什么?其实我在上文中有提到一些点已经暗示了,只不过不那么明显而已,我再单独把这些点拎出来

LVS 是四层负载均衡器

Nginx 是七层负载均衡器,可以根据 url 来转发流量

首先我们需要明白为什么根据 url 转发请求这么重要,假设现在有「营销」,「运营中心」这两个集群,使用 Nginx 的话很简单,根据 url 来决定到底将请求转发到哪个集群即可

4b8463a0-fe81-11eb-9bcf-12bb97331649.jpg

由于 LVS 不能根据 url 转发,那么请问 LVS 收到请求后该转给谁

那么 LVS 为什么不能根据 url 来转发呢,因为它是四层负载均衡器,什么是四层和七层,这里就要简单复习下 ISO 七层参考模型了

4bb55438-fe81-11eb-9bcf-12bb97331649.jpg

由此可知,七层对应着应用层,四层对应着传输层,如果从应用层发起一个请求会在「传输层」,「网络层」,「数据链路层」分别加上各自层的包头,比如现在 A 电脑要发一个「I‘m Deepon」数据给 B 电脑,则在各层的转化流程如下图所示

4bd51fca-fe81-11eb-9bcf-12bb97331649.jpg

但最终在互联网上要传输的包(数据链路层传输的包叫祯,统称为包)是有大小限制的,如下图所示

4be74f60-fe81-11eb-9bcf-12bb97331649.jpg

在互联网上传输的包不能超过 14 + 20 + 20 + 1460 + 4 = 1518 byte,其中包含的应用层(即 payload)数据一次性不能超过 1460 个 byte,也就是说如果一个 HTTP 请求有 2000 byte,那么它必须分成两个包发送才能在网络上传输,再来看看 HTTP 的格式

4bf14718-fe81-11eb-9bcf-12bb97331649.jpg

如果一个 HTTP POST 请求很大,超过了 1460 byte(一个包 payload 的最大值),那么它必须分成两个包才能传输,也就意味着一个包可能包含 URI,另一个包不包含 URI,既然包都不包含 URI,那么请问 LVS 如何根据 URL 来转发给相应的集群呢,所以理解了 TCP/IP 的工作机制相信你不难理解开头的问题:LVS 是四层负载均衡器,无法根据 URL 来转发请求。

其实最关键的原因是四层以下其实只负责包的转发,只要拿出包头查看一下 ip 地址就可知道该转发哪里,很高效,如果你还要根据 url 来匹配那么需要拿到应用层数据根据正则等做匹配,显然会消耗更多的性能,所以专业的人做专业的事,应该由 LVS 来负责承载所有流量,Nginx 负责根据 url 来转发给对应的集群,因为它是七层负载均衡器,与上下游各建立了一个 TCP 链接

4c088f04-fe81-11eb-9bcf-12bb97331649.jpg

所以如果有多个分包,由于 Nginx 与 client 建立了 TCP 连接,可以在 Nginx 先拿到 client 发出的所有的分包再组装成完整的报文, 然后根据 url 选择其中一台 server 与之建立 TCP 连接后将数据分批完整地传给上游 server

另外需要注意的是现在在大厂中如果只将 Nginx 作为转发之用是不够的,一般用的 OpenResty ,什么是 OpenResty 呢

“OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

OpenResty 的目标是让你的 Web 服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。”

注意上面一句「提供了与 MySQL ,Redis 等的交互能力」这一点非常关键,我们之前不是说 Nginx 可以根据 url 来决定打向哪个集群吗,假设现在有一个这样的场景:所有包含 operation 的请求都转发到运营中心的集群,则需要写死类似如下的配置

upstream backend {

server 192.168.1.10:8080

server 192.168.1.11:8080

}

server {

location /operation {

proxy_pass http://backed

}

}

在我们集团中类似这样的规则非常多,难道要像上面这样把所有的规则都一个个写死在 Nginx 的配置文件里吗?显然不可行,更合理的方式是把这些规则(哪个 url 对应哪些集群)保存在 MySQL 中,然后 Nginx 在启动的时候将这些规则从 MySQL 中取出并保存在 Redis 及本地缓存中,然后 Nginx 要根据 url 匹配的时候从本地缓存(如果没有从 redis 拿,redis 过期从 MySQL 拿)里拿这些规则再根据匹配项转发到相应的集群,Nginx 没有这样的能力,而 OpenResty 由于集成了 Lua,引入了与 MySQL, Redis 等交互的模块,所以用它是可行的,所以最终架构如下(将 Nginx 换成 OpenResty)

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 负载均衡
    +关注

    关注

    0

    文章

    97

    浏览量

    12188
  • LVS
    LVS
    +关注

    关注

    0

    文章

    35

    浏览量

    9860

原文标题:再谈负载均衡

文章出处:【微信号:gh_3980db2283cd,微信公众号:开关电源芯片】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于LVS+Keepalived实现高可用负载均衡

    LVS 是一种预装在 Linux 系统中,基于四层、具有强大性能的反向代理服务器。ipvsadm 是 LVS 的命令行管理工具。
    的头像 发表于 04-09 12:30 213次阅读
    基于<b class='flag-5'>LVS</b>+Keepalived实现高可用<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>

    视频网站服务器的四种负载均衡技术

    域名并返回多个服务器的IP地址列表,客户端会根据DNS返回的IP地址进行请求。这种方式简单易用,但无法直接控制请求的分配,且存在DNS缓存问题。另外,由于DNS解析的缓存时间,可能导致负载均衡。 2、硬件
    的头像 发表于 04-01 17:36 149次阅读

    负载均衡器的诞生和工作机制

    今天我们来深度揭秘一下负载均衡LVS 的秘密,相信大家看了你管这破玩意儿叫负载均衡?这篇文章后,还是有不少疑问,比如
    的头像 发表于 01-04 12:26 455次阅读
    <b class='flag-5'>负载</b><b class='flag-5'>均衡</b>器的诞生和工作机制

    如何确定适合的负载均衡比例

    路由器的负载均衡是一种应用于网络中的技术,它可以平衡网络流量的分配,提高网络的性能和稳定性。在配置路由器的负载均衡时,选择合适的负载
    的头像 发表于 12-15 10:36 493次阅读

    路由器负载均衡怎么配置

    路由器负载均衡是一种重要的网络技术,它能够将多个网络连接的流量分配到多个路由器上,以提高网络的性能和稳定性。本文将详细介绍路由器负载均衡的配置方法,包括
    的头像 发表于 12-13 11:17 1272次阅读

    Dubbo路由模块及负载均衡的优化手段

    本文主要介绍在vivo内部针对Dubbo路由模块及负载均衡的一些优化手段,主要是异步化+缓存,可减少在RPC调用过程中路由及负载均衡的CPU消耗,极大提升调用效率。
    的头像 发表于 11-02 09:56 314次阅读
    Dubbo路由模块及<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>的优化手段

    基于DNS实现负载均衡的优缺点

    答案是不会。本题的考察点其实就是 DNS 负载均衡
    的头像 发表于 09-04 10:18 368次阅读
    基于DNS实现<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>的优缺点

    负载均衡的策略有哪些? 负载均衡的三种方式?

    负载均衡的策略有哪些? 负载均衡的策略有如下: 轮询(Round Robin):按照请求的顺序轮流分配到不同的服务器。 权重(Weighted):给不同的服务器分配不同的权重,根据权重
    的头像 发表于 07-25 14:13 1234次阅读

    SDWAN和负载均衡的关系

    SDWAN和负载均衡的关系
    的头像 发表于 07-21 14:28 369次阅读

    搭建Keepalived+Lvs+Nginx高可用集群负载均衡

      一、Nginx安装 二、配置反向代理 三、配置负载均衡 四、upstream指令参数 五、配置ssl证书提供https访问 六、配置ha nginx 七、LVS(Linux Virtual
    的头像 发表于 06-25 15:39 1814次阅读
    搭建Keepalived+<b class='flag-5'>Lvs</b>+Nginx高可用集群<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>

    负载均衡的工作原理

    负载均衡是在多个物理服务器之间智能分配流量以最大化资源利用率的过程。换句话说,在两台或多台计算机/服务器之间共享计算工作负载的过程就是负载均衡
    的头像 发表于 06-16 17:14 1333次阅读

    负载均衡是如何工作的?

    负载均衡是在多个物理服务器之间智能分配流量以最大化资源利用率的过程。换句话说,在两台或多台计算机/服务器之间共享计算工作负载的过程就是负载均衡
    的头像 发表于 06-15 17:26 470次阅读

    高性能负载均衡的分类和算法

    高性能集群之所以复杂,主要原因是增加了任务分配器,以及为任务选择合适的分配算法。负载均衡器就是任务分配器,负载均衡这个名称已经成为事实标准,但负载
    的头像 发表于 05-31 09:56 467次阅读
    高性能<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>的分类和算法

    Nginx四层负载均衡基本概诉

    四层负载均衡基于传输层协议包来封装的(如:TCP/IP),那我们前面使用到的七层指的是应用层,它的封装在四层基础之上,无论四层还是七层都指的是OSI网络模型。
    的头像 发表于 05-22 17:48 1442次阅读
    Nginx四层<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>基本概诉

    简述SpringCloud Ribbon中的7种负载均衡策略

    负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而我们今天的主角
    的头像 发表于 05-11 17:32 507次阅读
    简述SpringCloud Ribbon中的7种<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>策略