负载均衡(Load Balancing)学习笔记(二)
概述
文章负载均衡(Load Balancing)学习笔记(一) 讲述了负载均衡的一般性原理,本文继续介绍常见的实现负载均衡的方法。
HTTP重定向
HTTP重定向服务器是一台普通的Web服务器,用户的请求先到达重定向服务器,这台服务器会挑选一台后端服务器的地址(例如使用轮询的方式),并将该地址写入HTTP重定向响应结果中(以响应状态码302返回)返回给用户。用户将根据这个新的地址重新发送请求到选中的服务器上。选中的服务器会处理用户请求,并将结果返回给用户。
HTTP重定向的处理流程如图1所示。
图1:HTTP重定向实现负载均衡
通过重定向服务器的处理,用户请求被分配到不同的后端服务器上进行处理,实现了负载均衡的目的。
优点
HTTP重定向负载均衡的方法实现上比较简单。
缺点
- 增加了用户的时延,因为访问请求需要进行两次往返
- 重定向服务器没有将后端服务器的负载差异考虑进去,有些后端服务器可能在相当繁忙时仍然接收到较多的请求
- 重定向服务器的并发处理能力制约着整个系统的并发处理能力
- 如果重定向服务器出现故障,站点就会瘫痪
由于存在这些缺点,HTTP重定向通常都会与其他一种或多种负载均衡技术结合使用。
DNS负载均衡
DNS负载均衡的实现原理是在DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时,DNS服务器对于每个查询将以DNS记录的IP地址按顺序返回不同的解析结果,将客户端的访问引导到不同的机器上去,使得不同客户端访问不同的服务器,从而达到负载均衡的目的。

图2:DNS实现负载均衡
优点
- 由于DNS系统本身是一个分布式系统,相对来说它不存在性能和吞吐能力的限制,故使用DNS来做负载均衡并不需要担心负载均衡服务器的处理能力
- 可以根据用户IP进行智能解析,DNS服务器可以在所有可用的A记录中寻找离用户最近的一台服务器为用户提供服务
##缺点
- DNS服务器并不知道后端服务器的情况,如果后端服务器宕机,而用户的请求继续被分配到这个后端服务器,会导致无法响应用户的请求
- DNS服务器依然没有将后端服务器的负载差异考虑进去
- DNS服务器存在缓存,当需要更新请求的分配时,新增一个IP或者删除一个IP并不能立即生效
反向代理
反向代理服务器的工作主要是转发HTTP请求,因此它工作在HTTP层,也就是OSI七层结构中的应用层(第七层),所以基于反向代理的负载均衡也称为七层负载均衡。利用反向代理服务器进行负载均衡,如图3所示。

图3:反向代理实现负载均衡
反向代理服务处于后端服务器的前面,由于需要直接受用户的请求,故反向代理服务器需要一个外网IP。而后端服务器并不直接对外提供访问,因此后端服务器并不需要外网IP。反向代理服务器通过内网IP与后端服务器进行通信。图3中,浏览器的请求到达反向代理服务器114.113.200.84,反向代理服务器收到请求后,根据负载均衡算法计算得到一台真实的后端服务器地址10.0.0.1,并将请求转发到这台后端服务器。10.0.0.1处理请求后将响应返回给反向代理服务器,再由反向代理服务器将该响应返回给用户。
常见的反向代理服务器包括Nginx,Apache,Haproxy等。
优点
- 部署比较简单,使用常见的反向代理服务器软件即可部署反向代理服务器
- 调度策略丰富,例如,可以为不同的后端机器设置不同的分配权重, 这样处理能力高的机器可以分配到较多的任务,达到能者多劳的目的
- 反向代理服务器可以让用户在一次会话周期内的所有请求始终分配到一台特定的后端服务器(粘滞会话)
缺点
由于反向代理工作在HTTP层,所有请求都需要经过反向代理服务器的处理,后端服务器的响应结果也必须经过反向代理服务器传送给用户,故这种负载均衡方式要求反向代理的并发处理能力较高。
IP负载均衡
我们已了解前面几种负载均衡的方法,这些负载均衡都是工作在HTTP层,那么,能否在HTTP层以下来实现负载均衡呢?答案是肯定的。事实上,在数据链路层(第二层),网络层(第三层),以及传输层(第四层)都可以实现不同机制的负载均衡。但与HTTP层机制不同,这些负载均衡调度的工作必须由Linux内核来完成,即网络数据包在从内核缓冲区进入用户进程空间前,已完成转发的工作。
在网络层通过修改请求目的地址进行负载均衡的流程如图4所示。

图4:IP负载均衡
用户请求到达负载均衡服务器114.113.200.84,负载均衡服务器在操作系统内核获取网络数据包,根据负载均衡算法计算得到一台真实的后端服务器10.0.0.1,然后将数据包的目地址改为10.0.0.1,不需要用户进程处理。后端服务器10.0.0.1处理完成后,响应数据包返回到负载均衡服务器,负载均衡服务器再将数据包源地址修改为自身的IP地址(114.113.200.84)发送给用户。
优点
IP负载均衡在内核进程完成数据分发,处理性能得到了很大的提高。
缺点
由于所有请求和响应都要经过负载均衡服务器,系统的最大吞吐量仍然受到负载均衡服务器网卡带宽的限制。对于提供下载服务或者视频服务等需要传输大量数据站点,IP负载均衡的方式是难以满足需求的。
数据链路层负载均衡
数据链路层负载均衡通过修改数据帧的MAC地址来实现负载均衡的目的。数据链路层是OSI网络模型的第二层,由于数据链路层负载均衡的方法走的是MAC层的协议,因此需要负载均衡服务器和后端服务器处在同一个二层(同一个广播域)之中。
数据链路层负载均衡的工作流程如图所示:

图5:数据链路层实现负载均衡
图5所示的数据传输方式又称作三角传输模式,负载均衡数据分发过程中不修改IP址,只修改MAC地址,通过配置后端服务器与负载均衡服务器具有相同的IP地址,从而达到不修改数据包的源IP地址和目的IP地址就可以进行数据分发的目的。由于后端服务器的IP和数据请求目的IP一致,不需要通过负载均衡服务器进行地址转换,可以将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。
图5中,用户请求到达负载均衡服务器114.113.200.84,负载均衡服务器将请求数据的目的MAC地址必为00.0c.29.d2,并不修改数据包目的IP地址,由于后端服务器与负载均衡服务器并有相同的IP地址,因此数据可以正常传输到达00.0c.29.d2对应的服务器,该服务器处理完成后将响应数据直接返回给用户,不需要经过负载均衡服务器。
在Linux平台上最好的数据链路层负载均衡的开源产品是LVS(Linux Virtual Server)。LVS有三种运行模式,分别为NAT模式,TUN模式,DR模式。DR模式正是运行在数据链路层,通过修改数据帧的MAC地址来实现负载均衡的。
优点
- 数据链路层负载均衡工作在Linux内核进程,性能很高
- 后端服务器的响应不需要再次经过负载均衡服务器,解决了负载均衡服务器网卡流量瓶颈的问题
缺点
可配置性较高,并不支持复杂的调度策略。
参考资料
- 大型网站技术架构——核心原理与安全分析,李智慧著,电子工业出版社
- 构建高性能Web站点,郭欣著,中国工信出版集团,电子工业出版社
- HTTP权威指南,David Gourley等著,人民邮电出版社
- https://segmentfault.com/a/1190000002578457
- http://baike.baidu.com/item/DNS负载均衡
- http://blog.csdn.net/asqi1/article/details/41478111
注:转载自https://leehao.me
负载均衡(Load Balancing)学习笔记(二)的更多相关文章
- 网络结构设计——负载均衡之LVS学习笔记(二)
LVS按个人理解的说就是将一台Linux服务器当作路由器等功能的技术.LVS---Linux虚拟服务器. LVS实现了三种IP负载均衡技术VS/NAT.VS/TUN.VS/DR. 今天简单分享一下我在 ...
- 网络结构设计——负载均衡之LVS学习笔记(四)
LVS按个人理解的说就是将一台Linux服务器当作路由器等功能的技术.LVS---Linux虚拟服务器. LVS实现了三种IP负载均衡技术VS/NAT.VS/TUN.VS/DR. 今天简单分享一下我在 ...
- 网络结构设计——负载均衡之LVS学习笔记(三)
LVS按个人理解的说就是将一台Linux服务器当作路由器等功能的技术.LVS---Linux虚拟服务器. LVS实现了三种IP负载均衡技术VS/NAT.VS/TUN.VS/DR. 今天简单分享一下我在 ...
- CDN之多边缘节点负载均衡--学习笔记
一.剧情 剧情是这样的,本次的多边缘节点负载均衡实验,1个LVS四层负载均衡集群和1个Nginx为反向代理的七层负载均衡集群,由Bind dns解析作为 主负载均衡服务器,调度两个集群,中间层有一台W ...
- 【高可用HA】Apache (4) —— Mac下配置Apache Httpd负载均衡(Load Balancer)之mod_jk
Mac下配置Apache Httpd负载均衡(Load Balancer)之mod_jk httpd版本: httpd-2.4.17 jk版本: tomcat-connectors-1.2.41 参考 ...
- 【高可用HA】Apache (3) —— Mac下配置Apache Httpd负载均衡(Load Balancer)之mod_proxy
Mac下配置Apache Httpd负载均衡(Load Balancer)之mod_proxy httpd版本: httpd-2.4.17 参考来源: Apache (1) -- Mac下安装Apac ...
- Oracle RAC 客户端连接负载均衡(Load Balance)
实现负载均衡(Load Balance)是Oracle RAC最重要的特性之一,主要是把负载平均分配到集群中的各个节点,以提高系统的整体吞吐能力.通常情况下有两种方式来实现负载均衡,一个是基于客户端连 ...
- Oracle RAC 服务器端连接负载均衡(Load Balance)
Oracle RAC服务器端的负载均衡是根据RAC中各节点的连接负荷数情况,将新的连接请求分配到负荷最小的节点上去.当数据库处于运行时,RAC中各节点的PMON进程每3秒会将各自节点的连接负荷数更新到 ...
- 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记
注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...
- InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移
系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...
随机推荐
- Android面试题(2)
1. int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置类型).Int是java的原始数据类型,Integer是java为int提供的封装类.Java为 ...
- JavaScript -- Window-Confirm
-----032-Window-Confirm.html----- <!DOCTYPE html> <html> <head> <meta http-equi ...
- Vue源码翻译之渲染逻辑链
本篇文章主要要记录说明的是,Vue在Vdom的创建上的相关细节.这也是描绘了Vue在界面的创建上的一个逻辑顺序,同时我也非常拜服作者编码的逻辑性,当然或许这么庞大复杂的编码不是一次性铸就的,我想应该也 ...
- S3C6410启动过程分析
S3C6410支持多种存储设备,包括片上的Internal ROM.Internal SRAM和片外的Flash/ROM.DRAM.多种启动设备形成多种启动模式,分析如下. 本文为作者原创,转载请注明 ...
- BFS算法(——模板习题与总结)
首先需要说明的是BFS算法(广度优先算法)本质上也是枚举思想的一种体现,本身效率不是很高,当数据规模很小的时候还是可以一试的.其次很多人可能有这样的疑问,使用搜索算法的时候,到底选用DFS还是BFS, ...
- Python面向对象基础一
公司可能过一两个月就要从深圳搬到东莞松山湖,项目组的现在有的在转Java或其他语言的,问我们要不要转java+hoodap+spark方向,我还是先不转,毕竟之前是从ios转回C#,这现在在转其他的那 ...
- UIKit 框架之UIView一
- (id)initWithFrame:(CGRect)aRect //通过一个矩形对象初始化 Configuring a View’s Visual Appearance //配置视觉展示 @pro ...
- 分布式理论(二)——Base 理论
前言 在前文 分布式理论(一) -- CAP 定理 中,我们说,CAP 不可能同时满足,而分区容错是对于分布式系统而言,是必须的.最后,我们说,如果系统能够同时实现 CAP 是再好不过的了,所以出现了 ...
- [转]SQL Server 2008 如何配置报表管理器
本文转自:https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/cc281384%28v%3dsql.100%2 ...
- ASP.NET MVC加载ASCX之后,并为之赋值
Insus.NET有写过一篇<ASP.NET MVC显示UserControl控件(扩展篇)>http://www.cnblogs.com/insus/p/3642634.html ,还没 ...