Stack Overflow 架構解析,其架構既有商業外包服務,也大量采用開源軟件,可以全景式展現當代主流架構的風貌。
Stack Overflow 由 Jeff Atwood 和 Joel Spolsky 這兩個非常著名的 Blogger 在 2008 年創建。
As of April 2014, Stack Overflow has over 4,000,000 registered users[19]and more than 10,000,000 questions,[20]with 10,000,000 questions celebrated[21]in late August 2015. Based on the type oftagsassigned to questions, the top eight most discussed topics on the site are:Java,JavaScript,C#,PHP,Android,jQuery,PythonandHTML。——wiki
總體架構
Stack Overflow 可以分解為八個切面:互聯網、負載均衡、web層、服務層、緩存、推送、搜索、數據庫。
First Rule:Everything is redundant
兩個數據中心:紐約和科羅拉多,冗余且持續備份。其它所有關鍵組件都盡可能貫徹冗余原則。
物理架構
- 4 臺 Microsoft SQL Server 服務器(其中 2 臺使用了新的硬件)
- 11 臺 IIS Web 服務器(新的硬件)
- 2 臺 Redis 服務器(新的硬件)
- 3 臺標簽引擎服務器(其中 2 臺使用了新的硬件)
- 3 臺 Elasticsearch 服務器(同上)
- 4 臺 HAProxy 負載均衡服務器(添加了 2 臺,用于支持 CloudFlare)
- 2 臺網絡設備(Nexus 5596 核心 + 2232TM Fabric Extender,升級到 10Gbps 帶寬)
- 2 臺 Fortinet 800C 防火墻(取代了 Cisco 5525-X ASAs)
- 2 臺 Cisco ASR-1001 路由器(取代了 Cisco 3945 路由器)
- 2 臺 Cisco ASR-1001-x 路由器
邏輯架構
The Internets 互聯網
DNS服務:外包CloudFlare + 自建DNS
其實外包DNS服務應該已經可以滿足服務,不過出于保險起見,還是有一套自建的DNS Server。
看來trust issues 中外一致啊。
Load Balancers 負載均衡
HAProxy 1.5.15 on CentOS 7
支持TLS (SSL)流量。關注HAProxy 1.7,它即將支持HTTP/2。
引入開源架構之后,就必須持續關注、跟進社區的發展動態。
吃著碗里的,看著鍋里的,永遠不能停。
Web Tier Web層
IIS 8.5, ASP.Net MVC 5.2.3, and .Net 4.6.1
Service Tier 服務層
IIS, ASP.Net MVC 5.2.3, .Net 4.6.1, and HTTP.SYS
Cache緩存
Redis
L1級別:HTTP 緩存
L2級別:L1級別緩存失敗之后,通過Redis獲取數據
L1&L2都是無法命中的情況下,會從數據庫查詢,并更新到緩存和Redis。
緩存更新:基于發布/訂閱模型,利用這個機制來清除其他服務上的 L1 緩存,用來保持 web 服務器上的緩存一致性。
另外Redis實例的CPU都很低,不到2%,這點很驚人。
Push推送
開源庫:NetGrain
使用 websocket 向用戶推送實時的更新內容,比如頂部欄中的通知、投票數、新導航數、新的答案和評論。在高峰時刻,大約有 50 萬個并發的 websocket 連接,這可是一大堆瀏覽器。
一個有趣的事實:其中一些瀏覽器已經打開超過 18 個月了。Someone should go check if those developers are still alive!!
問題:臨時端口、負載均衡上的文件句柄耗盡,都是非常有趣的問題,我們稍后會提到它們。
Search搜索
Elasticsearch集群,每個ES集群都有3個Node
什么不用Solr?我們需要在整個網絡中進行搜索(同時有多個索引),在我們進行決策的時候 Solr 還不支持這種場景。
還沒有使用 2.x 版本的原因,是因為2.x 版本中類型(types)有了很大的變化,這意味著想要升級的話我們得重新索引所有內容。
沒有足夠的時間來制定需求變更和遷移的計劃。
Database數據庫
SQLServer
Our usage of SQL is pretty simple. Simple is fast.
數據庫中只有一個存儲過程,而且我打算把這個最后殘留的存儲過程也干掉,換成代碼。
監控系統
Opserver:輕量級監控系統,基于 asp.net MVC 框架,可監控:
Servers
SQL clusters/instances
redis
elastic search
exception logs
haproxy