分享

Windows平台分布式架构实践

 集微笔记 2014-05-23

概述

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

但是如果.NET也支持跨平台之后,那这样的格局可能就要发生变化了。上面所有的优势依然可以保留,并且加上它语法的优越性,以及快速的开发效率等,还是会为其争得一席之地的。

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

什么是负载均衡

负载均衡可以帮我们解决两个方面的问题,第一个即提高可用性。这里面的可用性主要是从WEB服务器,的角度来讲的,如果说我们只有一台Web服务器,而它遇到了某种未知的错误导致IIS无法启动,那么我们的网站就无法访问了,这就是一种比较低的可用性。那么利用负载均衡,放在我们Web服务器的前面,由它来收集所有的请求,然后转发给我们的Web服务器, 这时候我们就可以添加两台Web服务器,如果其中有一台坏了,至少还有另一台在工作,也不至于导致我们的网络无法访问。

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

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

所有的请求首先全部到达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资源的因素,所以测试结果只是一个参考)。

在我的机器上有一台虚拟机配置如下:

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. <connectionStrings> 
  2.   <add name="CarolContext" connectionString="Server=localhost;database=carol;trusted_connection=true" providerName="System.Data.SqlClient" /> 
  3. </connectionStrings> 

我们使用的轻量级的ab来做压力测试,如果不熟悉ab的可以点这里,下面是测试的结果:
ab -n1000 -c100 http://192.168.1.131

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


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多