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

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

3天内不再提示

大家知道什么是负载均衡吗

开关电源芯片 来源:博客园 作者:ErnestEvan 2021-08-14 14:32 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

相信大家都听过这样的一道经典面试题:「请说出在淘宝网输入一个关键词到最终展示网页的整个流程,越详细越好」

这个问题很难,涉及到 HTTP,TCP,网关,LVS 等一系列相关的概念及诸多协议的工作机制,如果你能掌握到这其中的每个知识点,那将极大地点亮你的技能树,对于网络是如何运作也会了然于胸,即便不能完全掌握,但知道流量怎么流转的对你排查定位问题会大有帮助。

我之前就利用这些知识定位到不少问题,为了弄清楚整个流程,我查阅了很多资料,相信应该可以把这个问题讲明白,不过写着写着发现篇幅实在太长,所以分为上下两篇来分别介绍一下,本篇先介绍流量在后端的的整体架构图,下一篇会深入剖析各个细节点,如 LVS ,NAT 的工作细节等,这其中会涉及到交换机,路由器的工作机制等知识点,相信大家看了肯定有帮助

李大牛创业了,由于前期没啥流量,所以他只部署了一台 tomcat server,让客户端将请求直接打到这台 server 上

这样部署一开始也没啥问题,因为业务量不是很大,单机足以扛住,但后来李大牛的业务踩中了风口,业务迅猛发展,于是单机的性能逐渐遇到了瓶颈,而且由于只部署了一台机器,这台机器挂掉了业务也就跌零了,这可不行,所以为了避免单机性能瓶颈与解决单点故障的隐患,李大牛决定多部署几台机器(假设为三台),这样可以让 client 随机打向其中的一台机器,这样就算其中一台机器挂了,另外的机器还存活,让 client 打向其它没有宕机的机器即可

现在问题来了,client 到底该打向这三台机器的哪一台呢,如果让 client 来选择肯定不合适,因为如果让 client 来选择具体的 server,那么它必须知道有哪几台 server,然后再用轮询等方式随机连接其中一台机器,但如果其中某台 server 宕机了,client 是无法提前感知到的。

那么很可能 client 会连接到这台挂掉的 server 上,所以选择哪台机器来连接的工作最好放在 server 中,具体怎么做呢,在架构设计中有个经典的共识:没有什么是加一层解决不了的,如果有那就再加一层,所以我们在 server 端再加一层,将其命名为 LB(Load Balance,负载均衡),由 LB 统一接收 client 的请求,然后再由它来决定具体与哪一个 server 通信,一般业界普遍使用 Nginx 作为 LB

采用这样的架构设计总算支撑了业务的快速增长,但随后不久李大牛发现这样的架构有点问题:所有的流量都能打到 server 上,这显然是有问题的,不太安全,那能不能在流量打到 server 前再做一层鉴权操作呢,鉴权通过了我们才让它打到 server 上,我们把这一层叫做网关(为了避免单点故障,网关也要以集群的形式存在)

这样的话所有的流量在打到 server 前都要经过网关这一层,鉴权通过后才把流量转发到 server 中,否则就向 client 返回报错信息,除了鉴权外,网关还起到风控(防止羊毛党),协议转换(比如将 HTTP 转换成 Dubbo),流量控制等功能,以最大程度地保证转发给 server 的流量是安全的,可控的。

这样的设计持续了很长一段时间,但是后来李大牛发现这样的设计其实还是有问题,不管是动态请求,还是静态资源(如 js,css文件)请求都打到 tomcat 了,这样在流量大时会造成 tomcat 承受极大的压力,其实对于静态资源的处理 tomcat 不如 Nginx,tomcat 每次都要从磁盘加载文件比较影响性能,而 Nginx 有 proxy cache 等功能可以极大提升对静态资源的处理能力。

画外音:所谓的 proxy cache 是指 nginx 从静态资源服务器上获取资源后会缓存在本地的内存+磁盘中,下次请求如果命中缓存就从 Nginx 本机的 Cache 中直接返回了

所以李大牛又作了如下优化:如果是动态请求,则经过 gateway 打到 tomcat,如果是 Nginx,则打到静态资源服务器上

这就是我们所说的动静分离,将静态请求与动态请求分开,这样 tomcat 就可以专注于处理其擅长的动态请求,而静态资源由于利用到了 Nginx 的 proxy cache 等功能,后端的处理能力又上了一个台阶。

另外需要注意的是并不是所有的动态请求都需要经过网关,像我们的运营中心后台由于是内部员工使用的,所以它的鉴权与网关的 api 鉴权并不相同,所以我们直接部署了两台运营中心的 server ,直接让 Nginx 将运营中心的请求打到了这两台 server 上,绕过了网关。

当然为了避免单点故障 Nginx 也需要部署至少两台机器,于是我们的架构变成了下面这样,Nginx 部署两台,以主备的形式存在,备 Nginx 会通过 keepalived 机制(发送心跳包) 来及时感知到主 Nginx 的存活,发现宕机自己就顶上充当主 Nginx 的角色

看起来这样的架构确实不错,但要注意的是 Nginx 是七层(即应用 层)负载均衡器 ,这意味着如果它要转发流量首先得和 client 建立一个 TCP 连接,并且转发的时候也要与转发到的上游 server 建立一个 TCP 连接,而我们知道建立 TCP 连接其实是需要耗费内存(TCP Socket,接收/发送缓存区等需要占用内存)的,客户端和上游服务器要发送数据都需要先发送暂存到到 Nginx 再经由另一端的 TCP 连接传给对方。

所以 Nginx 的负载能力受限于机器I/O,CPU内存等一系列配置,一旦连接很多(比如达到百万)的话,Nginx 抗负载能力就会急遽下降。

经过分析可知 Nginx 的负载能力较差主要是因为它是七层负载均衡器必须要在上下游分别建立两个 TCP 所致,那么是否能设计一个类似路由器那样的只负载转发包但不需要建立连接的负载均衡器呢,这样由于不需要建立连接,只负责转发包,不需要维护额外的 TCP 连接,它的负载能力必然大大提升,于是四层负载均衡器 LVS 就诞生了,简单对比下两者的区别

可以看到 LVS 只是单纯地转发包,不需要和上下游建立连接即可转发包,相比于 Nginx 它的抗负载能力强、性能高(能达到 F5 硬件的 60%),对内存和cpu资源消耗比较低

那么四层负载均衡器是如何工作的呢

负载均衡设备在接收到第一个来自客户端的SYN 请求时,即通过负载均衡算法选择一个最佳的服务器,并对报文中目标IP地址进行修改(改为后端服务器 IP ),直接转发给该服务器。TCP 的连接建立,即三次握手是客户端和服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作。在某些部署情况下,为保证服务器回包可以正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改。

综上所述,我们在 Nginx 上再加了一层 LVS,以让它来承接我们的所有流量,当然为了保证 LVS 的可用性,我们也采用主备的方式部署 LVS,另外采用这种架构如果 Nginx 容量不够我们可以很方便地进行水平扩容,于是我们的架构改进如下:

当然只有一台 LVS 的话在流量很大的情况下也是扛不住的,怎么办,多加几台啊,使用 DNS 负载均衡,在 DNS 服务器解析域名的时候随机打到其中一台 LVS 不就行了

通过这样的方式终于可以让流量稳定流转了,有个点可能一些朋友会有疑问,下面我们一起来看看

既然 LVS 可以采用部署多台的形式来避免单点故障,那 Nginx 也可以啊,而且 Nginx 在 1.9 之后也开始支持四层负载均衡了,所以貌似 LVS 不是很有必要?

通过部署多台 Nginx 的方式在流量不是那么大的时候确实是可行,但 LVS 是 Linux 的内核模块,工作在内核态,而 Nginx 工作在用户态,也相对比较重,所以在性能和稳定性上 Nginx 是不如 LVS 的,这就是为什么我们要采用 LVS + Nginx 的部署方式。

另外相信大家也注意到了,如果流量很大时,静态资源应该部署在 CDN 上, CDN 会自动选择离用户最近的节点返回给用户,所以我们最终的架构改进如下

总结架构一定要结合业务的实际情况来设计,脱离业务谈架构其实是耍流氓,可以看到上文每一个架构的衍化都与我们的业务发展息息相关,对于中小型流量没有那么大的公司,其实用 Nginx 作为负载均衡足够,在流量迅猛增长后则考虑使用 lvs+nginx,当然像美团这样的巨量流量(数十 Gbps的流量、上千万的并发连接),lvs 也不管用了(实测虽然使用了 lvs 但依然出现了不少丢包的现象)所以它们开发出了自己的一套四层负载均衡器 MGW

另外看了本文相信大家对分层的概念应该有更透彻的理解,没有什么是分层解决不了的事,如果有,那就再多加一层,分层使每个模块各司其职,功能解藕,而且方便扩展,大家很熟悉的 TCP/IP 就是个很好的例子,每层只管负责自己的事,至于下层是什么实现的上层是不 care 的

以上就是本文的全部内容,希望大家看了有收获

编辑:jq

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

    关注

    0

    文章

    531

    浏览量

    34853
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1418

    浏览量

    83017
  • NAT
    NAT
    +关注

    关注

    0

    文章

    166

    浏览量

    17092

原文标题:你管这破玩意儿叫负载均衡?

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    逐流、逐包、Flowlet:哪种负载均衡技术更适合未来网络?

    当前主流的负载均衡技术主要包括三种类型:逐流的ECMP负载均衡、逐包负载均衡以及基于子流(Flo
    的头像 发表于 09-22 14:17 1786次阅读
    逐流、逐包、Flowlet:哪种<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>技术更适合未来网络?

    Nginx和HAProxy企业级负载均衡方案的对比

    想象一下,你的电商网站在双十一当天需要处理平时100倍的流量,单台服务器显然无法承受。这时候,负载均衡就像是一个智能的交通指挥员,将海量请求合理分配到多台后端服务器,确保系统稳定运行。
    的头像 发表于 09-18 15:01 492次阅读

    燃料电池负载均衡测试:解锁高效供能密码

    在新能源领域蓬勃发展的当下,燃料电池凭借其清洁、高效的特性脱颖而出。而负载均衡测试作为确保燃料电池稳定运行与性能优化的关键环节,意义非凡。以下是一套全面且实用的燃料电池负载均衡测试方案
    发表于 09-18 13:51

    华纳云:海外服务器负载均衡与高可用架构设计

    在现代互联网应用中,海外服务器承担着跨境业务、高并发请求和实时数据传输的关键角色。单台服务器难以支撑大量并发请求,一旦发生故障,可能导致服务中断和业务损失。因此,合理设计负载均衡与高可用架构,能够
    的头像 发表于 08-28 18:32 479次阅读

    怎样确定分布式光伏集群通信网络的负载均衡策略?

    LZ-DZ100电能质量在线监测装 确定分布式光伏集群通信网络的负载均衡策略,需结合集群的网络拓扑、数据特征、设备特性及运行需求,通过 “现状分析→目标设定→策略设计→验证优化” 的流程逐步推进
    的头像 发表于 08-22 10:10 399次阅读
    怎样确定分布式光伏集群通信网络的<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>策略?

    Nginx负载均衡策略选择指南

    上个月,我们的电商系统在大促期间突然出现用户购物车数据丢失的问题。经过排查发现,罪魁祸首竟然是负载均衡策略配置不当!
    的头像 发表于 08-20 16:23 587次阅读

    一文详解Nginx负载均衡

    Nginx作为负载均衡器,通过将请求分发到多个后端服务器,以提高性能、可靠性和扩展性。支持多种负载均衡算法,如轮询、最小连接数、IP哈希等,可以根据需求选择适合的算法。
    的头像 发表于 06-25 14:51 859次阅读
    一文详解Nginx<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>

    四层和七层负载均衡的核心区别

    在现代分布式系统和云计算架构中,负载均衡(Load Balancing, LB)是确保高可用性、可扩展性和性能优化的关键技术。负载均衡器根据不同的OSI模型层级工作,主要分为四层(L4
    的头像 发表于 05-29 17:42 952次阅读

    Kubernetes负载均衡器MetalLB介绍

    Kubernetes中一个应用服务会有一个或多个实例,每个实例(Pod)的IP地址由网络插件动态随机分配(Pod重启后IP地址会改变)。为屏蔽这些后端实例的动态变化和对多实例的负载均衡,引入了 Service这个资源对象。
    的头像 发表于 03-18 16:24 727次阅读
    Kubernetes<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>器MetalLB介绍

    常见网络负载均衡的几种方式

    常见网络负载均衡的几种方式包括:DNS负载均衡、反向代理负载均衡、IP
    的头像 发表于 03-06 11:14 1085次阅读

    Haproxy负载均衡器深度解析

    Load Balance,简称LB,是一种服务或基于硬件设备等实现的高可用反向代理技术,负载均衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备,从而提高了公司业务的并发处理能力、保证了业务的高可用性、方便了业务后期的水平动态扩展。
    的头像 发表于 03-01 14:12 1022次阅读

    对于BNC连接器大家知道最难解决的问题是什么?

    BNC连接器不管在那种应用厂家中使用,都会发生来着本身的问题影响设备的稳定。那么在使用中对于BNC连接器大家知道最难解决的问题是什么?不管是难解决的还是容易解决的,都要及时发现并处理,接下来由德索精密工业工程师来为大家讲解几点常
    的头像 发表于 02-20 08:58 680次阅读
    对于BNC连接器<b class='flag-5'>大家</b><b class='flag-5'>知道</b>最难解决的问题是什么?

    云服务器怎么做负载均衡

    云 服务器怎么做负载均衡 ? 云服务器的负载均衡通过分配策略、自动扩展、健康检查和跨区域部署四个核心技术来实现。 分配策略包括轮询、权重分配和最少连接数,确保流量均匀分配。自动扩展根据
    的头像 发表于 12-24 10:40 655次阅读

    常见的lvs负载均衡算法

    常见的lvs负载均衡算法包括轮询(RR)、加权轮询(WRR)、最小连接(LC)、加权最小连接(WLC)、基于局部性的最少链接(LBLC)、带复制的LBLC(LBLCR)、目标地址散列(DH)、源地址
    的头像 发表于 12-12 13:50 932次阅读

    负载均衡服务器与服务器如何连接?

    负载均衡服务器与服务器如何连接?负载均衡服务器与服务器可通过多种方式连接,包括直接连接、交换机连接、路由器连接以及云计算环境中的连接。小型网络常采用直接连接,中大型网络则常用交换机或路
    的头像 发表于 12-09 13:41 765次阅读