# 堆栈溢出体系结构更新-现在每月有 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)

![](img/23e609ef6f02f2890c78b7ea6bbc2d1c.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 对话？