Windows平台分布式架构实践 - 负载均衡

概述

  最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,而且在不久的未来,咱们在VS里面写的代码可能就能够经过Mono直接在Linux和Mac上运行。那么你们(开发者和企业)为何那么的迫切的但愿.NET跨平台呢?第一个理由是便宜,淘宝号称4万多台服务器所有运行在Linux,Linux平台下还有免费的MySql,这些都是免费的,这些省下来直接就是利润呀,作企业的成本能够下降又没有任何损失,何乐而不为呢?第二个理由是在Linux系统下还有不少很是优秀的构架(固然一样也是免费的),分布式缓存Memcached, 大数据处理构架Hadoop等等,这些都为一些大型的分布式系统提供了很好的支撑,固然还有诸如Liniux系统自己的一些安全和网络方面的优点,等等。 因此也难怪大佬们都纷纷不约而同的没有选择.NET。 html

 

  可是若是.NET也支持跨平台以后,那这样的格局可能就要发生变化了。上面全部的优点依然能够保留,而且加上它语法的优越性,以及快速的开发效率等,仍是会为其争得一席之地的。程序员

  可是,是否是Windows平台下就不能实现这些大型的分布式系统呢?我相信这个问题已经被普遍讨论过,可是至少我没有看到比较清晰的,完整的案例。带着这些问题,我决定升级个人机器,本身从头至尾在windows平台下搭建一个高可扩展性的分布式网站出来。我经验尚浅,不少的东西还处于摸索阶段,因此若是有错误,还请大师多多指点。web

什么是负载均衡

  负载均衡能够帮咱们解决两个方面的问题,第一个即提升可用性。这里面的可用性主要是从WEB服务器,的角度来说的,若是说咱们只有一台Web服务器,而它遇到了某种未知的错误致使IIS没法启动,那么咱们的网站就没法访问了,这就是一种比较低的可用性。那么利用负载均衡,放在咱们Web服务器的前面,由它来收集全部的请求,而后转发给咱们的Web服务器, 这时候咱们就能够添加两台Web服务器,若是其中有一台坏了,至少还有另外一台在工做,也不至于致使咱们的网络没法访问。数据库

  

  固然,有人可能会问,若是那台Load balancer坏了怎么办?那不是仍是访问不了网站么?咱们这里讨论的是提升可用性,在作到365天*24小时不间断的服务,须要有另外的组件来支撑,咱们留在后面讨论。除了可用性之外,负载均衡还能够帮助咱们提升可扩展性,固然这个可扩展性一样是指的Web服务器层面。从网站性能的角度来说,好几个程序员花上好几天的时间作了一些优化所带来的效果有时候可能尚未直接加一根内存条来的快。内存加完了没什么影响,咱们还能够换更好的CPU,CPU换完了,咱们还能够用固态硬盘,甚至不少公司已经开始直接把数据放到内存中了(注:具体场景具体对待)。 若是这些都不能够再加了呢?那就再加机器吧,一台服务器能够处理1000个并发,那么两台理论上是2000了,因此这就有了咱们的横向扩展。windows

  

负责均衡器分发请求的类型

  全部的请求首先所有到达Load balancer,再由它转发到具体的Web服务器,转发的方式分为如下几种:缓存

  • 轮转调度(Round-robin):最简单的方式,这种方式基本上不能算是负载均衡。第一个请求给web1,下一个给web2,再下一个给web3... 不会考虑某 一个服务器是否是负荷过重等等。
  • 基于权重的分配(Weight-based): 能够配置每一台服务器处理请求数据的比例,特别适合那种有某台服务器配置不同的场景。好比说某台服务器配置特别好,那咱们可让它多处理一些请求。
  • 随机(Random): 随机分配。
  • 粘性session(Sticky Session): Load balancer会跟踪请求,确保同一个session id的请求都交给同同样服务器。
  • 最空闲优先(Least current request)将最新的请求转发给当前处理请求数量最小的那个服务器。
  • 响应时间优先(Response time):哪台服务器当前响应时间最短就给哪台。
  • 用户或URL参数选择(User or URL information)部分负载均衡器还提供根据一些参数来决定哪台服务器来处理,好比说根据用户信息,地址位置,URL参数,cookie信息等 。

  咱们还能够根据负载均衡器所使用的技术将它们分为如下几类:安全

  • 反向代理:负载均衡器做为一个代理,同时维持着两个TCP请求,从客户端接收请求,而后将请求转发给相应的Web 服务器,等Web返回Response的时候是返回给了代理服务器,而后再由代理服务器转交给真正的客户端。这样就会致使有一些功能不可用,好比在WEB服务器环境查看请求的来源IP实际上成了咱们代理服务器的IP等。 
  • 透明反向代理:和上面的代理服务器同样,只不过WEB服务器从Request中获取到的信息是真正客户端的信息,就是好像没有使用代理同样的。
  • 直接服务器返回:经过更改WEB服务器的MAC 地址来实现分发请求,在这种方式下,WEB服务器不会像上面使用代理服务器同样,请求处理完以后是直接返回给客户端的,全部相对于反向代理来讲这种方式的性能会更快一些。 
  • NAT 负载均衡:NAT(Network Address Translation网络地址转换),将网络包(能够理解成TCP包)中的目标IP地址变成实现要处理这个请求的WEB服务器的地址。
  • Microsoft 网络负载均衡:Windows 自带的负载均衡组件,一会咱们就用它来作测试。 

不使用负载均衡的测试结果

一台独立的服务器

    咱们能够从一个网站的最初级版本开始提及,最开始的时候咱们决定搭建一个网站,可是咱们也不知道效果会怎么样,光键是那时候,咱们很穷,因而咱们租用了一台托管主机,它可能承担了至少三个或以上的角色:WEB服务器、静态资源服务器,以及数据库服务器。咱们能够用ASP.NET MVC4 + SQL 2008来作一个基本的电子商务网站,基本够用了。可是可以承载多大的访问量呢?下面咱们来作一个简单的测试(注意:本文之后本系列所面全部的测试都是在虚拟机上进行的,忽略网络的因素,以及多台虚拟机同时运行时CPU资源的因素,因此测试结果只是一个参考)。服务器

  在个人机器上有一台虚拟机配置以下:cookie

  CPU: Intel Core I5- 4570, 3.19GHz,
  内存: 4G
  硬盘:20G (ShineDisk 固态硬盘)网络

  测试页面没有什么复杂的逻辑,利用ASP.NET MVC4 + Entityframework 6.0 + SQL 2008 + IIS8.5来实现, 咱们的页面也只是一个简单的列表页,列出系统里面全部的商品。

  Home Controller 代码 
 

  Index.cshtml 代码 
  

  在数据库初始化的时候插入500条测试数据
  
  链接字符串就使用本地链接就能够了。

1
2
3
<connectionStrings>
   <add name= "CarolContext"  connectionString= "Server=localhost;database=carol;trusted_connection=true"  providerName= "System.Data.SqlClient"  />
</connectionStrings>

  咱们使用的轻量级的ab来作压力测试,若是不熟悉ab的能够点这里,下面是测试的结果:
  ab -n1000 -c100 http://192.168.1.131
  

  经过测试发现,咱们这单个服务器的吞吐率接近在110~130之间,而一旦并发数达到200之后,每一个请求的处理时间就达到1.5s多了,400个并发用户的时候每一个请求要花上3s多的时间。若是在真实的网络环境中可能会更差。由此咱们能够得出咱们这个服务器可能最大支持120人左右同时访问。 

WEB服务器与数据库服务器分离

  如今咱们来作一个花费不是很大,又空间作的扩展,也不须要改任何架构,咱们只是再加一台专门的数据库服务器。

  

  下面咱们再来看一下测试结果:
  
  你们能够看到,这里咱们的吞吐率(每秒处理请求数已经提高到了150左右),并发处理能力提高了50%,而且300和400并发的时候响应时间也比上面的架构要好一些。 

使用负载均衡的测试结果

安装网络负载均衡(NLB)

  上面咱们一台独立的Web服务器和一台独立的数据库服务器的组合已经能够处理150左右的并发了,如今咱们假想一下若是网站的的知名度愈来愈大,若是同时有400个用户来访问怎么办? 从上面的图中咱们能够看到400个并发的时候服务器的处理时间为2582.637ms(实现上这是拿到响应的时间,由于咱们是一台机器上的不一样虚拟机,我是在主机上作测试,因此咱们就忽略网络传输的时间,假设这个就是咱们的服务器处理时间),这个服务器响应时间也就是咱们经过F12->网络 中看到的等待时间 。

  页面何时能拿到这个响应还要加上网络传输的时间,也就是Receiving。1ms的传输时间堪称神速啊!我家用的长城宽带10M,老是早上网络出奇的好,一到晚上就挂掉了,还有可能就是大家如今都没有上博客园 :)

  用户体验黄金法则之一: 网站加载时间 = 用户体验,别说3S,可能等个2S你页面还不出来,用户准备离开了,下面是淘宝购物车页面的加载时间 。

  国内不少大型的网站的响应时间基本上都控制在100ms之内,基本达到那种一输入地址敲回车,眨眼之间页面就出来了。固然这并非光有个负载均衡加几台web服务器就能解决的,咱们后来再来一步一步的实践下去。 话说回来,咱们上面的测试结果基本上只有并发为10的时候响应时间是在100ms之内的, 看来咱们还有很长的一段路要走啊。

  正所谓“最好的架构是进化而来的,而不是设计出来的” ,面对咱们如今的瓶颈暂时经过负载均衡添加多台Web服务器就能够了。咱们上面讲到负载均衡器类型的时候有一种 Microsoft负载均衡,咱们能够很轻松的经过服务器管理器来将这些组件安装到咱们的服务器中。 安装咱们就不讲了,就是经过服务器管理-> 添加角色和功能->在功能中选择“网络负载均衡” 而后安装就能够了。

  注意:图中的Load balancer其实是不存在的,由于只要咱们2台Web服务器安装了网络负载平衡组件,在其中任意一台上创建群集就能够了,图是为了方便你们理解。 

  这样的话咱们的服务器架构就成了下面这个样子:
  
  192.168.1.254 就是咱们暴露的外部IP地址,访问192.168.1.254的请求就会转发给后面的两台WEB服务器。

配置网络负载均衡

  在咱们为上面2台WEB服务器安装NLB以后,咱们在其中任意一台上来新建群集,而后将另一台加入到这个群集中便可,咱们就在web-01(192.168.1.130)上来新建这个群集。在创建群集以前,咱们要确保这2台服务器都是使用的静态IP,不然没法将他们加入到群集中。

  • 在web-01(192.168.1.130)上从管理工具中打开 网络负载均衡器
  • 右击“网络负载平衡群集”,选择“新建群集”
  • 在“新群集:链接”窗口中将 192.168.1.130添加为主机,点击下一步
  • 进入 “新群集:主机参数”,直接下一步
  • 进入 “新群集:群集IP地址”, 添加窗口中的“添加” 将192.168.1.254 添加到窗口中而后点击下一步

  • 进入 “新群集:群集参数”,选择“多播”而后点击下一步
  • 进入 “新群集:端口规则”,选中所有,而后点击编辑
  • 将端口范围改为 80~80,协议选 “TCP”,相关性选“无”
  • 点击肯定回到主窗口,而后点击完成。
  • 经过上面的步骤,咱们已经创建了一个群集,而且将web-01加入到了群集中,咱们还须要手动将web-02也加入到群集中。


  • 在群集(192.168.1.254)上右键点击“添加主机到群集”
  • 在“将主机添加到群集:链接”窗口中的 主机中输入192.168.1.131而后后面一下点下一步便可。

  如今咱们就能够到咱们的真实机器上去访问192.168.1.254了,也就是说立刻咱们就进入测试环节了。

测试结果

  本文中全部的测试结果都没有取第一次的结果,EF也须要预热,一样的查询在EF中也是有缓存的,因此第一次的结果会与后面的测试结果有很大的区别,后面的几回(在相同参数下)基本差异就不大了。
  

  能够看到如今咱们的吞吐率大概平均在230左右,与一台WEB服务器+一台DB服务器相比,处理能力又提升了50%,为何不是100%呢?一台WEB服务器能处理150的并发,那两台应该是300才对呀?我可以想到如下缘由:

  1. 咱们的数据库服务器只有一台,数据库的处理能力提不上去最终影响WEB服务器的处理能力
  2. 咱们采用的是虚拟机,并不是实际的机器,他们其实是共用CPU,不知道在这种状况下对测试结果会不会有影响(虚拟化专家能够分享一下)。

  为了验证一下,我再扩展了一台WEB服务器,咱们使用3台WEB服务器+1台DB服务器看看是什么效果。
  
  咱们新建一台虚拟机web-03,而后将它也加入到咱们的群集中。
  

   测试开始! 
  
   在加入第三台WEB服务器以后,咱们的吞吐率(每秒处理请求数)再次获得提高从230升至360,并发处理能力再次提高56%,而且你们能够看到,400并发如下的平均每请求处理时间都在1s之内,可喜可贺啊!
   最后上两图让你们更直观的看一下这些性能的变化:

  
  

  以上数据均来自本人机器上的测试,虚拟机所有采用与第一台服务器一样的配置。

小结

  在网站架构的不断演变中,负载均衡起着很是重要的位置,不只仅为咱们提高可靠性和可扩展性,有一些比较强大的硬件设备还能提供缓存,以及session机制。今天咱们用到的负载均衡是Windows Server自带的一个组件,它是最简单实现负载均衡的方式,可是功能不是特别完善,并且一旦NLB自己发生错误那么将致使全部的网站都不能访问,咱们后面就来经过引入APR(Application Request Router)来解决这个问题,想要真正了解大型网站的架构实现,而不是仅仅知道负载均衡,分布式缓存,数据库分离这些名词么?那就来跟我一块儿学习吧!另外咱们今天只是用一个简单的页面作了压力测试,只有读数据的操做,尚未写的操做,也没有任何复杂的事务,可是别担忧,咱们一步一步来 :) 。

  您还能够查看本篇的续篇: Windows平台下利用APM来作负载均衡方案 - 解决Session同步问题,以及完全提升可用性。

做者:Jesse  原文地址:http://www.cnblogs.com/jesse2013/p/dlws-loadbalancer.html

《一棵树-博客园》 收集整理,转载请注明出处!
相关文章
相关标签/搜索