Stack Overflow架構(gòu)揭秘(軟硬件、人員、數(shù)字)
原創(chuàng)【51CTO精選譯文】編者按:開發(fā)人員和社區(qū)類產(chǎn)品/運營工作者應該對Stack Overflow十分熟悉:這是IT界最受歡迎的問答網(wǎng)站之一。隨著Stack Overflow越來越火,該網(wǎng)站在最近幾年也對自身的架構(gòu)進行了大量的擴展優(yōu)化。本文作者對Stack Overflow這幾年的架構(gòu)變遷進行了揭秘。
自從本人在2009年寫了關于Stack Overflow 架構(gòu)的第一篇文章后,該架構(gòu)已發(fā)生了很大的變化。那篇文章主要介紹了Stack Overflow采取的向上擴展(scale-up)策略,而Stack Overflow在最近幾年得到了全面發(fā)展。
Stack Overflow取得了長足發(fā)展:規(guī)模擴大了一倍多,每月不重復的訪問用戶超過1600萬;每月網(wǎng)頁瀏覽量(PV)增長了近6倍,達到9500萬。
Stack Overflow發(fā)展壯大成了 Stack Exchange Network,而這個網(wǎng)絡包括Stack Overflow、Server Fault和Super User等,旗下總共擁有43個網(wǎng)站,而且發(fā)展勢頭良好。
但不變的是Stack Overflow在其所作所為方面堅持的開放理念,而這才有了今天這篇文章。最近的一連串帖子主要介紹了Stack Overflow在如何應對增長:《Stack Exchange的架構(gòu)要點介紹》、《Stack Overflow的紐約數(shù)據(jù)中心》、《為確保管理和容錯的高擴展性而設計》、《Stack Overflow搜索——現(xiàn)在時間縮短了81%》、《Stack Overflow網(wǎng)絡配置》、《Stack Overflow使用緩存嗎?如果使用,怎么使用?》和《哪些工具和技術構(gòu)建了Stack Exchange Network?》等。(51CTO編輯注:以上文章均為英文。)
這幾年來比較明顯的一些變化如下:
◆數(shù)量更多:更多的用戶、更多的PV、更多的數(shù)據(jù)中心、更多的站點、更多的開發(fā)人員、更多的操作系統(tǒng)、更多的數(shù)據(jù)庫、更多的機器。
◆Linux:Stack Overflow因使用Windows系列產(chǎn)品而著稱,現(xiàn)在他們使用越來越多的Linux機器,用于HAProxy、Redis、Bacula、Nagios、日志和路由器等系統(tǒng)。所有支持功能似乎都由Linux來處理,這就需要開發(fā)并行版本發(fā)行流程。
◆容錯:現(xiàn)在為Stack Overflow提供服務的是使用兩條不同互聯(lián)網(wǎng)連接的兩只不同交換機,Stack Overflow添加了冗余機器,一些功能已搬遷到第二個數(shù)據(jù)中心。
◆NoSQL:Redis現(xiàn)用作整個網(wǎng)絡的緩存層。以前沒有獨立的緩存層,所以這是一大變化,使用基于Linux的NoSQL數(shù)據(jù)庫也是一大變化。
遺憾的是,我沒有找到哪些帖子在介紹我上次提出的一些開放問題,比如Stack Overflow如何處理有著眾多不同屬性的多租戶架構(gòu),不過我們還是可以從許多方面來了解。下面是收集的一些信息:
統(tǒng)計數(shù)字
◆每月網(wǎng)頁瀏覽量9500萬次
◆每秒800個HTTP請求
◆每秒180個DNS請求
◆每秒55兆位
◆1600萬個用戶——Stack Overflow的流量在2010年增長了131%,全球每月不重復訪客增至1660萬人。
數(shù)據(jù)中心
◆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內(nèi)存
◆Windows Server 2008 R2
◆2臺戴爾R710數(shù)據(jù)庫服務器:
◆2個英特爾至強處理器X5680,3.33 GHz
◆64 GB內(nèi)存
◆8個硬盤
◆SQL Server 2008 R2
◆2臺戴爾R610 HAProxy服務器:
◆1個英特爾至強處理器E5640,2.66 GHz
◆4 GB內(nèi)存
◆Ubuntu Server
◆2臺戴爾R610 Redis服務器:
◆2個英特爾至強處理器E5640,2.66 GHz
◆16 GB內(nèi)存
◆CentOS
◆1臺戴爾R610 Linux備份服務器,運行Bacula:
◆1個英特爾至強處理器E5640,2.66 GHz
◆32 GB內(nèi)存
◆1臺戴爾R610 Linux管理服務器,用于Nagios和日志:
◆1個英特爾至強處理器E5640,2.66 GHz
◆32 GB內(nèi)存
◆2個戴爾R610 VMWare ESXi域控制器:
◆1個英特爾至強處理器E5640,2.66 GHz
◆16 GB內(nèi)存
◆2只Linux路由器
◆5只戴爾Power Connect交換機
開發(fā)工具
◆編程語言:C#
◆集成開發(fā)環(huán)境(IDE):Visual Studio 2010團隊套件
◆框架:微軟ASP.NET(版本4.0)
◆Web框架:ASP.NET MVC 3
◆視圖引擎:Razor
◆瀏覽器框架:jQuery 1.4.2
◆數(shù)據(jù)訪問層:LINQ to SQL,一些原始SQL
◆源碼控制:Mercurial和Kiln
◆比較工具:Beyond Compare 3
使用的軟件和技術
◆Stack Overflow通過BizSpark,使用WISC堆棧
◆操作系統(tǒng):Windows Server 2008 R2 x64
◆數(shù)據(jù)庫:運行微軟Windows Server 2008企業(yè)版x64的SQL Server 2008 R2
◆Web 服務器:IIS 7.0
◆HAProxy:用于負載均衡
◆Redis:用作分布式緩存層
◆CruiseControl.NET:用于代碼構(gòu)建和自動化部署
◆Lucene.NET:用于搜索
◆Bacula:用于備份
◆Nagios:(n2rrd和drraw插件)用于監(jiān)控
◆Splunk:用于日志
◆SQL Monitor:Red Gate公司提供,用于SQL Server監(jiān)控
◆Bind:用于DNS
◆Rovio:一個小巧的機器人(真正的機器人),讓遠程開發(fā)人員可以通過“虛擬方式”訪問辦公室。
◆Pingdom:外部監(jiān)控和警報服務網(wǎng)站
#p#
外部組件
不是作為開發(fā)工具一部分而包括的代碼:
◆reCAPTCHA
◆DotNetOpenId
◆WMD——現(xiàn)在作為開源而開發(fā)。詳見github網(wǎng)絡圖
◆Prettify
◆Google Analytics
◆Cruise Control .NET
◆HAProxy
◆Cacti
◆MarkdownSharp
◆Flot
◆Nginx
◆Kiln
◆內(nèi)容分發(fā)網(wǎng)絡(CDN):無,所有靜態(tài)內(nèi)容從sstatic.net來提供,這個快速的、無cookie的域用于將靜態(tài)內(nèi)容分發(fā)到Stack Exchange系列網(wǎng)站。
開發(fā)人員和系統(tǒng)管理員
◆14名開發(fā)人員
◆2名系統(tǒng)管理員
內(nèi)容
◆許可證:Creative Commons Attribution-Share Alike 2.5 Generic
◆標準:OpenSearch,Atom
◆主機:PEAK Internet
架構(gòu)的更多信息和汲取的經(jīng)驗
◆使用了Proxy,而不是使用Windows網(wǎng)絡負載均衡(NLB),因為HAProxy成本低廉、易于使用,還是免費的;而且通過Hyper-V,很適合作為網(wǎng)絡上的一個512M虛擬機“設備”。它還在服務器的前端工作,所以對服務器來說完全透明;而且作為不同的網(wǎng)絡層,更容易排除故障,而不是與你的所有窗口配置混雜在一起。
◆沒有使用CDN,因為與捆綁在現(xiàn)有主機方案中的帶寬相比,連亞馬遜CDN這樣“便宜的”CDN其費用都非常昂貴。按照亞馬遜的CDN費率和Stack Overflow的帶寬使用量,每月至少要付1000美元。
◆備份到磁盤上,便于快速恢復;備份到磁帶上,便于歷史歸檔。
◆SQL Server的全文搜索機制集成度非常差,問題多多,功能很弱,所以Stack Overflow改用了Lucene。
◆最受關注的是峰值HTTP請求數(shù)字,因為這正是他們需要確保能處理的方面。
◆所有屬性如今都在同一個Stack Exchange平臺上運行。那意味著Stack Overflow、Super User、Server Fault、Meta、WebApps和Meta Web Apps都在同一個軟件上運行。
◆有一些獨立的StackExchange站點,因為人們擁有不同的專業(yè)技能,這些技能并不適用于不同的主題站點。你也許是世界上最出色的大廚,但并不是說你就有能力修復服務器。
◆Stack Overflow盡量把一切都放到緩存中。
◆匿名用戶訪問的所有頁面通過輸出緩存(Output Caching)放到緩存中,隨后提供給匿名用戶。
◆每個站點有三種不同的緩存:本地緩存、站點緩存和全局緩存。
◆本地緩存:只能通過1對服務器/站點來訪問。
◆為了限制網(wǎng)絡延遲時間,Stack Overflow使用了本地“一級”緩存(基本上是HttpRuntime.Cache),緩存服務器上最近設定/讀取的值。這樣就可以把網(wǎng)絡上的緩存查找開銷減小至0字節(jié)。
◆緩存里面含有用戶會話和等待的視圖數(shù)更新等內(nèi)容。
◆緩存完全駐留在內(nèi)存中,沒有網(wǎng)絡或數(shù)據(jù)庫訪問。
◆站點緩存:可以由一個站點(任何服務器上)的任何實例來訪問。
◆大部分緩存的值進入到這里,熱點問題ID列表和用戶驗收率就是兩個典例。
◆緩存駐留在Redis(位于不同的數(shù)據(jù)庫,純粹為了易于調(diào)試)。
◆Redis的速度很快,緩存查找中速度最慢的部分就是讀取字節(jié)并寫到網(wǎng)絡上。
◆值被發(fā)送到Redis之前先進行壓縮。Stack Overflow有許多處理器,大部分數(shù)據(jù)是字符串,所以得到的壓縮比很高。
◆Redis機器上的處理器使用率為0%。
◆全局緩存:全局緩存被所有站點和服務器共享。
◆緩存內(nèi)容包括收件箱、API使用限額和另外幾項真正全局的內(nèi)容。
◆緩存駐留在Redis中(位于數(shù)據(jù)庫0,同樣為了易于調(diào)試)。
◆緩存中的大部分項目在超時(通常是幾分鐘)后過期,從來不被明確刪除。需要宣布某個特定的緩存項目無效時,他們使用Redis消息傳遞機制,向“一級”緩存發(fā)布刪除通知。
◆知名軟件工程師、Fog Creek Software公司首席執(zhí)行官Joel Spolsky不是微軟的忠誠分子,他并不為Stack Overflow做出技術決策,認為微軟的許可證是個舍入誤差。
◆Stack Overflow為自己的輸入/輸出系統(tǒng)選擇了英特爾X25固態(tài)硬盤組成的RAID 10陣列。這個RAID陣列消除了可靠性方面的任何問題;與FusionIO相比,固態(tài)硬盤的性能確實很好,而價格又便宜得多。
◆微軟許可證的總標價約為24.2萬美元。由于Stack Overflow使用Bizspark,所以沒在支付總標價,但他們能付的最多也就這么多。
◆英特爾網(wǎng)卡取代了博通網(wǎng)卡和主生產(chǎn)服務器。這解決了他們之前面臨的問題:連接中斷、數(shù)據(jù)包丟失和地址解析協(xié)議(ARP)表損壞。
【51CTO.com譯文,轉(zhuǎn)載請注明原文作譯者和出處?!?/p>
原文:Stack Overflow Architecture Update - Now At 95 Million Page Views A Month
【編輯推薦】