负载均衡的常见实现方式
HTTP重定向
HTTP重定向服务器就是一个普通的服务器,当用户访问时,其会根据一定的算法得到服务器集群的一个真实服务器的IP地址,将其放在HTTP响应头中,响应状态码为(302),当用户浏览器接收到这个响应时,会将得到的真实服务器的IP地址提出并重新访问。如上图所示,当用户访问域名时通过DNS解析得到114.100.20.200,然后访问114.100.20.200,也就是HTTP重定向服务器,响应重定向至114.100.20.203,用户浏览器再重新访问。
缺点:
- 这种方式需要用户浏览器访问两次,性能较差
- HTTP重定向服务器的处理能力会成为负载均衡的瓶颈
- HTTP重定向返回302,可能会使搜索引擎判定为SEO作弊,降低搜索排名
DNS域名解析
DNS:通过域名获取ip地址的手段
当我们通过域名访问网站时,需要通过DNS服务器得到服务器的IP地址,我们可以在DNS服务器上设置一定的算法,每次得到不同的IP地址来进行访问从而实现负载均衡
如图,当用户访问www.apusapp.com时,这个域名对应了多个IP地址,通过DNS服务器解析会得到一个IP地址(可以看到,得到的这个IP地址,是服务器集群中一个服务器的IP地址),用户访问这个IP地址来达到真实的服务。
优点:
- 将负载均衡的工作丢给了DNS服务器去做,省去了网站管理人员的维护工作
- 对于真实地址的服务器,不需要做任何的配置
- 简单易用,成本低,而且方便灵活
- 服务器可以放在任何的地方
- 同时,DNS服务还可以做基于地理位置的解析,可以让一个距离最近的服务器的IP地址放回,提高性能
缺点:
- 1.DNS服务是有多级的(之后有时间写一个详细的DNS服务介绍)
大致上来说,首先是在浏览器中有一个DNS缓存,如果找不到就在本机地址的hosts文件中查找,再找不到就去路由器缓存中查找。然后是本地DNS服务器,如果没有,就是根服务器,顶级服务器,权限域名服务器等等。
总之,在每一级都有可能缓存这DNS的对应关系,所以有可能当某一台真实服务器下线之后,修改了DNS服务器的记录,但在生效之前还有一段时间,在这段期间,其IP地址已经不可用了,通过域名进行访问时还是会访问到这个IP地址,会访问失败。
2.DNS服务器和真实服务器是完全分开的,所以DNS的负载均衡不能监测到真是服务器当前的运行状态,其负载均衡的效果不是很好。
3.可能会造成额外的网络问题。为了使本DNS服务器和其他DNS服务器及时交互,保证DNS数据及时更新,使地址能随机分配,一般都要将DNS的刷新时间设置的较小,但太小将会使DNS流量大增造成额外的网络问题
事实上,大型网站都将DNS负载均衡作为第一级的负载均衡手段,在服务器内部再进行第二级的负载均衡,也就是说,我们通过DNS得到的IP地址并不是真实服务器的IP地址,而是内部负载均衡服务器的IP地址。
反向代理
代理与反向代理:VPN服务就是我们常用的一种代理(正向代理),用户将请教交给代理服务器,代理服务器访问网站获取数据,之后代理服务器再将数据返还给用户。在这个过程中,应用服务器并不知道用户的存在。只知道代理浏览器的访问。
反向代理是指在服务器端的代理,代理服务器接收用户的请求,再转发给真实服务器,之后再返回给代理服务器再给用户,在这个过程中,用户并不知道真实服务器的存在。
反向代理服务器管理了一组服务器,当用户访问时,代理服务器根据负载均衡算法将请求转发到真实服务器,真实服务器也通过反向代理服务器返还数据。内部服务器不对外部提供服务,所以不需要外部IP,而反向代理服务器需要两个网卡,一个IP用于外部用户访问使用,另外一个用于内部使用。
如上图所示,当用户发起访问,请求访问的ip地址是114.100.20.200,到达反向代理服务器时,根据负载均衡算法得到一个真实服务器的IP地址,并将用户请求转发到该服务器上,当真实服务器处理完之后将数据返回到反向代理服务器。反相代理服务器再将该响应的内容返回给用户。
优点:
- 反向代理服务器位于应用层,负载均衡方案和反向代理服务器集成在了一起,部署简单
缺点:
- 反向代理服务器用户处理所有的请求和响应,其性能可能成为服务器集群的瓶颈
有名Nginx就是反向代理服务
IP层的负载均衡
先来看看IP数据包
其中,可能看到有源地址和目的地址两项,这两项就是用来做IP层的负载均衡的关键。我们就是通过修改这两个地址来达到“转发”目的
如上图所示,当用户发起请求时(源地址为200.110.50.1),访问负载均衡服务器(目的地址为114.100.20.200),负载均衡服务器在内核进程获取网路数据包,根据一定的算法得到一个真实服务器的IP地址,其后将IP数据包的目的地址修改为该IP地址(192.168.1.1),之后就会将数据包发送到该真实服务器上去,之后再向负载均衡服务器返回数据,负载均 衡服务器将源地址修改为114.100.20.200后返回给用户浏览器。
这个方法的关键就是因为只能在负载均衡服务器出修改源地址和目的地址,所以在真实服务器处理完之后要想办法将数据返回给负载均衡服务器而不是用户浏览器。
比如,当用户发出请求时,目的地址是114.100.20.200,源地址是200.110.50.1,到达负载均衡服务器后,将目的地址该位192.168.1.1,源地址还是200.110.50.1,所以当真实服务器处理完之后的数据无法回到负载均衡服务器
解决方法:
- 提供两个网卡,负载均衡服务器就有内部IP和外部IP两个IP,当请求到达负载均衡服务器时,修改目的地址,也修改源地址,将源地址修改为负载均衡服务器的内部IP,这样的话,真实服务器处理后的响应就会再次回到负载均衡服务器
- 将负载均衡服务器作为真实服务器集群的网关服务器,这样的话所有的请求响应都要经过网关服务器
优点:
- IP负载均衡在内核进程完成数据分发,处理性能得到了很好的提高。
缺点:
- 由于所有请求和响应都要经过负载均衡服务器,集群的最大响应数据吞吐量将受到负载均衡服务器网卡带宽的限制,对于提供下载服务或者视频服务等需要大量传输数据的站点而言,这是难以满足需求的
链路层的负载均衡
MAC地址:mac地址是与网卡相关,其编号只与网卡生产厂商和流水号有关,基本上可以作为每台电脑的“身份证”。以太网中数据帧之间是通过MAC寻址来到达对应的计算机网卡或者路由的
链路层的负载均衡通过修改帧数据包中的MAC地址来达到转发的目的。这种方法,所有的真实服务器和负载均衡服务器都有相同的IP地址,不用修改IP数据包的目的地址和源地址,只通过修改MAC地址就可以达到效果,因为请求的IP地址和实际处理的真实服务器的IP地址一致,所以不需要回到负载均衡服务器进行地址交换,可以将响应直接发会给用户浏览器,避免了负载均衡服务器成为传输瓶颈的可能
Linux中的LVS(Linux Virtual Server)就是链路层负载均衡的开源产品
负载均衡的常见实现方式相关推荐
- 亿级Web系统负载均衡几种实现方式
aspirant 架构师技术联盟 负载均衡(Load Balance)是集群技术(Cluster)的一种应用技术.负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力.目前最常见的负载均衡应 ...
- 负载均衡有哪些实现方式?
负载均衡有哪些实现方式? 面试回答: 一般而言,负载均衡可以通过DNS.Http重定向.反向代理.IP等方式实现. 其中DNS是最简单的负载均衡方式,一般用于地域级别的负载均衡,它虽然简单,但扩展性太 ...
- 负载均衡的几种方式_负载均衡的几种方式
负载均衡其实就是任务的分发,使得任务能按照你的预想分配到各个计算单元上,它能提高服务对外的性能,避免单点失效场景.这里要注意的一点是虽说叫负载均衡,但是有时候我们的分配算法就是不是均衡的. 比如配个n ...
- SpringCloud集群的搭建,分布式的实现,负载均衡的几种方式,路由,页面监听
SpringCloud 服务注册与发现--Netflix Eureka 负载均衡: 客户端负载均衡--Netflix Ribbon 服务端负载均衡:--Feign(其也是依赖于Ribbon,只是将调用 ...
- nginx实现负载均衡的6种方式
nginx实现负载均衡的6种方式 一.负载均衡 1.轮询 2.权重 3.ip_hash 4.最少连接least_conn nginx.conf配置文件内容详解 后续更新 一.负载均衡 nginx负载均 ...
- IIS Web负载均衡的几种方式
Web负载均衡的几种实现方式 摘要: 负载均衡(Load Balance)是集群技术(Cluster)的一种应用.负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力.目前最常见的负载均衡应 ...
- Nginx负载均衡的4种方式 :轮询-Round Robin 、Ip地址-ip_hash、最少连接-least_conn、加权-weight=n
负载均衡的概念: Load Balance负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法. 我们知道单台服务器的性能是有上限的,当流量很大时,就需要使用多台服务器来共同提供服务 ...
- 细谈负载均衡,什么是负载均衡以及负载均衡的常见方法
一.负载均衡概述 负载均衡是由多台服务器以对称的方式是组成的服务器集群,每台服务器具有等价的地位,都可以单独对位提供服务而无需借助其他服务器的辅助.通过某种负载分担技术,将请求均匀的分配到对称结构的某 ...
- nginx负载均衡的五种方式
文章目录 前言 :负载均衡是什么 一.方式1:轮询 二.方式2:权重 方式3:iphash 方式4:最小连接 方式5:fair 总结:根据这几种方式可以猜测处nginx的底层使用了计数器,从而可以将海 ...
最新文章
- 创业必经之路——Paul Graham创业曲线
- java 获取插入数据的自增长id
- 数据有序_CATTI汉译英批改 | 人工智能、大数据有序推进
- 步步为营 .NET 代码重构学习笔记 七
- mybatis mysql 存储过程传入对象_mybatis 调用mysql存储过程 带输出输入参数
- 可达龙博客的第一篇文
- UVALive5461 UVA615 POJ1308 Is It A Tree?(解法二)【废除!!!】
- 【虚拟机】VMware启动时报错:该虚拟机似乎正在使用中....请按“获取所有权(T)”按钮获取它的所有权
- 安装系统出现Winload.exe错误0xc000000e解决方法
- 宝塔面板6.9.0一键破解脚本
- Windows/Mac上免费好用的压缩软件推荐(持续更新)
- 懒人精灵新版图色工具介绍
- 8位可控加减法电路设计
- wps怎么把边框加粗_怎么设置WPS表格边框线加粗 - 卡饭网
- Java字符串相关的类详解
- 组建Ad Hoc模式无线局域网
- office365安装后仍显示之前版本
- mysql实现停车场管理系统完整代码实现_JAVA实现简单停车场系统代码
- 针对正方教务开发大学App(查成绩,课表,一键评教,图书馆,正方系统)
- 关于数据库报错ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061