ASP.NET站点中做负载均衡:

  基于HTTP协议我们可能发现我们要解决两点问题:

  第一,做到负载均衡,我们需要一个负载均衡器。

  可以通过DNS轮询来做,在DNS服务器上配置为每次对我们做负载均衡的同一主机名的DNS查询得到不同的IP地址。这样的好处是配置简单投入较小,缺点是浏览器访问各个服务器的机会是均等的,不能根据服务器的负载程度自动把请求路由到负载较小的服务器。

  可以通过专用的负载均衡设备,通过监测后台数台服务器的负载情况,自动把HTTP请求转发到负载较轻的服务器。另外必须监测后台服务器的IIS负载情况,而不是整台服务器的CPU负载。同时可能需要在负载均衡器和后台服务应用之间建立心跳连接,以避免出现某台服务器IIS进程或者其中跑的应用已经down掉,负载均衡器反而监测到这台服务器的负载最小而把大量请求转发的这台服务器,达到相反的效果。

  第二,Session状态的保持和迁移。

  由于HTTP协议的无状态性,我们一般是在Session中保存客户端的一些状态数据,负载均衡之后,前后两次HTTP请求所到达的服务器可能不是同一台,这就造成可能出现这样的情况,前一此请求处理中设置的session在第二次请求中变得不可用了,造成应用程序出错。所以我们要把session跟随迁移。实现的方法就是session的统一存储和服务器间共享。

  在ASP.NET中服务器保存session有五种方式,Off不说了,InProc是保存在服务器进程的内存中,显然不能满足要求。另外两种能够满足:

  StateServer是把session保存在专门的状态服务器中。这样各台服务器都存取同一个StateServer,达到共享的目的。

  SQLServer是把session保存在数据库中。同样能达到目的。

  Custom自定制的存储方案,我们自己写当然能够实现。

  比较一下,Custom这种自己实现比较麻烦一般不用,SQLServer可以利用数据库的cluster达到高性能和高可用性的目的,StateServer当然也可以通过手段达到高可用性,不过似乎不能实现集群所以性能也有所限制。

  另外如果要做负载均衡在StateServer和SQLServer中配置session时,必须在web.config中重写machineKey节点:

  <machineKey

  validationKey="1234567890123456789012345678901234567890AAAAAAAAAA"

  decryptionKey="123456789012345678901234567890123456789012345678"

  validation="SHA1"

  decryption="Auto"

  />

  否则各个应用服务器拿到的session还是不一样的。

  可能Custom方式可以自己定义存取session方式忽略machineKey,这可能就不必要了,因为没有做过,不多说。

1:HTTP重定向

所谓HTTP重定向,就是通过修改HTTP响应头中的Location标识为新的URL,然后返回给客户端,让客户端重新根据这个Location标识的URL去做新的请求。

这是一种最简单、也是最轻量级的负载均衡实现方案,使用asp.net,我们可以这样来实现,比如在主站www.yourdomain.com中,我们在默认主页如下编码:

static string[] servers =
        {
        };
protected void Page_Load(object sender, EventArgs e)
{
    Response.Redirect(servers[DateTime.Now.Millisecond % 2]);
}

在上面的代码中,Response.Redirect实际为http头返回状态码302,这是为了告诉浏览器,请到Location中去拿URL,并且去到这个新的URL去做请求。当然,我们也可以采用最原始的方法来代替Redirect方法:

Response.Status = "302 Found";
Response.StatusCode = 302;
Response.AddHeader("Location", servers[DateTime.Now.Millisecond % 2]);

使用HttpWatch监视,我们对www.yourdomain.com请求,得到:

可以清晰的看到第一次请求返回的302,然后转发到新的地址,得到状态码200。

以上方法是在客户端的重定向,即浏览器请求了两次,一次是到主服务器,第二次是到Location中指定的服务器上去请求。

HTTP重定向的方式非常依赖于主站的处理能力,它的性能瓶颈也是来自于IIS对于接受请求->asp.net处理首页动态程序->返回带有特定头请求,是的,它不能突破自身的性能瓶颈,比如,在我的破测试机上,我得到的吞吐率为:

好在IIS自身已经支持重定向(查阅http://technet.microsoft.com/zh-cn/library/cc732969(WS.10).aspx),这更进一步省略了我们自己写代码实现重定向,省略运行ASP.NET代码带来的性能损耗。

2:varnish实现的反向代理负载均衡

另外一种思路是使用反向代理服务器的负载均衡功能,上篇当中介绍的varnish就支持这样的功能,查看配置文件:

backend web1 {
     .host = "192.168.0.77";
     .port = "8081";    
}
backend web2 {
     .host = "192.168.0.77";
     .port = "8082";
}
director lb round-robin {
    {
        .backend = web1;
    }
    {
        .backend = web2;
    }
}
 sub vcl_recv {
     set req.backend = lb;
     return (pass);
 }

在该配置文件中,我们部署了两台WEB服务器,当然,为了简单期间,我这里是使用了同一台服务器的两个端口。在vcl_recv函数中,varnish定义了负载均衡。

运行varnish之,我们会发现请求被转发到后台服务器了。

3:其它方案

1:DNS负载均衡,通过增加域名A记录来让DNS服务器实现负载均衡。好处是几乎不会碰到性能问题。缺点:要求每个WEB服务器必须有外网地址。一旦某台服务器崩溃,不能及时让DNS修改生效。不能定义自己的转发策略;

2:IP负载均衡,有LVS-NAT,采用iptables,对LINUX内核操作,性能相对于反向代理服务器并没有质的飞跃;IP负载均衡仍旧需要转发请求给实际服务器,同时需要转发实际服务器的响应给用户,所以,它的性能瓶颈来自于NAT服务器的性能及网络带宽;

3:直接路由,有LVS-DR,工作在数据链路层(第二层),要求所有WEB服务器接入外网;负载均衡器负责转发请求给实际服务器,但是它通过修改数据包中的MAC地址,能够做到让实际服务器的响应直接返回给用户,而不用通过负载均衡器,这当然进一步提升了负载均衡的效率;

4:IP隧道,有LVS-TUN,用于不同机房(即不同WAN网段)的负载均衡,原理同LVS-DR;

ASP.NET中如何实现负载均衡的更多相关文章

  1. 一步一步在Windows中使用MyCat负载均衡 下篇

    之前在 一步一步在Windows中使用MyCat负载均衡 上篇 中已经讲了如何配置出MyCat.下面讲其相关的使用. 五.配置MyCat-eye 对于MyCat监控官网还提供一个MyCat-eye w ...

  2. Linux中keepalived+LVS负载均衡的搭建测试

    1.1 LVS简介       LVS(Linux Virtual Server),也就是Linux虚拟服务器, 是一个自由软件项目.使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Lin ...

  3. 一步一步在Windows中使用MyCat负载均衡

    一步一步在Windows中使用MyCat负载均衡 http://www.cnblogs.com/zhangs1986/p/6408981.html   mycat+sqlServer简单demo配置 ...

  4. LVS集群中的IP负载均衡技术

    LVS集群中的IP负载均衡技术 章文嵩 (wensong@linux-vs.org) 转自LVS官方参考资料 2002 年 4 月 本文在分析服务器集群实现虚拟网络服务的相关技术上,详细描述了LVS集 ...

  5. linux+asp.net core+nginx四层负载均衡

    Linux Disibutaion:Ubuntu 16.04.1 LTS Web Server:Nginx.Kestrel 关于如何在linux中部署asp.net core我这里不再详细介绍,可以参 ...

  6. asp.net core 五 SignalR 负载均衡

           SignalR : Web中的实时功能实现,所谓实时功能,就是所连接的客户端变的可用时,服务端能实时的推送内容到客户端,而不是被动的等待客户端的请求.Asp.net SignalR 源码 ...

  7. Ocelot中文文档-负载均衡

    Ocelot能通过可用的下游服务对每个ReRoute进行负载平衡. 这意味着您可以扩展您的下游服务,并且Ocelot可以有效地使用它们. 可用的负载均衡器的类型是: LeastConnection - ...

  8. 一步一步在Windows中使用MyCat负载均衡 上篇

    传统关系型数据库的分布式开发通常需要自己做,不仅耗时耗力而且效果不是很理想,当想快速搭建时,最初想到的是看有没有第三方,网上牛人还是很多的,做得比较好的其中之一Mycat,它是开源的分布式数据库系统, ...

  9. asp.net:如何实现负载均衡方案讨论 (nginx+iis实现负载均衡)

    5台阿里云服务器,ip地址分别为 ip地址                      名字简称      操作系统       iis服务器     cpu   内存DDR3      机械硬盘 11 ...

随机推荐

  1. Rotate

    hdu4998:http://acm.hdu.edu.cn/showproblem.php?pid=4998 题意:给你n个点,以及绕每个点旋转的弧度.然后,问你经过这n次旋转,平面中的点总的效果是相 ...

  2. 【POJ 1830】 开关问题 (高斯消元)

    开关问题   Description 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为 ...

  3. Ubuntu 安装基础教程

    转自:http://teliute.org/linux/Ubsetup/index.html 1.进入 live cd 桌面  1)设置好启动后,断开网络,然后重启动计算机,可以用硬盘启动,也可以刻成 ...

  4. 最简单的CRC32源码-逐BYTE法

    从按BIT计算转到按BYTE计算,要利用异或的一个性质,具体见前面的文章<再探CRC >. 其实方法跟逐BIT法是一样的,我们只是利用异或的性质,把数据分成一BYTE一BYTE来计算,一B ...

  5. Android调用MediaScanner进行新产生的媒体文件扫描

    有时候,我们拍了一张图片或录制了一段视频,图库应用默认没有将这些新产生的文件识别出来所以打开图库或视频播放器发现没有找到这些文件,需要调用MediaScanner扫描一下才会出来.从FFMPEG中找了 ...

  6. (转载)struct 与typdef struct的区别

    (转载)http://blog.csdn.net/piratejk/article/details/3491226 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字. ...

  7. 很反感Java Web 三层框架

    为什么反感,大家 看图就知道了.一层一层的框架叠加,要达到精通就要一个一个框架的去深入了解,谁有这个精力?PHP没有这么多框架,为何依然能开发大型网站呢? 不过此图的原文却在推销使用Java,原文点此 ...

  8. Python初始值表示为无穷大

    之前只知道设置变量的初始值为0.今天在写网络路径分析的时候,为了找到离任意坐标距离最近的节点,初始设置最短距离为无穷大,然后不断的去替换,直到找到最近的节点. 刚开始设置是min_dis = 9999 ...

  9. 嵌入式linux平台搭建

    选用Ubuntu12.04.2系统搭建平台.在原始系统下做如下更改: 将更新使用的服务器设置为国内“163”服务器 安装SSH,uboot—mkimage等软件 安装编译器“arm—2009q3”及相 ...

  10. Poj 3695-Rectangles 矩形切割

    Rectangles Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3846   Accepted: 1124 Descri ...