企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 堆栈溢出体系结构更新-现在每月有 9500 万页面浏览量 > 原文: [http://highscalability.com/blog/2011/3/3/stack-overflow-architecture-update-now-at-95-million-page-vi.html](http://highscalability.com/blog/2011/3/3/stack-overflow-architecture-update-now-at-95-million-page-vi.html) ![](https://img.kancloud.cn/cf/ab/cfab7bd4e70e5d75fa0490b3d1cdfb08_200x56.png) 自从我的第一篇关于 [Stack Overflow Architecture](/blog/2009/8/5/stack-overflow-architecture.html) 的文章以来发生了很多事情。 与上一篇文章的主题相反,该主题引起了人们对 Stack Overflow 致力于扩大规模战略的关注,但在过去的几年中,Stack Overflow 不断发展壮大。 Stack Overflow 的规模增长了两倍以上,超过 1600 万用户,其页面浏览量几乎翻了六倍,达到每月 9500 万页面浏览量。 堆栈溢出通过扩展到[堆栈交换网络](http://stackexchange.com/)而得以发展,该网络包括堆栈溢出,服务器故障和超级用户(总共 43 个不同站点)。 进行着很多富有成果的乘法。 不变的是,Stack Overflow 对他们正在做的事情持开放态度。 这就是促使进行此更新的原因。 最近的一系列帖子讨论了他们如何处理增长问题:[堆栈交换的体系结构以[项目符号]](http://blog.serverfault.com/post/stack-exchanges-architecture-in-bullet-points/) , [Stack Overflow 的纽约数据中心](http://blog.serverfault.com/2010/10/29/1432571770/),[为可伸缩性而设计 管理和容错](http://blog.serverfault.com/post/1097492931/),[堆栈溢出搜索-现在](http://blog.stackoverflow.com/2011/01/stack-overflow-search-now-81-less-crappy/),[堆栈溢出网络配置](http://blog.stackoverflow.com/2010/01/stack-overflow-network-configuration/),[减少 81%StackOverflow 是否使用缓存?如果使用缓存,如何使用缓存?](http://meta.stackoverflow.com/questions/69164/does-stackoverflow-use-caching-and-if-so-how) ,[哪些工具和技术构建了堆栈交换网络?](http://meta.stackoverflow.com/questions/10369/which-tools-and-technologies-build-the-stack-exchange-network) 。 跨时间的一些更明显的差异是: * **更多**。 更多用户,更多页面视图,更多数据中心,更多站点,更多开发人员,更多操作系统,更多数据库,更多机器。 的数量更多。 * **Linux** 。 堆栈溢出以其 Windows 堆栈而闻名,现在他们将更多的 Linux 机器用于 HAProxy,Redis,Bacula,Nagios,日志和路由器。 所有支持功能似乎都由 Linux 处理,这需要开发[并行发布过程](http://blog.serverfault.com/post/1097492931/)。 * **容错**。 现在,堆栈溢出(HTG2)由两个不同 Internet 连接上的两个不同交换机提供服务,它们添加了冗余计算机,并且某些功能已移至另一个数据中心。 * **NoSQL** 。 Redis 现在用作整个网络的[缓存层](http://meta.stackoverflow.com/questions/69164/does-stackoverflow-use-caching-and-if-so-how)。 之前没有单独的缓存层,所以这是一个很大的变化,就像在 Linux 上使用 NoSQL 数据库一样。 不幸的是,我找不到关于我上次遇到的一些未解决问题的报道,例如它们将如何处理这么多不同属性的多租户,但仍然有很多值得学习的地方。 这里汇总了一些不同的来源: ### 统计资料 * 每月 9500 万页面浏览量 * 每秒 800 个 HTTP 请求 * 180 个 DNS 请求每秒 * 每秒 55 兆位 * 1600 万用户-流量向堆栈溢出的流量在 2010 年增长了 131%,达到每月 1,660 万全球唯一身份用户。 ### 数据中心 * 1 个带有 Peak Internet 的机架(或)(托管我们的聊天和数据资源管理器) * 2 个在纽约拥有对等 1 的机架(托管其余的 Stack Exchange Network) ### 硬件 * 10 台 Dell R610 IIS Web 服务器(其中 3 台专用于堆栈溢出): * 1 个 Intel Xeon 处理器 E5640 @ 2.66 GHz 四核,带 8 个线程 * 16 GB RAM * Windows Server 2008 R2 * 2 台 Dell R710 数据库服务器: * 2 个 Intel Xeon 处理器 X5680 @ 3.33 GHz * 64 GB 内存 * 8 锭 * SQL Server 2008 R2 * 2 台 Dell R610 HAProxy 服务器: * 1 个 Intel Xeon 处理器 E5640 @ 2.66 GHz * 4 GB 内存 * Ubuntu 服务器 * 2 台 Dell R610 Redis 服务器: * 2 个 Intel Xeon 处理器 E5640 @ 2.66 GHz * 16 GB RAM * CentOS 的 * 1 台运行 Bacula 的 Dell R610 Linux 备份服务器: * 1 个 Intel Xeon 处理器 E5640 @ 2.66 GHz * 32 GB 内存 * 1 台用于 Nagios 和日志的 Dell R610 Linux 管理服务器: * 1 个 Intel Xeon 处理器 E5640 @ 2.66 GHz * 32 GB 内存 * 2 个 Dell R610 VMWare ESXi 域控制器: * 1 个 Intel Xeon 处理器 E5640 @ 2.66 GHz * 16 GB RAM * 2 个 Linux 路由器 * 5 个 Dell Power Connect 交换机 ### 开发工具 * **C#**:语言 * **Visual Studio 2010 Team Suite** : IDE * **Microsoft ASP.NET(4.0 版)** :框架 * **ASP.NET MVC 3** : Web 框架 * **剃刀** :视图引擎 * **jQuery 1.4.2** :浏览器框架: * **LINQ to SQL,一些原始 SQL** :数据访问层 * **水银和窑** :源代码管理 * **Beyond Compare 3** :比较工具 ### 使用的软件和技术 * 堆栈溢出通过 [BizSpark](http://blog.stackoverflow.com/2009/03/stack-overflow-and-bizspark/) 使用 [WISC](http://stackoverflow.com/questions/177901/what-does-wisc-stack-mean) 堆栈 * **Windows Server 2008 R2 x64** :操作系统 * **运行 **Microsoft Windows Server 2008 Enterprise Edition x64** 的 SQL Server 2008 R2** :数据库 * Ubuntu 服务器 * CentOS 的 * **IIS 7.0** :Web 服务器 * **HAProxy** :用于负载均衡 * **Redis** :用作分布式缓存层。 * **CruiseControl.NET** :用于构建和自动部署 * **Lucene.NET** :进行搜索 * **Bacula** :用于备份 * **Nagios** :(带有 [n2rrd](http://n2rrd.diglinks.com/cgi-bin/trac.fcgi) 和 drraw 插件)用于监视 * **Splunk:**用于日志 * **SQL Monitor:来自 Red Gate 的**-用于 SQL Server 监视 * **绑定**:用于 DNS * **[Rovio](http://www.wowwee.com/en/products/tech/telepresence/rovio/rovio)** :一个小机器人(真正的机器人),允许远程开发人员“虚拟地”访问办公室。 * **Pingdom** :外部监视器和警报服务。 ### 外部钻头 开发工具中未包含的代码: * 验证码 * DotNetOpenId * WMD-现在已开发为开源。 见 github 网络图 * 美化 * 谷歌分析 * 巡航控制.NET * HAProxy * 仙人掌 * 降价锐利 * 美丽 * Nginx 的 * 窑 * CDN:无,所有静态内容均由 [sstatic.net](http://sstatic.net/) 提供,这是一个快速,无 cookie 的域,用于将静态内容传递给 Stack Exchange 系列网站。 ### 开发人员和系统管理员 * 14 个开发人员 * 2 个系统管理员 ### 内容 * **许可:**知识共享署名-相同方式共享份额为 2.5 * **标准:** OpenSearch,Atom * **主持人:** PEAK Internet ### 更多架构和经验教训 * 使用 HAProxy 而不是 Windows NLB,因为 HAProxy 便宜,简单,免费,可通过 Hyper-V 用作网络上的 512MB VM``设备''。 它也可以在盒子前面使用,因此对它们完全透明,并且更容易作为另一个网络层进行故障排除,而不必与所有 Windows 配置混在一起。 * 不使用 CDN 是因为,即使像亚马逊这样的“便宜” CDN 相对于捆绑到现有主机计划中的带宽而言也非常昂贵。 根据 Amazon 的 CDN 费率和带宽使用情况,他们每月至少可以支付 1000 美元。 * 备份到磁盘以进行快速检索,而备份到磁带以进行历史存档。 * SQL Server 中的全文本搜索集成度很差,有故障,非常不称职,因此他们选择了 Lucene。 * 人们对峰值 HTTP 请求数据最感兴趣,因为这是他们确保可以处理的需求。 * 现在,所有属性都在相同的 Stack Exchange 平台上运行。 这意味着堆栈溢出,超级用户,服务器故障,元,WebApp 和元 Web 应用都在同一软件上运行。 * 有单独的 StackExchange 网站,因为人们有不同的专业知识集,不应跨入不同的主题网站。 [您可以成为世界上最伟大的厨师,但这并不意味着您有资格修理服务器。](http://meta.stackoverflow.com/questions/69422/why-separate-stack-exchange-accounts) * 他们积极地缓存一切。 * 通过[输出缓存](http://learn.iis.net/page.aspx/154/walkthrough-iis-70-output-caching/)缓存匿名用户访问(并随后提供给匿名用户)的所有页面。 * 每个站点都有 3 个不同的缓存:本地,站点,全局。 * **本地缓存**:只能从 1 个服务器/站点对访问 * 为了限制网络延迟,他们使用服务器上最近设置/读取的值的本地“ L1”缓存,基本上是 HttpRuntime.Cache。 这会将网络上的高速缓存查找开销减少到 0 字节。 * 包含用户会话和未决视图计数更新之类的内容。 * 它完全驻留在内存中,没有网络或数据库访问权限。 * **网站缓存**:单个网站的任何实例(在任何服务器上)都可以访问 * 大多数缓存的值都在这里,诸如热门问题 ID 列表和用户接受率之类的例子就是很好的例子 * 它驻留在 Redis 中(在一个单独的数据库中,纯粹是为了简化调试) * Redis 是如此之快,以至于缓存查找最慢的部分就是花费的时间在网络上读写字节。 * 将值压缩后再将其发送到 Redis。 它们具有大量的 CPU,并且大多数数据是字符串,因此它们具有很高的压缩率。 * 他们的 Redis 计算机上的 CPU 使用率为 0%。 * **全局缓存**:在所有站点和服务器之间共享 * 收件箱,API 使用配额和其他一些真正的全局信息都在这里 * 它位于 Redis 中(在 DB 0 中,同样也便于调试) * 缓存中的大多数项目会在超时时间(通常为几分钟)后过期,并且永远不会明确删除。 当需要特定的缓存失效时,他们使用 [Redis 消息](http://code.google.com/p/redis/wiki/PublishSubscribe)将删除通知发布到“ L1”缓存。 * 乔尔·斯波斯基(Joel Spolsky)不是 Microsoft 的忠实拥护者,他没有为 Stack Overflow 做出技术决策,并且认为 Microsoft 授权存在舍入错误。 考虑自己已更正 [Hacker News 评论员](http://news.ycombinator.com/item?id=2284900)。 * 他们为 IO 系统[选择了](http://blog.serverfault.com/post/our-storage-decision/) RAID 10 阵列,其中 [Intel X25 固态驱动器](http://www.intel.com/design/flash/nand/extreme/index.htm)。 RAID 阵列缓解了对可靠性的任何担忧,并且与 FusionIO 相比,SSD 驱动器的性能确实很好,且价格便宜得多。 * 他们的 Microsoft 许可的[全船费用](http://news.ycombinator.com/item?id=2285931)约为$ 242K。 由于 Stack Overflow 使用的是 Bizspark,因此他们所支付的价格接近全价,但这是他们所能支付的最高价。 * [英特尔 NIC 正在取代 Broadcom NIC](http://blog.serverfault.com/post/broadcom-die-mutha/) 及其主要生产服务器。 这解决了他们在连接丢失,数据包丢失和 arp 表损坏时遇到的问题。 ## 相关文章 * [此帖子上的黑客新闻主题](http://news.ycombinator.com/item?id=2284900) / [Reddit 主题](http://www.reddit.com/r/programming/comments/fwpik/stackoverflow_scales_using_a_mixture_of_linux_and/) * [项目符号中的堆栈交换体系结构](http://blog.serverfault.com/post/stack-exchanges-architecture-in-bullet-points/) / [HackerNews 线程](http://news.ycombinator.com/item?id=2207789) * [Stack Overflow 的纽约数据中心](http://blog.serverfault.com/post/1432571770/)-各种计算机的硬件是什么? * [设计用于管理和容错的可伸缩性](http://blog.serverfault.com/post/1097492931/) * [堆栈溢出博客](http://blog.stackoverflow.com/) * [堆栈溢出搜索-现在减少了 81%的废话](http://blog.stackoverflow.com/2011/01/stack-overflow-search-now-81-less-crappy/)-Lucene 现在正在未充分利用的集群上运行。 * [2010 年堆栈状态(您的 CEO 的来信)](http://blog.stackoverflow.com/2011/01/state-of-the-stack-2010-a-message-from-your-ceo/) * [堆栈溢出网络配置](http://blog.stackoverflow.com/2010/01/stack-overflow-network-configuration/) * [StackOverflow 是否使用缓存?如果使用缓存,如何使用缓存?](http://meta.stackoverflow.com/questions/69164/does-stackoverflow-use-caching-and-if-so-how) * [Meta StackOverflow](http://meta.stackoverflow.com/) * [StackOverflow 如何处理缓存失效?](http://meta.stackoverflow.com/questions/6435/how-does-stackoverflow-handle-cache-invalidation) * [哪些工具和技术构建了堆栈交换网络?](http://meta.stackoverflow.com/questions/10369/which-tools-and-technologies-build-the-stack-exchange-network) * [堆栈溢出如何处理垃圾邮件?](http://meta.stackoverflow.com/questions/2765/how-does-stack-overflow-handle-spam) * [我们的存储决策](http://blog.serverfault.com/post/our-storage-decision/) * [如何选择“热门”问题?](http://meta.stackoverflow.com/questions/4766/how-are-hot-questions-selected) * [如何选择“相关”问题?](http://meta.stackoverflow.com/questions/20473/how-are-related-questions-selected) -标题,问题正文和标签。 * [堆栈溢出和 DVCS](http://blog.stackoverflow.com/2010/04/stack-overflow-and-dvcs/) -堆栈溢出选择 Mercurial 进行源代码控制。 * [服务器故障聊天室](http://chat.stackexchange.com/rooms/127/the-comms-room) * [C#Redis 客户端](https://github.com/ServiceStack/ServiceStack.Redis) * [Broadcom,Die Mutha](http://blog.serverfault.com/post/broadcom-die-mutha/) 他们是否解释了为什么使用 Redis 而不是 Memcached 进行缓存? 我听说很多人使用 Redis 进行缓存,只是想知道 Redis 做什么,而 Memcached 不会呢? 如果我没记错的话,Redis 不是分布式数据库,对吗? 使用 memcached 时,如果我添加新节点,客户端将自动重新分发缓存,以利用额外的容量。 Redis 不会那样做。 那么,为什么要使用 Redis? > 备份到磁盘以进行快速检索,而备份到磁带以进行历史存档。 真? 人们还在这样做吗? 我知道一些组织在自动化的自动磁带备份上投入了大量资金,但是说真的,一个成立于 2008 年的网站正在备份磁带吗? 为什么有人会在 Linux / Linux 上使用 Windows / asp? 我真的很惊讶人们仍然在做这样的事情。 *为什么有人会在 Linux / Linux 上使用 Windows / asp? 确实让我感到惊讶的是,人们仍然在做这样的事情。* 因为.NET 是目前最好的开发框架之一。 而且用于网络的 linux 便宜,因此结合起来很有意义。 @约翰 使用 Redis 或 membase 之类的东西而不是 memcached 的优点之一是可以将缓存持久化到磁盘上,这样可以避免缓存脱机然后重新启动时出现缓存风暴问题。 我猜我们不知道 Redis 框的配置是什么 他们是分片,进行主/从复制等吗? 安迪 @Joe,如果您知道自己的想法,那么逻辑就很容易:Joel 是 MS Excel 团队的成员,该团队编写了 VBA 和 OLE 自动化。 @Joe-这是我在该网站上看到的最不明智的评论之一。 詹姆斯:备份到磁带意味着脱机/档案备份。 这通常是值得的花费和麻烦,特别是对于大型重要数据集。 一两三周后,我可以告诉您,Gmail 员工非常非常高兴他们备份到磁带上。 如果您的所有副本都在线,则总是存在一个错误或手指滑动同时擦拭它们的可能性。 从技术上讲,IIS 7.0:Web 服务器不正确,在 Windows Server 2008R2 下,它实际上是 IIS 7.5:Web 服务器。 @Sosh-请放轻松,不要提升自己对 Microsoft 产品的支持。 在最好和最新的开源公司及其社区中运行 MS 产品没有技术上的原因。 实际上,要真正推动这一点,StackOverflow 团队应该在各地使用更多*付费/许可*的 ms 产品来推动其发展。 还有一种观点认为,可以针对工作使用最佳工具组合,因此请参见此处。 答案很简单:StackOverflow 团队了解 MS 产品,Visual Studio,C#和.NET,因此(对于该团队而言)交付 StackExchange 系列站点是最便宜,最快的。 ^ M 他们有明确的绩效目标吗? 他们如何在负载下监视站点性能? 对于在 HighScalability.com 上进行介绍的任何网站,这些问题似乎都是重要的问题。 是的,大多数拥有重要数据的人仍然使用磁带。 另外,它们是 Windows,因为创始人是微软的老家伙! **[仅使用更好的应用程序,您可以避免软件许可和网络硬件成本。 伺服器:](http://nbonvin.wordpress.com/2011/03/24/serving-small-static-files-which-server-to-use/ "You can avoid software license AND network hhardware costs by just using a better app. server")** 每秒服务器请求 --------------------------------------------- G-WAN Web 服务器....... 142,000 Lighttpd Web 服务器........ 60,000 Nginx Web 服务器............ 57,000 Varnish 缓存服务器....... 28,000 SQL Server 2008 R2 Standard 或 Enterprise Edition? “现在他们正在为 HAProxy Redis 使用更多的 Linux 计算机,” http://redis.io/clients Windows 上运行的 C#如何与 Linux 上的 Redis 对话?