(转)Stack Overflow 2016最新架构探秘

这篇文章主要揭秘 Stack Overflow 截止到 2016 年的技术架构。

  首先给出一个直观的数据,让大家有个初步的印象。

  相比于 2013 年 11 月,Stack Overflow 在 2016 年 02 月统计数据有较大变化,下面给出 2016 年 02 月 09 号一天的数据,如下:

  • HTTP 请求数 209,420,973 (+61,336,090)
  • 网页加载次数 66,294,789 (+30,199,477)
  • HTTP 流量发送有1,240,266,346,053 (+406,273,363,426) 字节 (1.24 TB)
  • 接收数据总量 569,449,470,023 (+282,874,825,991) 字节(569 GB)
  • 发送数据总量3,084,303,599,266 (+1,958,311,041,954) 字节 (3.08 TB)
  • SQL 查询数(HTTP 请求)504,816,843 (+170,244,740)
  • Redis 命中数5,831,683,114 (+5,418,818,063)
  • Elastic 查询次数 17,158,874 (未计入 2013 年的数据)
  • 标签引擎请求次数3,661,134 (+57,716)
  • SQL 查询耗时 607,073,066 (+48,848,481) 毫秒 (168 小时)
  • Redis 命中耗时 10,396,073 (-88,950,843) 毫秒 (2.8 小时)

  你很难想象到 .NET 技术架构能够在每天 6100 万请求的情况下减少 757 小时的处理时间(相比于 2013 年)。这些改善既得益于2015 年早期的硬件设备升级,也跟软件的性能优化有极大的关系。

  那么最近两年在硬件上有什么变化呢?以下为截止到目前为止的硬件列表:

  • 4 台数据库服务器(微软 SQL Server),其中两台更新硬件配置
  • 11 台 Web 服务器(IIS),都已更新硬件配置
  • 2 台分布式缓存和消息处理服务器(Redis),都已更新硬件配置
  • 3 台应用服务器(实现了 tag 引擎功能),其中两台为新硬件配置
  • 3 台搜索服务器(ElasticSearch),配置同 2013 年
  • 4 台负载均衡服务器(HAProxy),其中新增加的两台用于支持 CloudFlare 的 CDN 加速服务
  • 2 台网络交换机(每个都是 Cisco Nexus 5596 + Fabric Extenders,并升级网卡 10Gbps)2 台 Fortinet 800C(替代 2 台 Cisco 5525-X ASA 防火墙)
  • 2 台 Ciso ASR-1001 路由器(替代 2 台 Cisco 3945 路由器)
  • 2 台 Ciso ASR-1001-x 路由器

  为了支撑 Stack Overflow 运行,那需要做点什么呢?其实跟 2013 年相比并没有什么显著变化,只是做了前面提到的硬件升级和程序的性能优化。

  现有系统一般都不会完全隔离开来,Stack Overflow 也不列外。一图胜千言,下面给出 Stack Overflow 的整体架构效果图。本篇文章仅给出硬件整理的逻辑架构的亮点,具体的硬件细节部分将在下一篇文章详细介绍。

  图 1 是机架A(在 2015 年 2 月升级的)的实物图片展示。

图1

  现在来给出主要系统的逻辑架构图,如图2。

图2

  基本规则

  首先给出全局的通用规则

  • 万事需要备份
  • 所有服务器和网络交换机要至少 2 x 10Gbps 带宽
  • 所有服务器配备两个电源(带有 UPS 电源备用)
  • 所有服务器在机架A和B上互为冗余
  • 所有服务器和服务都有异地双活(纽约机房和科罗拉多州机房)

  网络服务

  首先,用户去 Stack Overflow 网站浏览就要通过 Internet。为了让用户浏览网站的速度更快 Stack Overflow 采用 CloudFlare 的 CDN 加速。这里使用 CloudFlare 服务是因为它们的 CDN 服务器遍布全球。

  紧接着,用户的 HTTP 流量通过四大 ISP 提供商(Level 3,Zayo,Cogent 和 Lighttower),经过四台路由器。Stack Overflow 通过标准的边界网关协议(BGP)来均衡所有的流量以便用户更有效率的打开网站。Stack Overflow 的工程师 Nick Craver 建议在两个异地数据中心采用一个 10 Gbps MPLS,这样在出现突发情况下可以快速的恢复和复制数据。

  负载均衡(HAProxy)

  负载均衡使用的 HAProxy 1.5.15 和 CentOS 7,并在 HAProxy 加入安全传输层协议(TLS/SSL)。后续会升级 HAProxy 到 1.6 版本来支持 HTTP/2。

  负载均衡器配备 2 对 10Gbps 网络。Stack Overflow 通过加内存来有效的解决安全套接层(SSL)问题。缓存安全传输层协议(TLS)会话到内存加以重复使用,这样可以减少对于同一台客户端连接的重复计算,到达提升会话的速度和成本。况且 RAM 相当便宜,实现了双赢的效果。

  负载均衡器的设置是相当的简单。它们监听各路 IPs,并进行路由分发。Stack Overflow 还做了负载均衡限流和监控 HAProxy 的日志做到及时报警。

  Web 层架构(IIS 8.5,ASP.Net MVC 5.2.3,和 .Net 4.6.1)

  Stack Overflow 经过负载均衡层导入流量到 9 台 Web 服务器(“primary”服务器),另外两台做网站元数据等环境管理。除 meta.stackoverflow.com 和 meta.stackexchange.com 外,Stack Overflow、Careers 和 Stack Exchange 网站业务都在“primary”服务器运行。

  在监控平台 Opserver 上可以看到,Stack Overflow 在 Web 层的分布,见图3

  图3

  更直观的看下对应的 web 服务器的图形展示,见图4

图4

  服务层(IIS,ASP.Net MVC 5.2.3, Net 4.6.1 和 HTTP.SYS)

  在整体逻辑架构图上可以清晰的看到,紧挨着 Web 层的是服务层(部署在 Window 服务器 Windows 2012R2 上)。其有两个重要的功能:tag 应用服务器(基于 http.sys)和 API(基于 IIS)。为了提升这两个服务做了非常多的冗余,但不超过 9 倍的冗余。举个列子,从数据库加载所有的网页和对应的 tags 变化(每n分钟(当前设置为 2 分钟))是非常耗时的。这里只需要加载三次即可保证安全。Stack Overflow 也同时在硬件层做了相关的优化。Tag 应用服务是一个比较复杂的 topic,这里简单说下,当你访问/questions/tagged/java 就使用 tag 应用服务。还有所有/search 和导航也都是用的这些数据服务。

  缓存&发布/订阅(Redis)

  Stack Overflow 在缓存层用 Redis,Redis 服务器 256GB 内存,采用 master/slave 结构部署,尽管每个月 16000 万的 ops,每个实例的 CPU 使用率也在2% 之下。

图5

  Redis 所在服务器有 L1/L2 高速缓存,Web 服务的 HTTP 缓存设置在一级缓存 L1 中,Redis 缓存在二级缓存 L2。当用户访问在一级缓存 L1 中未命中后会去二级缓存中的 Redis 取值,这些值以 Protobuf 格式存储,并以 protobuf-dot-net 解析。Redis 客户使用的 StackExchange.Redis(Stack Overflow 内部实现并开源了)。如果 web 服务在 L1 和 L2 两级缓存都未命中,则会直接去原始数据源获取(比如,数据库查询,API 回调等),然后并把获取到的结果缓存到本地和 Redis 中,这时其它服务未命中 L1 高速缓存便会去二级缓存 L2/Redis 中获取,节省了调用数据库查询或者 API 回调的访问时间。

  大部分运行的问答网站都有自己的 L1/L2 高速缓存,通过 L1 缓存 Key 前缀、L2/Redis 缓存数据库 ID。

  尽管 Redis 主要是用来缓存,但也起到一个消费和订阅的功能,Redis 可以推送一个消息,然后其他订阅者来订阅消息(包括下游的 Redis 从库在订阅消息)。

  Websockets (NetGain)

  Websockets 实时的推送消息(比如,顶栏的通知,投票,新的答案和评论)给用户。

  Sockets 服务器运行在 web 层,NetGain 是 Stack Overflow 实现的一个轻量级高性能实时的开源消息中间件。高峰期可达到 50 万并发的 websocket 连接。

  下图展示的是一周 websocket 并发情况:

图6

  Search (Elasticsearch)

  Stack Overflow 的工程师 Nick Craver 表示搜索层并没有激动人心的部分。在 web 层采用 Elasticsearch 1.4,并内部实现了高性能的 StackExchange.Elastic 客户端,此部分代码未开源。Stack Overflow 使用 Elastic 来查询相关的问答。

  每个数据中心都有一个 Elasticsearch 集群,包含三个节点,每个都建有自己的索引。三个 Elasticsearch 集群全部使用 SSD 存储,192GB 内存和双 10Gbps 网卡。

  Stack Overflow 使用 Elasticsearch 代替先前的 SQL 全排索引,主要因素是:Elasticsearch 的扩展性和低成本。

  数据库(SQL Server)

  SQL Server 是 Stack Overflow 唯一的源数据库,所有 Elastic 和 Redis 的数据都来自 SQL Server。使用微软的 SQL Server 监控组件 AlwaysOn Availability Groups 部署了两个 SQL Server 集群。每个集群有一个主库,一个数据备份在纽约,另一个数据备份在 Colorrado 数据中心。所有备份是异步复制。

  第一个集群硬件配置:Dell R720xd 服务器,384G 内存,4TB SSD 存储,双 12 核 CPU;第二个集群硬件配置:Dell R730xd 服务器,768G 内存,4TB SSD 存储,双 8 核 CPU。

  所有数据库过去 24 小时 CPU 监控图如图 7 所示,大部分情况 CPU 使用率较低,偶尔做下缓存任务时会高些。图中 NY-SQL02 和 04 是主库,01 和 03 是备份库。

图7

  纵观全文,Stack Overflow 整体架构并没有采用那些非常高端的技术,却造就了一个 IT 界最受欢迎的问答网站之,这是非常不错的。其中每项使用到的技术都进行了深入的研究并开源分享给社区,国内的公司可以从中获得一些启发

时间: 2024-12-11 01:22:32

(转)Stack Overflow 2016最新架构探秘的相关文章

Stack Overflow 2016最新架构探秘

这篇文章主要揭秘 Stack Overflow 截止到 2016 年的技术架构. 首先给出一个直观的数据,让大家有个初步的印象. 相比于 2013 年 11 月,Stack Overflow 在 2016 年 02 月统计数据有较大变化,下面给出 2016 年 02 月 09 号一天的数据,如下: HTTP 请求数 209,420,973 (+61,336,090) 网页加载次数 66,294,789 (+30,199,477) HTTP 流量发送有1,240,266,346,053 (+406

轉:StackOverflow2016最新架构探秘

轉載:http://www.infoq.com/cn/news/2016/03/Stack-Overflow-architecture-insi?utm_source=tuicool&utm_medium=referral 首先给出一个直观的数据,让大家有个初步的印象. 相比于2013年11月,Stack Overflow在2016年02月统计数据有较大变化,下面给出2016年02月09号一天的数据,如下: HTTP请求数209,420,973 (+61,336,090) 网页加载次数 66,2

Stack Overflow 架构

意料之中,也是意料之外,Stack Overflow仍然重度使用着微软的产品.他们认为既然微软的基础设施可以满足需求,又足够便宜,那么没有什么理由去做根本上的改变.而在需要的地方,他们同样使用了Linux.究其根本,一切都是为了性能. 另一个值得关注的地方是,Stack Overflow仍然使用着纵向扩展策略,没有使用云.他们使用了384GB的内存和2TB的SSD来支撑SQL Servers,如果使用AWS的话,花费可想而知.没有使用云的另一个原因是Stack Overflow认为云会一定程度上

2016最新马哥Linux就业班+架构师班视频教程全套含随堂笔记PPT 全套资料免费分享

有朋友咨询问我是不是做营销的? 不是,不是,不是!!! 这么认为的话,干嘛还来咨询呢? 直接发我个邮件,附上你手里的最新教程分享链接,我一定回复. 不相信,解释再多也没用... 本人是一名运维工程师,主要做Linux和数据库运维工作.非常喜欢收集.整理.分享一些质量优质的IT技术教程.马哥Linux在业界可谓是名气响当当的,很多做系统运维的朋友或是刚入行的菜鸟视之为Linux教育界的教父,都趋之若鹜. 本人也不例外,我就是在2013.2014年平靠学习马哥那个套经典的运维教程走上linux运维之

Stack Overflow: The Architecture - 2016 Edition

To get an idea of what all of this stuff “does,” let me start off with an update on the average day at Stack Overflow. So you can compare to theprevious numbers from November 2013, here’s a day of statistics from February 9th, 2016 with differences s

转:Stack Overflow通过关注性能,实现单块应用架构的扩展能力

原文来自于:http://www.infoq.com/cn/news/2015/07/scaling-stack-overflow 在New York QCon 2015大会上,David Fullerton 深入解析了如何使用C#/ MS SQL支撑Stack Overflow网站的单块应用架构,这个网站每月处理40多亿的用户请求.Fullerton 认为,关注性能就可以几乎免费地使网站具备应付高并发的扩展能力:同时,通过减少对外部服务的调用,SOA开销(SOA tax) 得以避免. Full

为什么开发者热衷在Stack Overflow上查阅API文档?

摘要:一项新研究跟踪了Android开发者的访问历史,发现开发者多达二分之一的文档是从Stack Overflow上获取到的,而Stack Overflow上的示例也多于官方指南,开发者通过搜索更多时候是去访问Stack Overflow上的问题讨论而不是访问官方文档.那么,为什么开发者热衷在Stack Overflow上查看API文档呢? 微软等软件公司为API.服务和软件平台等主题创建数以百万计的文档,创建软件文档费时费力,然而却越来越不讨好,因为软件开发者对这些枯燥的文字日益失去兴趣.如果

【转】Stack Overflow研发副总裁:.NET技术并不差,合适自己就好

整个网站架构有很好的并发处理能力.我们每月处理40亿次请求,峰值为每秒3000次,每天有8亿次SQL查询,峰值为每秒8500次.https://www.sdk.cn/news/2378 摘要:在QCon纽约大会上, Stack Exchange的工程部副总裁David Fullerton深入解析了如何使用C#.MS SQL等技术支撑Stack Overflow网站的单块应用架构,这个网站每月约有40亿的用户请求. 在QCon纽约大会上, Stack Exchange的工程部副总裁David Fu

log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析

注:下文中的"桥接"."转调"."绑定"等词基本都是同一个概念. log4j-over-slf4j和slf4j-log4j12是跟java日志系统相关的两个jar包,当它们同时出现在classpath下时,就可能会引起堆栈溢出异常.异常信息大致如下(摘自slf4j官网文档Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting St