導(dǎo)讀:Pixable正在成為輕博客Tumblr(Tumblr:150億月瀏覽量背后的架構(gòu)挑戰(zhàn))后,另外一家火爆的社交媒體,它是一個(gè)圖片分享中心。不過,Pixable可以自動(dòng)把你在Facebook和Twitter的圖片抓取過來,每天新增圖片達(dá)2000萬張,他們是如何處理、保存、分析暴增的數(shù)據(jù)的呢?Pixable CTO Alberto Lopez Toledo和工程副總Julio Viera對(duì)Pixable的系統(tǒng)架構(gòu)進(jìn)行了詳細(xì)說明。
Pixable通過各種社交平臺(tái)聚合你的圖片,你不會(huì)錯(cuò)過任何一個(gè)重要的瞬間。目前,Pixable每天要處理超過2000萬張新增圖片:抓取、分析、分類,并和已有的超過50億張圖片比較并對(duì)其排序。如何理解這些數(shù)據(jù)是很大的挑戰(zhàn),這其中有兩個(gè)問題比較突出:
1、每天,采取何種方式保證高效的從Facebook、Twitter、Instagram和其他應(yīng)用獲得上百萬張圖片。
2、如何處理、組織、索引和存儲(chǔ)關(guān)聯(lián)圖片的元數(shù)據(jù)。
當(dāng)然,Pixable的基礎(chǔ)架構(gòu)是不斷變化的,但我們也在過去一年中學(xué)到了不少東西。因此,我們已經(jīng)能夠建立可擴(kuò)展的基礎(chǔ)架構(gòu),這個(gè)架構(gòu)建立在我們今天的工具、語言和云服務(wù)(我們的80個(gè)服務(wù)都在AWS上運(yùn)行)。本文檔將簡要介紹這些經(jīng)驗(yàn)教訓(xùn)。
后端架構(gòu)-一切皆有可能
基礎(chǔ)設(shè)施-鐘愛Amazon EC2
我們所有的服務(wù)都在使用了Amazon EC2,從CentOS Linux t1.micro到m2.2xlarge都在使用。然后我們設(shè)置好服務(wù)器,建立內(nèi)部的AMI。
我們?yōu)殡S時(shí)部署新任務(wù)做好準(zhǔn)備,以應(yīng)對(duì)負(fù)載突然增加。所以,我們始終保持最低的性能標(biāo)準(zhǔn)。
為了應(yīng)對(duì)負(fù)責(zé)波動(dòng),我們開發(fā)了自動(dòng)增減容技術(shù),該技術(shù)可以根據(jù)當(dāng)前和歷史負(fù)荷中一天中特定的時(shí)間點(diǎn)預(yù)測每種服務(wù)新增的數(shù)量。然后,我們通過開啟或終止一些應(yīng)用來保證系統(tǒng)資源供給。這樣,我們就可以節(jié)省下購買那些本不需要的服務(wù)器的資金。在Amazon,做到自動(dòng)增減容并不容易,這需要考慮到很多變量。
舉個(gè)例子:停止一個(gè)運(yùn)行了半個(gè)小時(shí)的服務(wù)是毫無意義的,因?yàn)锳mazon以一個(gè)小時(shí)為單位交付。同樣的,Amazon花20多分鐘啟動(dòng)一個(gè)服務(wù)也是如此。對(duì)于突發(fā)的擁堵,我們可以智能的安排需求(智能安排啟動(dòng)非常迅速),將一些需求安排在下一個(gè)小時(shí)啟動(dòng)。這是僅僅考慮到操作層面的研究結(jié)果,目標(biāo)就是榨干投資帶來的所有性能。這種思想很像《Moneyball》那部電影,我們把棒球運(yùn)動(dòng)員換成了虛擬化服務(wù)。
我們的網(wǎng)站目前運(yùn)行在Apache+PHP 5.3上(過段時(shí)間我們會(huì)把部分服務(wù)器調(diào)整為nginx+php-fpm,這將成為我們的標(biāo)準(zhǔn)配置)。在Amazon彈性負(fù)載均衡基礎(chǔ)上,我們的服務(wù)器均勻的分散在不同的地區(qū),這樣我們可以消化Amazon的宕機(jī)和價(jià)格波動(dòng)。我們的靜態(tài)內(nèi)容存儲(chǔ)在Amazon CloudFront上,并用Amazon Route 53用于DNS服務(wù)。的確,我們愛Amazon。
工作隊(duì)列-抓取圖片并分級(jí),發(fā)送通知等等
事實(shí)上,Pixable所有的工作都是異步的(例如從不同用戶的Facebook上抓取圖片,發(fā)送通知,計(jì)算用戶的排名等)。我們有幾十臺(tái)服務(wù)器負(fù)責(zé)從不同的服務(wù)中抓取圖片的元數(shù)據(jù),并且進(jìn)行處理。這項(xiàng)工作連續(xù)不斷、夜以繼日的進(jìn)行著。