【51CTO精选译文】编者按:开发人员和社区类产品/运营工作者应该对Stack Overflow十分熟悉:这是IT界最受欢迎的问答网站之一。随着Stack Overflow越来越火,该网站在最近几年也对自身的架构进行了大量的扩展优化。本文作者对Stack Overflow这几年的架构变迁进行了揭秘。
自从本人在2009年写了关于Stack Overflow 架构的第一篇文章后,该架构已发生了很大的变化。那篇文章主要介绍了Stack Overflow采取的向上扩展(scale-up)策略,而Stack Overflow在最近几年得到了全面发展。
Stack Overflow取得了长足发展:规模扩大了一倍多,每月不重复的访问用户超过1600万;每月网页浏览量(PV)增长了近6倍,达到9500万。
Stack Overflow发展壮大成了 Stack Exchange Network,而这个网络包括Stack Overflow、Server Fault和Super User等,旗下总共拥有43个网站,而且发展势头良好。
但不变的是Stack Overflow在其所作所为方面坚持的开放理念,而这才有了今天这篇文章。最近的一连串帖子主要介绍了Stack Overflow在如何应对增长:《Stack Exchange的架构要点介绍》、《Stack Overflow的纽约数据中心》、《为确保管理和容错的高扩展性而设计》、《Stack Overflow搜索——现在时间缩短了81%》、《Stack Overflow网络配置》、《Stack Overflow使用缓存吗?如果使用,怎么使用?》和《哪些工具和技术构建了Stack Exchange Network?》等。(51CTO编辑注:以上文章均为英文。)
这几年来比较明显的一些变化如下:
◆数量更多:更多的用户、更多的PV、更多的数据中心、更多的站点、更多的开发人员、更多的操作系统、更多的数据库、更多的机器。
◆Linux:Stack Overflow因使用Windows系列产品而著称,现在他们使用越来越多的Linux机器,用于HAProxy、Redis、Bacula、Nagios、日志和路由器等系统。所有支持功能似乎都由Linux来处理,这就需要开发并行版本发行流程。
◆容错:现在为Stack Overflow提供服务的是使用两条不同互联网连接的两只不同交换机,Stack Overflow添加了冗余机器,一些功能已搬迁到第二个数据中心。
◆NoSQL:Redis现用作整个网络的缓存层。以前没有独立的缓存层,所以这是一大变化,使用基于Linux的NoSQL数据库也是一大变化。
遗憾的是,我没有找到哪些帖子在介绍我上次提出的一些开放问题,比如Stack Overflow如何处理有着众多不同属性的多租户架构,不过我们还是可以从许多方面来了解。下面是收集的一些信息:
统计数字
◆每月网页浏览量9500万次
◆每秒800个HTTP请求
◆每秒180个DNS请求
◆每秒55兆位
◆1600万个用户——Stack Overflow的流量在2010年增长了131%,全球每月不重复访客增至1660万人。
数据中心
◆1个机架放在俄勒冈州的Peak Internet(用于放置chat和Data Explorer)
◆2个机架放在纽约州的Peer 1(用于放置Stack Exchange Network的其余部分)
硬件
◆10台戴尔R610 IIS Web服务器(3台专门用于Stack Overflow)
◆1个英特尔至强处理器E5640,2.66 GHz四核,8线程
◆16 GB内存
◆Windows Server 2008 R2
◆2台戴尔R710数据库服务器:
◆2个英特尔至强处理器X5680,3.33 GHz
◆64 GB内存
◆8个硬盘
◆SQL Server 2008 R2
◆2台戴尔R610 HAProxy服务器:
◆1个英特尔至强处理器E5640,2.66 GHz
◆4 GB内存
◆Ubuntu Server
◆2台戴尔R610 Redis服务器:
◆2个英特尔至强处理器E5640,2.66 GHz
◆16 GB内存
◆CentOS
◆1台戴尔R610 Linux备份服务器,运行Bacula:
◆1个英特尔至强处理器E5640,2.66 GHz
◆32 GB内存
◆1台戴尔R610 Linux管理服务器,用于Nagios和日志:
◆1个英特尔至强处理器E5640,2.66 GHz
◆32 GB内存
◆2个戴尔R610 VMWare ESXi域控制器:
◆1个英特尔至强处理器E5640,2.66 GHz
◆16 GB内存
◆2只Linux路由器
◆5只戴尔Power Connect交换机
开发工具
◆编程语言:C#
◆集成开发环境(IDE):Visual Studio 2010团队套件
◆框架:微软ASP.NET(版本4.0)
◆Web框架:ASP.NET MVC 3
◆视图引擎:Razor
◆浏览器框架:jQuery 1.4.2
◆数据访问层:LINQ to SQL,一些原始SQL
◆源码控制:Mercurial和Kiln
◆比较工具:Beyond Compare 3
使用的软件和技术
◆Stack Overflow通过BizSpark,使用WISC堆栈
◆操作系统:Windows Server 2008 R2 x64
◆数据库:运行微软Windows Server 2008企业版x64的SQL Server 2008 R2
◆Web 服务器:IIS 7.0
◆HAProxy:用于负载均衡
◆Redis:用作分布式缓存层
◆CruiseControl.NET:用于代码构建和自动化部署
◆Lucene.NET:用于搜索
◆Bacula:用于备份
◆Nagios:(n2rrd和drraw插件)用于监控
◆Splunk:用于日志
◆SQL Monitor:Red Gate公司提供,用于SQL Server监控
◆Bind:用于DNS
◆Rovio:一个小巧的机器人(真正的机器人),让远程开发人员可以通过“虚拟方式”访问办公室。
◆Pingdom:外部监控和警报服务网站
推荐阅读:国外十大流行的服务器监控工具(外篇)
#p#
外部组件
不是作为开发工具一部分而包括的代码:
◆reCAPTCHA
◆DotNetOpenId
◆WMD——现在作为开源而开发。详见github网络图
◆Prettify
◆Google Analytics
◆Cruise Control .NET
◆HAProxy
◆Cacti
◆MarkdownSharp
◆Flot
◆Nginx
◆Kiln
◆内容分发网络(CDN):无,所有静态内容从sstatic.net来提供,这个快速的、无cookie的域用于将静态内容分发到Stack Exchange系列网站。
开发人员和系统管理员
◆14名开发人员
◆2名系统管理员
内容
◆许可证:Creative Commons Attribution-Share Alike 2.5 Generic
◆标准:OpenSearch,Atom
◆主机:PEAK Internet
架构的更多信息和汲取的经验
◆使用了Proxy,而不是使用Windows网络负载均衡(NLB),因为HAProxy成本低廉、易于使用,还是免费的;而且通过Hyper-V,很适合作为网络上的一个512M虚拟机“设备”。它还在服务器的前端工作,所以对服务器来说完全透明;而且作为不同的网络层,更容易排除故障,而不是与你的所有窗口配置混杂在一起。
◆没有使用CDN,因为与捆绑在现有主机方案中的带宽相比,连亚马逊CDN这样“便宜的”CDN其费用都非常昂贵。按照亚马逊的CDN费率和Stack Overflow的带宽使用量,每月至少要付1000美元。
◆备份到磁盘上,便于快速恢复;备份到磁带上,便于历史归档。
◆SQL Server的全文搜索机制集成度非常差,问题多多,功能很弱,所以Stack Overflow改用了Lucene。
◆最受关注的是峰值HTTP请求数字,因为这正是他们需要确保能处理的方面。
◆所有属性如今都在同一个Stack Exchange平台上运行。那意味着Stack Overflow、Super User、Server Fault、Meta、WebApps和Meta Web Apps都在同一个软件上运行。
◆有一些独立的StackExchange站点,因为人们拥有不同的专业技能,这些技能并不适用于不同的主题站点。你也许是世界上最出色的大厨,但并不是说你就有能力修复服务器。
◆Stack Overflow尽量把一切都放到缓存中。
◆匿名用户访问的所有页面通过输出缓存(Output Caching)放到缓存中,随后提供给匿名用户。
◆每个站点有三种不同的缓存:本地缓存、站点缓存和全局缓存。
◆本地缓存:只能通过1对服务器/站点来访问。
◆为了限制网络延迟时间,Stack Overflow使用了本地“一级”缓存(基本上是HttpRuntime.Cache),缓存服务器上最近设定/读取的值。这样就可以把网络上的缓存查找开销减小至0字节。
◆缓存里面含有用户会话和等待的视图数更新等内容。
◆缓存完全驻留在内存中,没有网络或数据库访问。
◆站点缓存:可以由一个站点(任何服务器上)的任何实例来访问。
◆大部分缓存的值进入到这里,热点问题ID列表和用户验收率就是两个典例。
◆缓存驻留在Redis(位于不同的数据库,纯粹为了易于调试)。
◆Redis的速度很快,缓存查找中速度最慢的部分就是读取字节并写到网络上。
◆值被发送到Redis之前先进行压缩。Stack Overflow有许多处理器,大部分数据是字符串,所以得到的压缩比很高。
◆Redis机器上的处理器使用率为0%。
◆全局缓存:全局缓存被所有站点和服务器共享。
◆缓存内容包括收件箱、API使用限额和另外几项真正全局的内容。
◆缓存驻留在Redis中(位于数据库0,同样为了易于调试)。
◆缓存中的大部分项目在超时(通常是几分钟)后过期,从来不被明确删除。需要宣布某个特定的缓存项目无效时,他们使用Redis消息传递机制,向“一级”缓存发布删除通知。
◆知名软件工程师、Fog Creek Software公司首席执行官Joel Spolsky不是微软的忠诚分子,他并不为Stack Overflow做出技术决策,认为微软的许可证是个舍入误差。
◆Stack Overflow为自己的输入/输出系统选择了英特尔X25固态硬盘组成的RAID 10阵列。这个RAID阵列消除了可靠性方面的任何问题;与FusionIO相比,固态硬盘的性能确实很好,而价格又便宜得多。
◆微软许可证的总标价约为24.2万美元。由于Stack Overflow使用Bizspark,所以没在支付总标价,但他们能付的最多也就这么多。
◆英特尔网卡取代了博通网卡和主生产服务器。这解决了他们之前面临的问题:连接中断、数据包丢失和地址解析协议(ARP)表损坏。
【51CTO.com译文,转载请注明原文作译者和出处。】
原文:Stack Overflow Architecture Update - Now At 95 Million Page Views A Month
【编辑推荐】