L7负载平衡

  

还有一种较为经常使用的负载平衡解决方式则是L7负载平衡。顾名思义,其主要通过OSI模型中的第七层应用层中的数据决定怎样分发负载。

  

在执行时。L7负载平衡server上的操作系统会将接收到的各个数据包组织成为用户请求,并依据在该请求中所包括的的数据来决定由哪个服务实例来对该请求进行处理。其执行流程图大致例如以下所看到的:



相较于L3/4负载平衡服务所使用的数据,L7负载平衡服务所使用的应用层数据更贴近服务本身,因此其具有更精确的负载平衡行为。

  

在前面对L3/4负载平衡的解说中我们已经介绍过,对于某些具有关联关系的各个请求。L3/4负载平衡server会依据某些算法(如计算IP的哈希值)来决定处理该请求的服务实例。可是这样的方法并非非常稳定。

当一个服务实例失效或用户的IP发生变化的时候,用户与服务实例之间的相应关系就将发生改变。此时用户原有的会话数据在新的服务实例上并不存在。进而导致一系列问题。

  

事实上产生这个问题的最根本原因就是用户与服务实例之间的关联关系是通过某些外部环境创建的,而并非由用户/服务实例本身来管理。因此它不能抵御外部环境变化的冲击。假设要在用户和服务实例之间建立稳定的关联关系。那么就须要一种稳定的在用户和服务实例之间传递的数据。在Web服务中。这样的数据就是Cookie。

  

简单地说。基于Cookie的负载平衡服务实际上就是分析用户请求中的某个特定Cookie并依据其值决定须要分发到的目标地址。

其主要分为两种方式:Cookie Learning以及Cookie Insertion。

  

Cookie Learning是不具有侵入性的一种解决方式。其通过分析用户与服务实例通讯过程中所传递的Cookie来决定怎样分派负载:在用户与服务第一次通讯时,负载平衡服务将找不到相应的Cookie。因此其将会把该请求依据负载平衡算法分配到某个服务实例上。

而在服务实例返回的时候,负载平衡server将会把相应的Cookie以及服务实例的地址记录在负载平衡server中。当用户再次与服务通讯时,负载平衡server就会依据Cookie中所记录的数据找到前一次服务该用户的服务实例,并将请求转发到该服务实例上。



这么做的最大缺点就是对高可用性的支持非常差。假设一旦负载平衡server失效,那么在该负载平衡server上所维护的Cookie和服务实例之间的匹配关系将全部丢失。这样当备份负载平衡server启动之后。全部的用户请求都将被定向到随机的服务实例。

  

而还有一个问题就是会话维护功能对内存的消耗。与L3/4server上的会话维护不同,一个Cookie的失效时间可能非常长,至少在一次用户使用中可能会持续几个小时。对于一个訪问量达到每秒上万次的系统而言,负载平衡server须要维护非常多的会话,甚至可能会将server的内存消耗殆尽。反过来,假设将负载平衡server中的Cookie过期时间设置得太短,那么当用户又一次訪问负载平衡server的时候,其将被导向到一个错误的服务实例。

  

除了Cookie Learning 之外,还有一种经常使用的方法就是Cookie Insertion。其通过向响应中加入Cookie以记录被分派到的服务实例,并在下一次处理请求时依据该Cookie所保存的值来决定分发到的服务实例。在用户与server进行第一次通讯的时候。负载平衡server将找不到分派记录所相应的Cookie,因此其会依据负载平衡算法为该请求分配一个服务实例。在接收到服务实例所返回的数据之后。负载平衡server将会向响应中插入一个Cookie。以记录该服务实例的ID。

当用户再次发送请求到负载平衡server时,其将依据该Cookie里所记录的服务实例的ID派发该请求。



相较于Cookie Learning,Cookie Insertion不须要在内存中维护Cookie与各个服务实例的相应关系,并且在当前负载平衡server失效的时候,备用负载平衡server也能够依据Cookie中所记录的信息正确地派发各个请求。

  

当然,Cookie Insertion也有缺陷。

最常见的问题就是浏览器以及用户自身对Cookie的限制。在Cookie Insertion中。我们须要插入一个额外的Cookie 来记录分配给当前用户的服务实例。可是在某些浏览器中,特别是移动浏览器中,经常会限制Cookie的个数。甚至只同意出现一个 Cookie。为了解决问题,负载平衡server也会使用一些其他方法。如Cookie Modification,即改动一个已有的Cookie使其包括服务实例的ID。

  

而在用户禁用了Cookie的时候,Cookie Insertion将是全然失效的。此时负载平衡服务所能利用的将不过JSESSIONID等信息。因此在一个L7负载平衡server中,Cookie Learning和Cookie Insertion经常同一时候使用:Cookie Learning会在用户启用Cookie的时候起主要作用。而在Cookie被用户禁用的情况下则使用Cookie Learning来依据JSESSIONID来保持用户与服务实例之间的关联关系。

  

也许您会想:L3/4负载平衡server在处理各个关联请求的时候是通过IP的哈希值来决定处理该请求的服务实例的。

既然这些基于Cookie的解决方式能达到100%的准确,为什么我们不在L3/4负载平衡server中使用它们呢?答案是:因为L3/4负载平衡server主要关注于数据包级别的转发。而Cookie信息则藏匿于数据包之中,因此L3/4负载平衡server非常难决定单一的数据包该怎样转发。

  

比如在执行Cookie Insertion操作的时候,原有数据包中的全部数据都将被后移。此时须要负载平衡server接收到全部数据包之后才干完毕:



试想一下接收全部数据包所可能发生的事情吧。在网络的一端发送多个数据包的时候,网络的还有一端所接收到的数据包的顺序可能与原有的发送顺序并不一致。

甚至在网络拥堵的时候,某些数据包可能会丢失,进而再次加长接收到全部数据包所须要的时间。

  

因此相较于将数据包直接转发的方法,等待全部的数据包到齐然后再插入Cookie的性能非常差。在后面对于解决方式的解说中您会看到,L3/4负载平衡server对于性能的要求一般来说是非常高的。而L7负载平衡server则能够通过一个集群来解决自身的性能问题。基于DNS的负载平衡,L3/4负载平衡server以及L7负载平衡server经常协同工作。以组成一个具有高可用性以及高可扩展性的系统。

$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('

    ').addClass('pre-numbering').hide();
    $(this).addClass('has-numbering').parent().append($numbering);
    for (i = 1; i ').text(i));
    };
    $numbering.fadeIn(1700);
    });
    });

负载均衡之基于L7负载的更多相关文章

  1. 负载均衡之基于DNS负载

    基于DNS的负载平衡 OK,在了解了负载平衡系统的大致组成及使用方式之后.我们就来看看各种负载解决方式. 当前业界中所最常使用的负载平衡解决方式主要分为三种:基于DNS的负载平衡,L3/4负载平衡,也 ...

  2. Linux内核——进程管理之SMP负载均衡(基于版本4.x)

    <奔跑吧linux内核>3.3笔记,不足之处还望大家批评指正 根据实际物理属性,CPU域分类如图1所示. 图1 CPU域分类 问题一:一个4核处理器中的每个物理CPU拥有独立L1 cach ...

  3. linux负载均衡(什么是负载均衡)

    linux负载均衡(什么是负载均衡) 一.总结 一句话总结: 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用 ...

  4. Nginx 负载均衡原理简介与负载均衡配置详解

    Nginx负载均衡原理简介与负载均衡配置详解   by:授客  QQ:1033553122   测试环境 nginx-1.10.0 负载均衡原理 客户端向反向代理发送请求,接着反向代理根据某种负载机制 ...

  5. nginx负载均衡之基于客户端cookie的会话保持

    通过ip_hash做会话保持有一定的缺陷,这个是通过客户端ip来实现.同一个网络下众多客户端访问服务器会被扔到同一台机器,再或者是CDN也 会导致负载不均衡.所以要实现通过客户端cookie实现,包括 ...

  6. Centos7.2下基于Nginx+Keepalived搭建高可用负载均衡(一.基于Keepalived搭建HA体系)

    说明 本文只为方便日后查阅,不对一些概念再做赘述,网上都有很多明确的解释,也请大家先了解相关概念. 两台搭建HA的服务器是华为云上的ECS(不要忘记开通VPC,保证我们的服务器都处在一个内网环境),由 ...

  7. 负载均衡配置(基于Nginx)

    以下是基于nginx进行负载均衡配置的流程: 服务器配置如下: 1.  安装nginx的服务器:192.168.1.1 2.  nginx配置负载均衡位置及端口:192.168.1.1 80端口 3. ...

  8. 一致性哈希做负载均衡,基于dubbo的简化版本,超级简单容易理解!!!

    一致性哈希算法原理以及做分布式存储.一定先看:一致性哈希算法 dubbo提供了四种负载均衡实现:权重随机算法,最少活跃调用数算法,一致性哈希算法,加权轮询算法. 本文基于开源项目:guide-rpc- ...

  9. Spring-cloud之Ribbon负载均衡的使用及负载均衡策略配置(与Eurka配合使用)

    什么是Ribbon,ribbon有什么用,个人先总结一下(不正确请提出讨论):Ribbon是基于客户端的负载均衡器,为我们提供了多样的负载均衡的方案,比如轮询,最小的并发请求的server,随机ser ...

随机推荐

  1. 静态代理设计模式(StaticProxy)

    静态代理设计模式: 要求:真实角色,代理角色:真实角色和代理角色要实现同一个接口,代理角色要持有真实角色的引用. 在Java中线程的设计就使用了静态代理设计模式,其中自定义线程类实现Runable接口 ...

  2. struts2框架的登录制作

    首先:我们要建一个web项目 接着: 我们先来导入struts的xml文件 第一步:右击你的项目名,鼠标到MyEclipse会看到一个add struts开头的文件,点开以后看到: 这里我们选择str ...

  3. PHPMailer < 5.2.18 远程代码执行漏洞(CVE-2016-10033)

    PHPMailer < 5.2.18 Remote Code Execution 本文将简单展示一下PHPMailer远程代码执行漏洞(CVE-2016-10033)的利用过程,使用的是别人已经 ...

  4. 2000W条数据,加入全文检索的总结

    一) 前期准备测试: 旧版的MySQL的全文索引只能用在MyISAM表格的char.varchar和text的字段上. 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息 ...

  5. RobotFramework自动化测试环境配置

    现在工作是做自动化测试平台维护的,平台用的C#做的,主要是用来测试CMBRun项目,它是c/s结构的项目,而b/s结构的项目主要使用RF+Python来做.做这块之前听过自动化测试,身边的朋友也有做这 ...

  6. 【开源】canvas图像裁剪、压缩、旋转

    前言 前段时间遇到了一个移动端对图像进行裁剪.压缩.旋转的需求. 考虑到已有各轮子的契合度都不高,于是自己重新造了一个轮子. 关于图像裁剪.压缩 在HTML5时代,canvas的功能已经非常强大了,可 ...

  7. MeasureString 通过文本宽度获取绘制高度

    using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using S ...

  8. jstree 获取选中节点的所有子子点

    //加载功能树 function initTree() { $.jstree.destroy(); $.ajax({ type: "Get", url: "/Depart ...

  9. js实际工作中的技能点

    1.基础知识 a.原型,原型链 b.作用域,闭包 c.异步,单线程 2.JS API a.DOM操作 b.Ajax c.事件绑定 3.开发环境 a.版本管理(git) b.模块化(require.js ...

  10. 是用Epplus生成Excel 图表

    1.  前言 这是我最近项目刚要的需求,然后在网上找了半天的教材  但是很不幸,有关于Epplus的介绍真的太少了,然后经过了我的不断研究然后不断的采坑,知道现在看到Excel都想吐的时候,终于成功的 ...