Stack Exchange的系統架構
Stack Overflow是我最喜歡的問答網站,沒有之一,原因是它能解決我學習程序過程中遇到的大多數問題,而 Quora 和 知乎更多的是拓展我的視野。(不要和我提百度知道,百度知道是小學生用來做暑假作業的!)
目前Stack Overflow每月不重復的訪問用戶超過1600萬;每月網頁瀏覽量(PV)增長了近6倍,達到9500萬。已經發展壯大成了 Stack Exchange Network,而這個網絡包括Stack Overflow、Server Fault和Super User等,旗下總共擁有43個網站,而且發展勢頭良好。
Stack Overflow的變化翻天覆地,而不變的是他們開放的心態,所以才有了這篇架構分享的文章。最近,他們寫了一系列文章分享他們如何應對這樣的快速增長。
Stack Exchange’s Architecture in Bullet Points
Stack Overflow’s New York Data Center
Designing For Scalability of Management and Fault Tolerance
Stack Overflow Search ― Now 81% Less
Stack Overflow Network Configuration
Does StackOverflow use caching and if so, how?
Which tools and technologies build the Stack Exchange Network?
(期待后面有時間把上面提到的文章都翻譯一遍)
在過去的一段時間里,Stack Exchange到底發生了哪些明顯的變化呢?
更多:更多的用戶,更多的PV,更多的數據中心,更多的站點,更多的開發者,更多的操作系統,更多的數據庫,更多的服務器…更多…
Linux:Stack Overflow因使用Windows系統而著稱,現在他們使用越來越多的Linux服務器,比如HAProxy(負載均衡), Redis(NoSQL數據庫),Bacula(數據備份系統),Nagios(遠程監控軟件),日志,路由器都運行于Linux系統,幾乎所有需要并行處理的功能都是由Linux處理。
容錯:Stack Overflow目前為兩條不同的線路使用了兩個不同的交換機,增加了更多的冗余服務器,將一些網站服務運行于第二個數據中心。
NoSQL:Redis作為整個網站的緩存層。這是一個巨大的改變,以前并沒有將緩存作為一個獨立的層分離出來。Redis是一個運行于Linux的NoSQL數據庫。
遺憾的是,一些我關注的問題并沒有從中找到答案,比如面對這么多不同的系統,如何解決多租戶的問題(Multi-tenancy 是一種軟件體系結構,在這種體系結構中軟件運行在 software as a service 服務商的服務器上,服務于多個客戶組織即 tenant)。但是,從中我們依然可以學到很多。下面是收集的一些數據列表:
統計信息
每月9500萬次瀏覽量
每秒800個HTTP請求
每秒180個DNS請求
每秒55M流量
1600萬個用戶(Stack Overflow的流量在2010年增長了131%,全球每月不重復訪客增至1660萬人)。
數據中心
1個機架放在俄勒岡州的Peak Internet(用于放置chat和Data Explorer)
2個機架放在紐約州的Peer 1(用于放置Stack Exchange Network的其余部分)
硬件設備
10臺戴爾R610 IIS Web服務器(3臺專門用于Stack Overflow):1個英特爾至強處理器E5640,2.66 GHz四核,8線程;16 GB內存;Windows Server 2008 R2
2臺戴爾R710數據庫服務器:2個英特爾至強處理器X5680,3.33 GHz;64 GB內存;8個硬盤;SQL Server 2008 R2
2臺戴爾R610 HAProxy服務器:1個英特爾至強處理器E5640,2.66 GHz;4 GB內存;Ubuntu Server
2臺戴爾R610 Redis服務器:2個英特爾至強處理器E5640,2.66 GHz;16 GB內存;CentOS
1臺戴爾R610 Linux備份服務器,運行Bacula:1個英特爾至強處理器E5640,2.66 GHz;32 GB內存
1臺戴爾R610 Linux管理服務器,用于Nagios和日志:1個英特爾至強處理器E5640,2.66 GHz;32 GB內存
2個戴爾R610 VMWare ESXi域控制器:1個英特爾至強處理器E5640,2.66 GHz;16 GB內存;2只Linux路由器;5臺戴爾Power Connect交換機
開發工具
編程語言:C#(ASP.NET)
集成開發環境(IDE):Visual Studio 2010 Team Suite
開發框架:Microsoft ASP.NET Framework 4.0
Web框架:ASP.NET MVC 3
視圖引擎:Razor
瀏覽器框架:jQuery 1.4.2
數據訪問層:LINQ to SQL,一些原始SQL
源碼控制:Mercurial和Kiln
比較工具:Beyond Compare 3
軟件與技術
堆棧技術:BizSpark 的WISC
操作系統:Windows Server 2008 R2 x64,Ubuntu Server,CentOS
數據庫:運行于Microsoft Windows Server 2008 Enterprise Edition x64 的SQL Server 2008 R2
WEB服務器:IIS7.0
負載均衡:HAProxy
緩存技術: Redis(分布式緩存)
代碼部署:CruiseControl.NET
搜索系統:Lucene.NET
備份系統:Bacula
監控系統:Nagios (使用 n2rrd 和 drraw 插件)
日志分析:Splunk
SQL Server監控:SQL Monitor from Red Gate
DNS解析:Bind
遠程控制:Rovio
外部監控:Pingdom
外部組件(一些沒有包含在開發工具中的代碼)
reCAPTCHA
DotNetOpenId
WMD - Now developed as open source. See github network graph
Prettify
Google Analytics
Cruise Control .NET
HAProxy
Cacti
MarkdownSharp
Flot
Nginx
Kiln
CDN: 沒有使用,所有靜態內容從sstatic.net來提供,這個快速的、無cookie的域用于將靜態內容分發到Stack Exchange系列網站。
開發人員和系統管理員
14名開發人員
2名系統管理員
內容
License: Creative Commons Attribution-Share Alike 2.5 Generic
Standards: OpenSearch, Atom
Host: PEAK Internet
更多可以學習的架構知識
使用HAProxy替代Windows NLB 的原因是:HAProxy成本低廉、易于使用,還是免費的;而且通過Hyper-V,很適合作為網絡上的一個512M虛擬機“設備”。它還在服務器的前端工作,所以對服務器來說完全透明;而且作為不同的網絡層,更容易排除故障,而不是與你的所有窗口配置混雜在一起。
沒有使用CDN,因為與捆綁在現有主機方案中的帶寬相比,連亞馬遜CDN這樣“便宜的”CDN其費用都非常昂貴。按照亞馬遜的CDN費率和Stack Overflow的帶寬使用量,每月至少要付1000美元。
備份到磁盤上,便于快速恢復;備份到磁道(tape)上,便于歷史歸檔。
SQL Server的全文搜索機制集成度差,問題多,功能弱,所以改用了Lucene。
最感興趣的是HTTP請求峰值,因為他們需要確保可以處理的過來。
所有站點都運行在Stack Exchange平臺上。Stack Overflow、Super User、Server Fault、Meta、WebApps和Meta Web Apps都運行相同的軟件。
給StackExchange的用戶進行區分是因為擁有不同專業技能的人不適合不同主題的站點。你也許是世界上最出色的大廚,但并不是說你就有能力修復服務器。
盡量把一切都放到緩存中。
所有匿名用戶可以訪問的頁面都使用緩存輸出緩存輸出給用戶。
每個站點有三種不同的緩存:本地緩存、站點緩存和全局緩存。
緩存中的大部分項目在超時(通常是幾分鐘)后過期,但從來不被明確刪除。當宣布某個特定的緩存項目無效時,他們使用Redis messaging消息傳遞機制,向“一級”緩存發布刪除通知。
Joel Spolsky不是微軟的忠實粉絲,他并不為Stack Overflow做出技術決策,他認為微軟的協議是存在問題。需要你自己去考慮Hacker News commentor。
Stack Overflow為自己的輸入/輸出系統選擇了英特爾X25固態硬盤組成的RAID 10陣列。這個RAID陣列消除了可靠性方面的任何問題;與FusionIO相比,固態硬盤的性能確實很好,而價格又便宜得多。
微軟許可證的總標價約為24.2萬美元。由于Stack Overflow使用Bizspark,所以沒在支付總標價,但他們能付的最多也就這么多。
英特爾網卡取代了博通網卡。這解決了他們之前面臨的問題:連接中斷、數據包丟失和地址解析協議(ARP)表損壞。
緩存信息
上面提到了Stack Exchange每個站點有三種不同的緩存:本地緩存、站點緩存和全局緩存。線面就來看看每個緩存的作用。
本地緩存:只能通過1對服務器/站點來訪問。
為了限制網絡延遲時間,Stack Overflow使用了本地“一級”緩存(基本上是HttpRuntime.Cache),緩存服務器上最近設定/讀取的值。這樣就可以把網絡上的緩存查找開銷減小至0字節。
緩存里面含有用戶會話和等待的視圖數更新等內容。
緩存完全駐留在內存中,沒有網絡或數據庫訪問。
站點緩存:可以由一個站點(任何服務器上)的任何實例來訪問。
大部分緩存的值進入到這里,熱點問題ID列表和用戶驗收率就是兩個典例。
緩存駐留在Redis(位于不同的數據庫,純粹為了易于調試)。
Redis的速度很快,緩存查找中速度最慢的部分就是讀取字節并寫到網絡上。
值被發送到Redis之前先進行壓縮。Stack Overflow有許多處理器,大部分數據是字符串,所以得到的壓縮比很高。
Redis機器上的處理器使用率為0%。
全局緩存:全局緩存被所有站點和服務器共享。
緩存內容包括收件箱、API使用限額和另外幾項真正全局的內容。
緩存駐留在Redis中(位于數據庫0,同樣為了易于調試)。
本文由用戶
jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!