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

    文章

    467

    浏览量

    30322
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1272

    浏览量

    78304
  • NAT
    NAT
    +关注

    关注

    0

    文章

    109

    浏览量

    16062

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

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

收藏 人收藏

    评论

    相关推荐

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

    视频网站通常会面临大量的用户访问和视频流量,为了提高性能和可用性,需要使用负载均衡技术。以下是四种常用的视频网站服务器负载均衡技术: 1、基于DNS的
    的头像 发表于 04-01 17:36 151次阅读

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

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

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

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

    路由器负载均衡怎么配置

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

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

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

    多路径负载均衡的建议

    电子发烧友网站提供《多路径负载均衡的建议.pdf》资料免费下载
    发表于 09-01 15:31 0次下载
    多路径<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>的建议

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

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

    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+Lvs+Nginx高可用集群<b class='flag-5'>负载</b><b class='flag-5'>均衡</b>

    负载均衡的工作原理

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

    负载均衡是如何工作的?

    高其效率,从而提高性能并降低延迟。大多数Internet应用程序都需要负载均衡才能准确工作。 那么负载均衡是如何工作的?下面,小编简单给大家
    的头像 发表于 06-15 17:26 472次阅读

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

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

    Nginx四层负载均衡基本概诉

    四层负载均衡基于传输层协议包来封装的(如:TCP/IP),那我们前面使用到的七层指的是应用层,它的封装在四层基础之上,无论四层还是七层都指的是OSI网络模型。
    的头像 发表于 05-22 17:48 1447次阅读
    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>策略