周志明的软件架构课
周志明
博士,远光软件研究院院长,《深入理解 Java 虚拟机》《凤凰架构》等书作者
54203 人已学习
免费领取
课程目录
已完结/共 74 讲
架构师的视角 (24讲)
周志明的软件架构课
15
15
1.0x
00:00/00:00
登录|注册

20 | 常见的四层负载均衡的工作模式是怎样的?

你好,我是周志明。
在上节课,我们学习了利用 CDN 来加速网络性能的工作内容,包括路由解析、内容分发、负载均衡和它所支持的应用。其中,负载均衡是相对独立的内容,它不仅在 CDN 方面有应用,在大量软件系统的生产部署中,也都离不开负载均衡器的支持。所以今天这节课,我们就一起来了解下负载均衡器的作用与原理。
在互联网时代的早期,网站流量还比较小,业务也比较简单,使用单台服务器基本就可以满足访问的需要了。但时至今日,互联网也好,企业级也好,一般实际用于生产的系统,几乎都离不开集群部署了。
一方面,不管是采用单体架构多副本部署还是微服务架构,也不管是为了实现高可用还是为了获得高性能,信息系统都需要利用多台机器来扩展服务能力,希望用户的请求不管连接到哪台机器上,都能得到相同的处理。
另一方面,如何构建和调度服务集群这件事情,又必须对用户一侧保持足够的透明,即使请求背后是由一千台、一万台机器来共同响应的,这也都不是用户会关心的事情,用户需要记住的只有一个域名地址而已。
那么,这里承担了调度后方的多台机器,以统一的接口对外提供服务的技术组件,就是“负载均衡器”(Load Balancer)了。
真正的大型系统的负载均衡过程往往是多级的。比如,在各地建有多个机房,或者是机房有不同网络链路入口的大型互联网站,然后它们会从 DNS 解析开始,通过“域名” → “CNAME” → “负载调度服务” → “就近的数据中心入口”的路径,先根据 IP 地址(或者其他条件)将来访地用户分配到一个合适的数据中心当中,然后才到了我们马上要讨论的各式负载均衡。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

四层负载均衡和七层负载均衡是网络系统中常见的负载均衡工作模式。四层负载均衡通过维持同一个TCP连接来实现负载均衡,工作在二层和三层,能够改写MAC地址和IP地址。它包括基于传输层和网络层的负载均衡,以及数据链路层负载均衡和网络层负载均衡的实现方式和适用场景。另外,七层负载均衡器能够感知应用层通讯的具体内容,实现更智能化的路由、安全防护等功能。文章还介绍了常见的均衡策略和负载均衡器的实现方式。读者通过本文可以全面了解负载均衡的工作原理、实现方式以及各自的优缺点和适用场景。

该试读文章来自《周志明的软件架构课》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(30)

  • 最新
  • 精选
  • 老师: 对下面这描叙情况有个疑惑? 正是因为实际处理请求的真实物理服务器 IP 和数据请求中的目的 IP 是一致的,所以响应结果就不再需要通过负载均衡服务器进行地址交换,我们可以把响应结果的数据包直接从真实服务器返回给用户的客户端,避免负载均衡器网卡带宽成为瓶颈 既然真实服务器ip和负载均衡器一样。那么真实服务器给客户端响应时,还需要重新三次握手建立连接吗,如果需要的话,客户端建立连接时不是依然要发包经过负载均衡器

    作者回复: 所有的基于转发的负载均衡,都是维持着同一条TCP连接,响应的时候当然不需要再建立连接了。事实上,从客户端上看,完全看不出来响应结果是从均衡器还是从真实服务器发回来的(因为它们有相同的IP,用着同一个TCP连接)

    2021-03-18
    2
    9
  • tt
    老师新年好。 多级混合负载均衡是因为流量在不同的阶段业务属性的“含量”是逐渐增加的,所以负载均衡约到后方,越靠近应用层。 同时,流量在不同的阶段,流量大小也是不同的,所需的处理时间也是不同的。 类似于医疗系统的分层分类,负载均衡设备也做了类似处理。

    作者回复: 新年好,理解和类比都很好。

    2021-01-01
    6
  • 邓超
    周老师,网络层负载均衡,均衡器将请求转发给真实应用服务器,不管是包一层头,还是直接修改头,是不是目标MAC地址都必须得是真实应用服务的MAC地址?

    作者回复: 确实是真实服务器。但是既然讨论的是网络层的负载均衡,一般就不会去谈论链路层的MAC地址了,这没有意义。原因是真实服务器收到的Frame Header必定是由上一跳(Next Hop)的机器所封装的,原有负载均衡器收到Frame Header早已经在路由的过程中被拆掉了。

    2021-02-01
    5
  • 小何
    请问老师nginx支持的四层负载均衡是不是跟上面说的LVS不一样,并不是包转发,而也是采用的代理?也就是存在两条独立的tcp连接。

    作者回复: Nginx一般是用来做七层负载的,在四层工作一般就考虑LVS。不过它确实可以通过stream模块做四层BL,这个模块我自己没有实际用过,但简单地看看它的配置项,是以proxy的形式工作的。如果具体要用到,建议找一下这个模块的详细资料来确认一下。

    2021-01-10
    5
  • 李二木
    老师好,<“四层”的意思是说,这些工作模式的共同特点是都维持着同一个 TCP 连接,而不是说它就只工作在第四层”>,对维持同一个TCP连接很困惑,它是指客户端最终获取是真实服务器返回的数据,不会再经过负载均衡服务器返回吗?

    作者回复: 不是啊,譬如NAT模式就不是由真实服务器直接返回的,必须通过BL去转发。但这并不影响它是“一个TCP连接”,不妨试想一下你家里多台机器通过路由器NAT上网的场景,有路由器在中间转发,并不阻碍你与外网的服务器直接建立连接。

    2021-01-31
    4
    2
  • 大力水手Jerry
    老师,“此时正式服务器、负载均衡器、客户端三者之间,是由两条独立的 TCP 通道来维持通讯的”,一贯性考虑,前面应该是“真实服务器”。

    作者回复: 感谢指正,这是个错别字哈.

    2021-03-19
  • FollWinds
    IPv4 数据包Headers固定长度是20个字节,文中表格里源地址应该为4个字节

    作者回复: 赞细心,感谢,我通知编辑更新。

    2021-01-08
  • zhanyd
    为什么负载均衡不能只在某一个网络层次中完成,而是要进行多级混合的负载均衡? 因为每一个网络层的功能是不一样的,这样就决定了每一层都有自己独有的数据,在不同的网络层做负载均衡能达到不同的效果。 例如:要修改MAC地址在数据链路层修改最方便,要修改IP地址最好在网络层修改。 关于网络分层打个比方,小帅在网上下单买东西,卖家需要寄快递,把要寄的商品(物理层)打包到包装盒里(数据链路层),然后把包装盒放到快递盒子里(网络层),在快递单上写上寄件地址和收件地址(Headers)。 快递员打电话给小帅拿快递(传输层), TCP三次握手连接: 1.快递员:“喂,这里有你的快递,麻烦到门口拿一下”。 2.小帅:“好的,我这就过来”。 3.快递员:“那我在门口等你”。 小帅拿到快递后,在网上点击确认收货按钮,确认收货(返回 http Status Code 200,应用层)。
    2021-01-03
    2
    26
  • 不同的层有不同的优劣,混合的意义就是使用后效果的最大化。低层在前,高层在后,是因为底层相对来说处理效率高,高层涉及到应用层协议,多增加的tcp处理。如果高层在前,很容易出现高层到达系统瓶颈,后面的服务还有余量
    2021-01-04
    7
  • neohope
    负载均衡和去医院看医生有些相似的: 1、刚到医院,要去分诊挂号,护士和挂号台的人不会问你一堆信息,只询问最基本信息并确定要看哪个科,就可以了。(四层负载,所需信息简单,工作效率高,重在吞吐量,不要有阻塞) 2、到了科室,尤其是看很繁忙的科室,会有护士和年轻医生,各种询问患者的情况,甚至把一些基础检查都做了,才会让专家去进一步提供服务;(七层负载,所需信息复杂一些,效率低一些,但好在量小了,也就避免了阻塞) 3、然后是资深医生看诊(实际网络服务) 但如果反过来,分诊挂号的时候,就咨询一大堆的问题,并作一些检查,每个患者耗时都长,会造成拥堵,患者排队n小时,而且到了科室就没有二次分诊的必要了。所以,七层代理放到前面,吞吐量就差了,四层代理也就没有存在的必要了。
    2021-03-31
    6
收起评论
显示
设置
留言
30
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部