技术开发 频道

.NET大型Web站点StackOverflow架构分析

    【IT168 技术】自从2009年8月发布了第一篇关于“Stack Overflow 架构”方面的文章,Stack Overflow已经发生了很大的变化。那篇文章更多关注的是Stack Overflow如何解决网站的扩展性(scale-up)问题,而经过几年的发展,Stack Overflow已经长大成人,成长为了大型网站。

  现在与2009年相比,Stack Overflow每月独立访问用户翻了一倍,超过1600万;每月PV翻了近6倍,达到9500万。

  Stack Overflow新增了很多站点,比如Server Fault, Super User等,共有43个不同站点组成了Stack Exchange Network,可谓硕果累累,迅猛增长。

  Stack Overflow的变化翻天覆地,而不变的是他们开放的心态,所以才有了这篇架构分享的文章。最近,他们写了一系列文章分享他们如何应对这样的快速增长。

  穿越时空,我们来看看有哪些明显的变化?

  更多:更多的用户,更多的PV,更多的数据中心,更多的站点,更多的开发者,更多的操作系统,更多的数据库,更多的服务器...

  Linux:Stack Overflow因使用Windows系统而著称,现在他们使用越来越多的Linux服务器,比如HAProxy(负载均衡), Redis(NoSQL数据库), Bacula(数据备份系统), Nagios(远程监控软件), 日志, 路由器都运行于Linux系统,几乎所有需要并行处理的功能都是由Linux处理(这句话的翻译可能不准确)。

  容错:Stack Overflow使用了两条不同的互联网线路,增加了更多的冗余服务器,将一些网站服务运行于第二个数据中心。

  NoSQL:Redis作为整个网站的缓存层。这是一个巨大的改变,以前并没有将缓存作为一个独立的层分离出来。Redis运行于Linux。

  遗憾的是,一些我关注的问题并没有从中找到答案,比如面对这么多不同的系统,如何解决多租户的问题(Multi-tenancy 是一种软件体系结构,在这种体系结构中软件运行在 software as a service 服务商的服务器上,服务于多个客户组织即 tenant)。但是,从中我们依然可以学到很多。下面是收集的一些数据列表:

  The Stats

  1.95 Million Page Views a Month

  2.800 HTTP requests a second

  3.180 DNS requests a second

  4.55 Megabits per second

  5.16 Million Users - Traffic to Stack Overflow grew 131% in 2010, to 16.6 million global monthly uniques.

  Data Centers

  1 Rack with Peak Internet in OR (Hosts our chat and Data Explorer)

  2 Racks with Peer 1 in NY (Hosts the rest of the Stack Exchange Network)

  Hardware

  10 Dell R610 IIS web servers (3 dedicated to Stack Overflow):

  1x Intel Xeon Processor E5640 @ 2.66 GHz Quad Core with 8 threads

  16 GB RAM

  Windows Server 2008 R2

  2 Dell R710 database servers:

  2x Intel Xeon Processor X5680 @ 3.33 GHz

  64 GB RAM

  8 spindles

  SQL Server 2008 R2

  2 Dell R610 HAProxy servers:

  1x Intel Xeon Processor E5640 @ 2.66 GHz

  4 GB RAM

  Ubuntu Server

  2 Dell R610 Redis servers:

  2x Intel Xeon Processor E5640 @ 2.66 GHz

  16 GB RAM

  CentOS

  1 Dell R610 Linux backup server running Bacula:

  1x Intel Xeon Processor E5640 @ 2.66 GHz

  32 GB RAM

  1 Dell R610 Linux management server for Nagios and logs:

  1x Intel Xeon Processor E5640 @ 2.66 GHz

  32 GB RAM

  2 Dell R610 VMWare ESXi domain controllers:

  1x Intel Xeon Processor E5640 @ 2.66 GHz

  16 GB RAM

  2 Linux routers

  5 Dell Power Connect switches

  Dev Tools

  1.C#: Language

  2.Visual Studio 2010 Team Suite: IDE

  3.Microsoft ASP.NET (version 4.0): Framework

  4.ASP.NET MVC 3: Web Framework

  5.Razor: View Engine

  6.jQuery 1.4.2: Browser Framework:

  7.LINQ to SQL, some raw SQL: Data Access Layer

  8.Mercurial and Kiln: Source Control(分布式版本控制系统)

  9.Beyond Compare 3: Compare Tool(文件比较工具)

  Software and Technologies Used

  1.Stack Overflow uses a WISC stack via BizSpark

  2.Windows Server 2008 R2 x64: Operating System

  3.SQL Server 2008 R2 running Microsoft Windows Server 2008 Enterprise Edition x64: Database

  4.Ubuntu Server

  5.CentOS

  6.IIS 7.0: Web Server

  7.HAProxy: for load balancing(高性能的负载TCP/HTTP均衡器)

  8.Redis: used as the distributed caching layer.(作为分布式缓存层的NoSQL数据库)

  9.CruiseControl.NET: for builds and automated deployment(.NET平台的持续集成工具)

  10.Lucene.NET: for search

  11.Bacula: for backups(开源的数据备份系统)

  12.Nagios: (with n2rrd and drraw plugins) for monitoring(监视系统运行状态和网络信息的远程监控软件)

  13.Splunk: for logs(日志分析工具)

  14.SQL Monitor: from Red Gate - for SQL Server monitoring

  15.Bind: for DNS

  16.Rovio: a little robot (a real robot) allowing remote developers to visit the office “virtually.”

  17.Pingdom: an external monitor and alert service.(网站监控服务及网站速度测试工具)

  External Bits

  Code that is not included as part of the development tools:

  1.reCAPTCHA(用于验证码验证,已被Google收购)

  2.DotNetOpenId(.NET 平台上的 OpenID 实现方案)

  3.WMD - Now developed as open source. See github network graph (轻量级所见即所得编辑器)

  4.Prettify(代码高亮显示)

  5.Google Analytics

  6.Cruise Control .NET

  7.HAProxy(负载均衡)

  8.Cacti(网络流量监测图形分析工具)

  9.MarkdownSharp(Markdown文本处理器的C#实现)

  10.Flot(基于JQuery的纯JavaScript实现的绘图库)

  11.Nginx(反向代理服务器)

  12.Kiln(分布式版本控制系统)

  13.CDN: none, all static content is served off the sstatic.net, which is a fast, cookieless domain intended for static content delivered to the Stack Exchange family of websites.

  (没有使用CDN,用一个专门的域名sstatic.net传递所有的静态内容)

  Developers and System Administrators

  14 Developers

  2 System Administrators

  Content

  License: Creative Commons Attribution-Share Alike 2.5 Generic

  Standards: OpenSearch, Atom

  Host: PEAK Internet

  More Architecture and Lessons Learned

  1.用HAProxy取代了Windows NLB,HAProxy成本更低,更易于使用,通过Hyper-V可以很好地运行于512M内存的虚拟机。它工作于服务器群的最前端,对所有的服务器都透明。相比于原来混杂在一起的Windows配置,它运行于一个独立的网络层,更易于维护与故障处理。

  2.没有使用CDN,即使使用像Amazon那样与主机空间捆绑在一起的看起来“便宜”的CDN,实际的费用也是很高的,至少需要1000美元/月。

  3.备份方案有两种,一种用于快速恢复的磁盘备份,一种用于历史数据存档的磁带备份。

  4.SQL Server的全文索引是非常差劲的,所以他们用Lucene.NET。

  5.让人很感兴趣的是他们如何处理访问高峰时的HTTP请求。

  6.所有这些都运行于Stack Exchange平台,那意味着Stack Overflow, Super User, Server Fault, Meta, WebApps, 和Meta Web Apps都运行于同一个软件。

  7.也有一些独立运行的StackExchange站点,服务于那些具有多个专业技能,又不想为了不同的话题在多个站点之间奔波的人。如果你能成为最伟大的主厨,不能因为给你安排了服务员的工作,你就安于现状。

  8.他们疯狂地使用缓存。

  9.未登录用户访问的所有页面都通过Output Caching进行缓存。

  10.每个站点使用三种类型的缓存:本地、站点、全局。

  本地缓存:只能被当前站点的当前服务器访问。

  为了减少网络延时,通常使用HttpRuntime.Cache作为一级缓存,这样可以避免通过网络在缓存服务器上查找的开销。

  缓存内容包含用户会话,视图数的更新。

  直接缓存在内存中。

  站点级缓存:能被同一个站点的所有服务器访问。

  大部分的缓存都在这一级,比如热点问题ID列表,用户支持率。

  缓存数据存储在Redis数据库中。

  Redis速度很快,缓存查找的开销主要在网络传输上。

  缓存数据发送至Redis之前会被压缩。为什么要压缩呢?因为CPU资源绰绰有余,而且大部分缓存数据是字符串,压缩率会很高,何乐而不为呢。

  Redis服务器上的CPU使用率是0%。

  全局缓存:被所有站点和服务器共享。

  缓存内容包含收件箱,API使用限额,一些全局设置等。

  缓存于Redis数据库中。

  大部分缓存项目在超过缓存时间之后会自动过期(通常几分钟),不需要进行删除操作。当需要让一个特定的缓存失效,会通过Redis消息系统给一级缓存发送删除通知。

  Joel Spolsky(Stack Overflow的创始人)并不是微软的忠诚分子,他不负责技术决策,使用微软软件考虑的也只是性价比(这句可能翻译不准确)。Hacker News上一些评论者的说法需要纠正。

  对于IO系统,他们选择的是Intel X25 solid state drives(SSD硬盘)的RAID 10磁盘阵列,这样的磁盘阵列,保证了可靠性。这个SSD硬盘用起来感觉不错,而且价格比FusionIO的便宜。

  使用的这些微软软件,如果全部购买的话,总费用大概在24.2万美元。由于Stack Overflow参加了微软的Bizspark计划,所以不需要付这么多钱,但是要付的话,最多也就是这么多。

0
相关文章