Cinchcast架構(gòu):處理龐大數(shù)據(jù)的技術(shù)決策
譯文【編者按】這篇博文的作者是Cinchcast和BlogTalkRadio的首席技術(shù)官Aleksandr Yampolskiy博士,他在這兩個網(wǎng)站負(fù)責(zé)工程技術(shù)、質(zhì)量保證、技術(shù)運營、電話系統(tǒng)和產(chǎn)品等團隊。
【51CTO快譯】Cinchcast提供的解決方案讓其他公司可以制作、共享、度量和銷售音頻內(nèi)容,以便覆蓋和吸引對本公司來說最重要的人群。我們的技術(shù)整合了會議橋和實時音頻流,從而簡化了網(wǎng)上活動,加強了參與者的互動性。Cinchcast技術(shù)還用于支持Blogtalkradio的運行,這是世界上規(guī)模最大的音頻社交網(wǎng)絡(luò)。如今,我們的平臺每天制作和分發(fā)的原創(chuàng)音頻內(nèi)容超過了1500個小時。我們在本文中描述了我們?yōu)榱藬U展平臺、支持?jǐn)?shù)量這么龐大的數(shù)據(jù)所做的技術(shù)決策。
統(tǒng)計數(shù)據(jù)
■每個月的頁面瀏覽量超過5000萬
■制作的音頻內(nèi)容長達(dá)50000小時
■1500萬路媒體流
■1.75億廣告瀏覽次數(shù)
■峰值速度達(dá)到每秒40000次并發(fā)請求
■每天數(shù)TB的數(shù)據(jù)存儲在微軟SQL、Redis和ElasticSearch等集群中
■由10名工程師組成的團隊(Cinchcast共有20名技術(shù)人員)
■生產(chǎn)環(huán)境中大約有100個硬件節(jié)點
數(shù)據(jù)中心
■實際網(wǎng)站從位于布魯克林的數(shù)據(jù)中心來運行。我們喜歡掌控自己的命運,而不是把數(shù)據(jù)交給云平臺保管。
■亞馬遜彈性計算云(EC2)實例主要用于質(zhì)量保證(QA)環(huán)境和試運行(Staging)環(huán)境。
硬件
■大概50臺Web服務(wù)器
■15臺微軟SQL數(shù)據(jù)庫服務(wù)器
■2臺Redis NoSQL鍵值服務(wù)器
■2臺NodeJS服務(wù)器
■2臺服務(wù)器用于彈性搜索集群
開發(fā)工具
■NET
■Visual Studio 2010團隊套件充當(dāng)集成開發(fā)環(huán)境(IDE)
■StyleCop和ReSharper用于執(zhí)行代碼標(biāo)準(zhǔn)
■敏捷開發(fā)方法,Scrum用于大的開發(fā)任務(wù),看板/任務(wù)板則用于比較小的任務(wù)
■Jenkins + Nunit用于測試和持續(xù)集成
■Sauce On Demand——Selenium用于自動化測試
使用的軟件和技術(shù)
■Windows Server 2008 R2 64位操作系統(tǒng)
■在微軟Windows Server 2008 Web服務(wù)器下運行的SQL Server 2005
■Equalizer負(fù)載均衡器用于負(fù)載均衡
■REDIS用作分布式緩存層,用于消息發(fā)布/訂閱隊列
■NODEJS用于實時分析和更新Studio儀表板
■ElasticSearch用于分布式搜索
■Sawmill+自定義分析器腳本用于日志分析
監(jiān)控
■NewRelic用于性能監(jiān)控
■Chartbeat用于分析性能對關(guān)鍵績效指標(biāo)(轉(zhuǎn)換率和頁面瀏覽量)的影響
■Gomez、WhatsupGold和Nagios用于各種警報
■來自Red Gate的SQL Monitor 用于監(jiān)控SQL Server
我們采用的方法
■“簡潔、明快、高效,辦完事就走人”:尊重別人的時間。不要帶著問題來,要帶著解決辦法來。
■不盲目追求當(dāng)下的熱門技術(shù)。而是“化解你的首要問題”。我們是采用新技術(shù),但只是業(yè)務(wù)需要新技術(shù)時才這么做。如果你有數(shù)以百萬的用戶,針對避免工作網(wǎng)站停運的要求就大大提高。
■先做好“基本功”,然后再考慮“干得漂亮”。
■成為“注重解決辦法的團隊”,而不是“凡事說不的團隊”。
■把安全融入到軟件開發(fā)生命周期中。你需要培訓(xùn)開發(fā)人員,教他們?nèi)绾尉帉懓踩能浖?,并且一開始就把這列為一項優(yōu)先工作。
架構(gòu)
■所有的Javascript、CSS和圖片都緩存在內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)處。域名服務(wù)系統(tǒng)(DNS)指向CDN,再由CDN將請求傳遞到源服務(wù)器。我們之所以使用Cotendo,是因為它允許在CDN做出第七層路由決策。
■使用不同的Web服務(wù)器集群,分別為常規(guī)用戶和廣告用戶處理各自的請求,由cookie來進(jìn)行區(qū)分。
■我們正在向面向服務(wù)的架構(gòu)遷移;其中,系統(tǒng)的各個關(guān)鍵部分(如搜索、驗證和緩存)是由不同語言實現(xiàn)的充分利用REST的服務(wù)。這些服務(wù)還提供了緩存層。
■Redis NOSQL鍵值存儲區(qū)(redis.io)用作數(shù)據(jù)庫調(diào)用之前的緩存層。
■Scaleout用于跨Web服務(wù)器園(Web server garden)維護會話狀態(tài)。不過,我們在考慮切換到REDIS上。
汲取的經(jīng)驗教訓(xùn)
■SQL Server數(shù)據(jù)庫中的文本搜索不好用。它經(jīng)常造成處理器阻塞,于是我們改用ElasticSearch(Lucene衍生版本)。
■微軟的內(nèi)置會話模塊容易出現(xiàn)死鎖,于是我們最后把它換成了AngiesList會話模塊,將數(shù)據(jù)存儲到REDIS。
■日志功能是發(fā)現(xiàn)問題的關(guān)鍵。
■重新發(fā)明輪子也可以是件好事。比如說,起初我們使用一家廠商的產(chǎn)品,用于將JavaScript/CSS捆綁起來,這開始引起了性能問題。隨后,我們自己重新編寫了捆綁方法,因而顯著改善了我們網(wǎng)站的性能。
■不是所有的數(shù)據(jù)都是關(guān)系型數(shù)據(jù),所以數(shù)據(jù)庫并非總是一種很好的媒介。打個恰當(dāng)?shù)谋确绞?ldquo;設(shè)想一下水沿管道流動。管道上頭很寬,但到了下頭變得很窄。”這個上頭就是Web服務(wù)器(有好多這種服務(wù)器),下頭就是數(shù)據(jù)庫(數(shù)據(jù)庫沒多少,變得阻塞起來。)
■開發(fā)過程中不使用度量指標(biāo)就好比高度計失靈的情況下,試圖在暴風(fēng)雨中讓飛機著落。在整個開發(fā)過程中,要估算網(wǎng)站吞吐量、修復(fù)致命缺陷/嚴(yán)重缺陷的時間和代碼覆蓋率等度量指標(biāo),以此來評估你的性能。