负载均衡的多种解决方案
当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题。为了解决这些性能压力带来问题,我们需要在Web系统架构层面搭建多个层次的缓存机制。在不同的压力阶段,我们会遇到不同的问题,通过搭建不同的服务和架构来解决。
Web负载均衡
Web负载均衡(Load Balancing),简单地说就是给我们的服务器集群分配“工作任务”,而采用恰当的分配方式,对于保护处于后端的Web服务器来说,非常重要。
负载均衡的策略有很多,我们从简单的讲起哈。
1. HTTP重定向
当用户发来请求的时候,Web服务器通过修改HTTP响应头中的Location标记来返回一个新的url,然后浏览器再继续请求这个新url,实际上就是页面重定向。通过重定向,来达到“负载均衡”的目标。例如,我们在下载PHP源码包的时候,点击下载链接时,为了解决不同国家和地域下载速度的问题,它会返回一个离我们近的下载地址。重定向的HTTP返回码是302,如下图:
如果使用PHP代码来实现这个功能,方式如下:
这个重定向非常容易实现,并且可以自定义各种策略。但是,它在大规模访问量下,性能不佳。而且,给用户的体验也不好,实际请求发生重定向,增加了网络延时。
2. 反向代理负载均衡
反向代理服务的核心工作主要是转发HTTP请求,扮演了浏览器端和后台Web服务器中转的角色。因为它工作在HTTP层(应用层),也就是网络七层结构中的第七层,因此也被称为“七层负载均衡”。可以做反向代理的软件很多,比较常见的一种是Nginx。
Nginx是一种非常灵活的反向代理软件,可以自由定制化转发策略,分配服务器流量的权重等。反向代理中,常见的一个问题,就是Web服务器存储的session数据,因为一般负载均衡的策略都是随机分配请求的。同一个登录用户的请求,无法保证一定分配到相同的Web机器上,会导致无法找到session的问题。
解决方案主要有两种:
配置反向代理的转发规则,让同一个用户的请求一定落到同一台机器上(通过分析cookie),复杂的转发规则将会消耗更多的CPU,也增加了代理服务器的负担。
将session这类的信息,专门用某个独立服务来存储,例如Redis/memchache,这个方案是比较推荐的。
反向代理服务,也是可以开启缓存的,如果开启了,会增加反向代理的负担,需要谨慎使用。这种负载均衡策略实现和部署非常简单,而且性能表现也比较好。但是,它有“单点故障”的问题,如果挂了,会带来很多的麻烦。而且,到了后期Web服务器继续增加,它本身可能成为系统的瓶颈。
3. IP负载均衡
IP负载均衡服务是工作在网络层(修改IP)和传输层(修改端口,第四层),比起工作在应用层(第七层)性能要高出非常多。原理是,他是对IP层的数据包的IP地址和端口信息进行修改,达到负载均衡的目的。这种方式,也被称为“四层负载均衡”。常见的负载均衡方式,是LVS(Linux Virtual Server,Linux虚拟服务),通过IPVS(IP Virtual Server,IP虚拟服务)来实现。
在负载均衡服务器收到客户端的IP包的时候,会修改IP包的目标IP地址或端口,然后原封不动地投递到内部网络中,数据包会流入到实际Web服务器。实际服务器处理完成后,又会将数据包投递回给负载均衡服务器,它再修改目标IP地址为用户IP地址,最终回到客户端。
上述的方式叫LVS-NAT,除此之外,还有LVS-RD(直接路由),LVS-TUN(IP隧道),三者之间都属于LVS的方式,但是有一定的区别,篇幅问题,不赘叙。
IP负载均衡的性能要高出Nginx的反向代理很多,它只处理到传输层为止的数据包,并不做进一步的组包,然后直接转发给实际服务器。不过,它的配置和搭建比较复杂。
4. DNS负载均衡
DNS(Domain Name System)负责域名解析的服务,域名url实际上是服务器的别名,实际映射是一个IP地址,解析过程,就是DNS完成域名到IP的映射。而一个域名是可以配置成对应多个IP的。因此,DNS也就可以作为负载均衡服务。
这种负载均衡策略,配置简单,性能极佳。但是,不能自由定义规则,而且,变更被映射的IP或者机器故障时很麻烦,还存在DNS生效延迟的问题。
5. DNS/GSLB负载均衡
我们常用的CDN(Content Delivery Network,内容分发网络)实现方式,其实就是在同一个域名映射为多IP的基础上更进一步,通过GSLB(Global Server Load Balance,全局负载均衡)按照指定规则映射域名的IP。一般情况下都是按照地理位置,将离用户近的IP返回给用户,减少网络传输中的路由节点之间的跳跃消耗。
图中的“向上寻找”,实际过程是LDNS(Local DNS)先向根域名服务(Root Name Server)获取到顶级根的Name Server(例如.com的),然后得到指定域名的授权DNS,然后再获得实际服务器IP。
CDN在Web系统中,一般情况下是用来解决大小较大的静态资源(html/Js/Css/图片等)的加载问题,让这些比较依赖网络下载的内容,尽可能离用户更近,提升用户体验。
例如,我访问了一张imgcache.gtimg.cn上的图片(腾讯的自建CDN,不使用qq.com域名的原因是防止http请求的时候,带上了多余的cookie信息),我获得的IP是183.60.217.90。
这种方式,和前面的DNS负载均衡一样,不仅性能极佳,而且支持配置多种策略。但是,搭建和维护成本非常高。互联网一线公司,会自建CDN服务,中小型公司一般使用第三方提供的CDN。
6. 数据链路层负载均衡
不同于IP负载均衡,直接路由负载均衡高度器工作在数据链路层。通过在集群内各服务器配置和负载均衡服务器ip一致的虚拟ip,再通过修改数据包的目标MAC地址到实际服务器,将数据包转发到实际服务器,不同的是,这些处理的结果根据数据包的来源直接发送给用户,不再经过调度器。这时我们的实际服务器必须直接连接到外网,并且不在以调度服务器为默认网关。
7. IP隧道
简单的说,就是调度器将收到的数据包封装到一个新的IP数据包中,转交给实现服务器,然后实际服务器可以处理数据包直接响应客户端
负载均衡的多种解决方案相关推荐
- nginx 负载均衡集群解决方案 healthcheck_nginx_upstreams (一)
该文章来源于互联网,目前找不到原作者,放在这里的目的是记录healthcheck_nginx_upstreams 的安装过程和相关配置,在起初安装成功后不能够正常运行healthcheck_nginx ...
- Open***异地机房互连以及负载均衡高可用解决方案
架构方案如下: ---Open××× server 搭建部署 1.在Open×××-1 server上安装流程 (1.添加epel源 [root@ShangHai-×××-1 ~]# yum inst ...
- 一步步实现SDDC-Edge负载均衡
1>In-Line Edge负载均衡器的配置 [难度★复杂度★★] 2>One-Arm Edge负载均衡器的配置 [难度★复杂度★★★] 正文: 在上一篇的介绍中,迷你SDDC环境的逻辑网 ...
- MSTP 解决链路负载均衡与链路检测
MSTP 解决链路负载均衡与链路检测 拓扑 图1 如图 1 所示拓扑,huiju交换机与jieru交换机之间有两条链路,huiju G0/0/1 千兆光口,,G0/0/2 千兆电口:jieru G0/ ...
- 快速理解高性能HTTP服务端的负载均衡技术原理
1.前言 在一个典型的高并发.大用户量的Web互联网系统的架构设计中,对HTTP集群的负载均衡设计是作为高性能系统优化环节中必不可少的方案.HTTP负载均衡的本质上是将Web用户流量进行均衡减压,因此 ...
- 悬赏200积分征集cisco7505多线路负载均衡方案
cisco7505多线路负载均衡有哪些解决方案?具体解决方案怎样实现.要求多条线路,负载均衡,也就是在正常情况下,多条线路根据相应策略同时使用,当一旦一条线路故障时,根据相应规则和策略可以自动跳转到其 ...
- 重磅!GitHub发布开源负载均衡组件GLB
https://baijiahao.baidu.com/s?id=1608946032781953161&wfr=spider&for=pc 导读:GitHub GLB directo ...
- LVS负载均衡(3)——LVS工作模式与工作原理
LVS介绍及工作原理 1. LVS 介绍 LVS,Linux Virtual Server 的简写,意即 Linux 虚拟服务器,是一个虚拟的服务器集群系统,可以在 UNIX/Linux 平台下实现负 ...
- Nginx+DNS负载均衡实现
2019独角兽企业重金招聘Python工程师标准>>> 负载均衡有多种实现方法,nginx.apache.LVS.F5硬件.DNS等. DNS的负载均衡就是一个域名指向多个ip地址, ...
最新文章
- 【Linux】Linux简单操作之文件管理
- eclipse hibernate配置文件(*.hbm.xml)加上自动提示功能
- 高等数学:第六章 定积分的应用(2)平面曲线的弧长 做功 水压力 引力
- Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();
- restify mysql_[菜鸟试水]关于Nodejs搭建后台API服务(Mysql-Restify)[下]
- 操作系统之文件管理:5、文件物理结构(连续分配、链式(显式、隐式)分配、索引分配(链接、多层索引、混合索引))
- java自定义日志_Java 自定义日志写入
- openstack 功能_2016年OpenStack的新功能:看一下Newton版本
- GitHub 给已存在的仓库增加开原协议LICENSE
- 机器学习之数据预备、清洗与特征工程
- CSS div斜线倾斜45度
- 服务器显示配额不足什么原因,win7系统显示配额不足导致无法访问的解决方法...
- php段错误coredumped,CentOS yum 段错误 (core dumped)解决方法
- 滴水逆向 switch
- 想学脑电,没有数据为什么不看这里?
- dapr源码分析--injector
- 什么是oop,你对他是怎么理解的
- CSS做个五颜六色的风车
- iOS工作之余 学习提升资料(转载)
- android.nfc.tech圈存,荣耀7使用nfc功能教程及注意事项,亲测可以刷公交卡
热门文章
- day08_面向对象继承多态Object
- 美团外卖退款显示服务器异常,中午美团外卖出现大面积故障 付款后显示未支付现已修复退款中...
- Hifiasm-meta | 你没看错!基于宏基因组的完成图!!
- BaiduPCS-Go 下载百度云资源的相关问题
- 《Soft Filter Pruning for Accelerating Deep Convolutional Neural Networks》论文笔记
- WordPress网站如何升级PHP
- python mechanize使用
- 写一篇哈利波特的同人文
- Unity-Manager Of Managers Frame
- 人脸识别系统全过程讲解,告诉你是如何找到人的?