当一个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的问题。

解决方案主要有两种:

  1. 配置反向代理的转发规则,让同一个用户的请求一定落到同一台机器上(通过分析cookie),复杂的转发规则将会消耗更多的CPU,也增加了代理服务器的负担。

  2. 将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数据包中,转交给实现服务器,然后实际服务器可以处理数据包直接响应客户端

负载均衡的多种解决方案相关推荐

  1. nginx 负载均衡集群解决方案 healthcheck_nginx_upstreams (一)

    该文章来源于互联网,目前找不到原作者,放在这里的目的是记录healthcheck_nginx_upstreams 的安装过程和相关配置,在起初安装成功后不能够正常运行healthcheck_nginx ...

  2. Open***异地机房互连以及负载均衡高可用解决方案

    架构方案如下: ---Open××× server 搭建部署 1.在Open×××-1 server上安装流程 (1.添加epel源 [root@ShangHai-×××-1 ~]# yum inst ...

  3. 一步步实现SDDC-Edge负载均衡

    1>In-Line Edge负载均衡器的配置 [难度★复杂度★★] 2>One-Arm Edge负载均衡器的配置 [难度★复杂度★★★] 正文: 在上一篇的介绍中,迷你SDDC环境的逻辑网 ...

  4. MSTP 解决链路负载均衡与链路检测

    MSTP 解决链路负载均衡与链路检测 拓扑 图1 如图 1 所示拓扑,huiju交换机与jieru交换机之间有两条链路,huiju G0/0/1 千兆光口,,G0/0/2 千兆电口:jieru G0/ ...

  5. 快速理解高性能HTTP服务端的负载均衡技术原理

    1.前言 在一个典型的高并发.大用户量的Web互联网系统的架构设计中,对HTTP集群的负载均衡设计是作为高性能系统优化环节中必不可少的方案.HTTP负载均衡的本质上是将Web用户流量进行均衡减压,因此 ...

  6. 悬赏200积分征集cisco7505多线路负载均衡方案

    cisco7505多线路负载均衡有哪些解决方案?具体解决方案怎样实现.要求多条线路,负载均衡,也就是在正常情况下,多条线路根据相应策略同时使用,当一旦一条线路故障时,根据相应规则和策略可以自动跳转到其 ...

  7. 重磅!GitHub发布开源负载均衡组件GLB

    https://baijiahao.baidu.com/s?id=1608946032781953161&wfr=spider&for=pc 导读:GitHub GLB directo ...

  8. LVS负载均衡(3)——LVS工作模式与工作原理

    LVS介绍及工作原理 1. LVS 介绍 LVS,Linux Virtual Server 的简写,意即 Linux 虚拟服务器,是一个虚拟的服务器集群系统,可以在 UNIX/Linux 平台下实现负 ...

  9. Nginx+DNS负载均衡实现

    2019独角兽企业重金招聘Python工程师标准>>> 负载均衡有多种实现方法,nginx.apache.LVS.F5硬件.DNS等. DNS的负载均衡就是一个域名指向多个ip地址, ...

最新文章

  1. 【Linux】Linux简单操作之文件管理
  2. eclipse hibernate配置文件(*.hbm.xml)加上自动提示功能
  3. 高等数学:第六章 定积分的应用(2)平面曲线的弧长 做功 水压力 引力
  4. Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();
  5. restify mysql_[菜鸟试水]关于Nodejs搭建后台API服务(Mysql-Restify)[下]
  6. 操作系统之文件管理:5、文件物理结构(连续分配、链式(显式、隐式)分配、索引分配(链接、多层索引、混合索引))
  7. java自定义日志_Java 自定义日志写入
  8. openstack 功能_2016年OpenStack的新功能:看一下Newton版本
  9. GitHub 给已存在的仓库增加开原协议LICENSE
  10. 机器学习之数据预备、清洗与特征工程
  11. CSS div斜线倾斜45度
  12. 服务器显示配额不足什么原因,win7系统显示配额不足导致无法访问的解决方法...
  13. php段错误coredumped,CentOS yum 段错误 (core dumped)解决方法
  14. 滴水逆向 switch
  15. 想学脑电,没有数据为什么不看这里?
  16. dapr源码分析--injector
  17. 什么是oop,你对他是怎么理解的
  18. CSS做个五颜六色的风车
  19. iOS工作之余 学习提升资料(转载)
  20. android.nfc.tech圈存,荣耀7使用nfc功能教程及注意事项,亲测可以刷公交卡

热门文章

  1. day08_面向对象继承多态Object
  2. 美团外卖退款显示服务器异常,中午美团外卖出现大面积故障 付款后显示未支付现已修复退款中...
  3. Hifiasm-meta | 你没看错!基于宏基因组的完成图!!
  4. BaiduPCS-Go 下载百度云资源的相关问题
  5. 《Soft Filter Pruning for Accelerating Deep Convolutional Neural Networks》论文笔记
  6. WordPress网站如何升级PHP
  7. python mechanize使用
  8. 写一篇哈利波特的同人文
  9. Unity-Manager Of Managers Frame
  10. 人脸识别系统全过程讲解,告诉你是如何找到人的?