StackOverFlow架构初探

来源:互联网 发布:数据库0基础教程 编辑:程序博客网 时间:2024/05/21 15:42

 StackOverflow是一个与程序相关的IT技术问答网站,程序员遇到问题很容易在这里找到解决方案。截至2016年5月,StackOverflow已经有470万用户量,超过4000万个回答。数据量如此大的一个网站的架构究竟是怎样的呢?

 

我们先来看一下一些统计的数字(每天):

-      负载均衡器收到的HTTP请求:大于2亿

-      页面加载数量:大于6000万

-      发送的HTTP数据量:1.24TB

-      总共接收的数据量:569GB

-      总共发送的数据量:3.08TB

-      问题页面平均渲染时间:22.71ms

-      首页平均渲染时间:11.80ms

 

从上面的数字可以看出,StackOverflow的数据量和访问量是非常庞大的,但从SQL查询和页面渲染时间来看,访问网站的响应速度是非常快的,这主要归功于StackOverflow高性能的服务器以及对应用内进行大量的性能优化工作。

 

StackOverflow并没有用到很流行的云服务器,如今StackOverflow运行网站所用到的服务器有:

-      4台Microsoft SQL Server服务器

-      11台 IIS Web服务器

-      2台Redis服务器

-      3台标签引擎服务器

-      3台Elasticsearch服务器

-      4台负载均衡服务器

-      2台网络设备

-      2台防火墙

-      4台路由器

 

StackOverflow服务器的架构图如下所示:

 

下面我将以一个用户的身份访问StackOverflow网站,以此对StackOverflow的架构进行说明。

 

首先我从浏览器中输入StackOverflow.com或者点击搜索引擎中的链接来访问,这时候要通过DNS找到网站的IP,从而把请求发送给对应的服务器。那么如何加快查找网站的速度?StackOverflow把这个工作交给第三方的CloudFlare,因为CloudFlare有遍布全球各个角落的DNS服务器。但为了安全问题,StackOverflow还是会保留自己的DNS服务器,以便不时之需。当浏览器找到对应的服务器后,来自StackOverflow的四家网络服务供应商的HTTP流量就会进入StackOverflow的四台路由器中的某一台。StackOverflow使用边界网关协议(BGP协议)来对等处理来自网络供应商的流量,以此对其进行控制,并提供最高效的通路来访问服务。流量通过路由器之后,就来到负载均衡服务器。

 

负载均衡有四台服务器,其中有两台用于支持CloudFlare。负载均衡运行在CentOS 7上,通过HAProxy来实现,并在HAProxy上加入TLS(SSL)安全传输协议。每台负载均衡器都有两套10Gbps的连接,其中一套对应外部网络,一套对应DMZ。负载均衡器通过使用64GB以上的大内存来更有效地处理SSL协议层,这样可以使连接到同一个客户端时可以减少消耗计算资源,因为可以在内存中缓存和重用更多的TLS会话。

 

负载均衡器根据情况将HTTP流量合理分配给11台web服务器,其中9台是主服务器,2台是测试服务器。在Web层中,使用的是IIS8.5、ASP.Net MVC 5.2.3和.Net4.6.1。Web层之后是服务层,同样使用IIS、ASP.Net MVC、.Net以及HTTP.SYS来支持,这一层运行一些内部服务,对生产环境的Web层和其他内部系统提供支持。服务层的两个主要的服务包括:Stack Server,其中运行着基于HTTP.SYS的标签引擎;Providence API,后端提供的API支持。

 

接下来服务层应该需要获取数据库的数据,StackOverflow借用Redis用于L1/L2级别的缓存系统。L1级是HTTP缓存,在web服务器或者其他应用程序中起作用。L2级是当上一级缓存失效之后,通过Redis获取数据。如果L1、L2级都没有命中,才从数据源中获取数据,如数据库查询、API调用等,然后将结果保存到本地缓存和Redis中。

 

StackOverflow使用SQL Server作为单一的数据源,Elastic和Redis中的所有数据都来自SQL Server。StackOverflow拥有两个SQL Server集群,每个集群都有一台主服务器和副本服务器,此外还在科罗拉多还有一台副本服务器。

 

到这里大概就可以向用户的浏览器返回页面和数据了。

 

在StackOverflow中一个很重要的功能就是搜索,而且搜索功能的使用量应该是很庞大和和频繁的,那么StackOverflow怎么为搜索功能提供强有力的支持?StackOverflow在Web层中使用了Elasticsearch 1.4,并实现了超轻量级、高性能的StackExchange.Elastic客户端。ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。使用ElasticSearch代替SQL全文检索的原因在于ElasticSearch的性价比和可扩展性。

 

在推送方面,StackOverflow使用了websocket向用户推送实时的更新内容,比如顶部栏中的通知、投票数、新导航数、新的答案和评论等。websocket比轮询要高效得多,可以使用更少资源来推送更多数据,同时实时性也更高。

 

综上所述,StackOverflow利用服务器的性能以及在性能优化上做了很多很多的工作,才能支撑起这么大的用户量和访问量。所以,StackOverflow大法好 : )

 

参考资料:

-      StackOverflow 这么大,它的架构是怎么样的? http://blog.jobbole.com/98633/

原创粉丝点击