自从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计划,所以不需要付这么多钱,但是要付的话,最多也就是这么多。