Facebook目前存儲(chǔ)了2600億張照片稚矿,總大小為20PB,通過計(jì)算可以得出每張照片的平均大小為20PB/260GB,約為80KB。用戶每周新增照片數(shù)為10億(總大小為60TB)阳柔,平均每秒新增的照片數(shù)為10_{9}/7/40000(按每天40000s計(jì)),約為每秒3500次寫操作蚓峦,讀操作峰值可以達(dá)到每秒百萬次舌剂。
Facebook相冊(cè)后端早期采用基于NAS的存儲(chǔ)济锄,通過NFS掛載NAS中的照片文件來提供服務(wù)。后來出于性能和成本考慮霍转,自主研發(fā)了Facebook Haystack存儲(chǔ)相冊(cè)數(shù)據(jù)荐绝。
系統(tǒng)架構(gòu)
Facebook Haystack的思路與TFS類似,也是多個(gè)邏輯文件共享一個(gè)物理文件谴忧。Haystack架構(gòu)及讀請(qǐng)求處理流程如圖4-6所示很泊。
Haystack系統(tǒng)主要包括三個(gè)部分:目錄(Directory)角虫、存儲(chǔ)(Store)以及緩存(Cache)沾谓。Haystack存儲(chǔ)是物理存儲(chǔ)節(jié)點(diǎn),以物理卷軸(physical volume)的形式組織存儲(chǔ)空間戳鹅,每個(gè)物理卷軸一般都很大均驶,比如100GB,這樣10TB的數(shù)據(jù)也只需100個(gè)物理卷軸枫虏。每個(gè)物理卷軸對(duì)應(yīng)一個(gè)物理文件妇穴,因此,每個(gè)存儲(chǔ)節(jié)點(diǎn)上的物理文件元數(shù)據(jù)都很小隶债。多個(gè)物理存儲(chǔ)節(jié)點(diǎn)上的物理卷軸組成一個(gè)邏輯卷軸(logical volume)腾它,用于備份。Haystack目錄存放邏輯卷軸和物理卷軸的對(duì)應(yīng)關(guān)系死讹,以及照片id到邏輯卷軸之間的映射關(guān)系瞒滴。Haystack緩存主要用于解決對(duì)CDN提供商過于依賴的問題,提供最近增加的照片的緩存服務(wù)赞警。
Haystack照片讀取請(qǐng)求大致流程為:用戶訪問一個(gè)頁面時(shí)妓忍,Web服務(wù)器請(qǐng)求Haystack目錄構(gòu)造一個(gè)URL:http://<CDN>/<Cache>/<Machine id>/<Logical volume,Photo>,后續(xù)根據(jù)各個(gè)部分的信息依次訪問CDN愧旦、Haystack緩存和后端的Haystack存儲(chǔ)節(jié)點(diǎn)世剖。Haystack目錄構(gòu)造URL時(shí)可以省略<CDN>部分從而使得用戶直接請(qǐng)求Haystack緩存而不必經(jīng)過CDN。CDN笤虫。Haystack緩存收到的請(qǐng)求包含兩個(gè)部分:用戶瀏覽器的請(qǐng)求及CDN的請(qǐng)求旁瘫,Haystack緩存只緩存用戶瀏覽器發(fā)送的請(qǐng)求且要求請(qǐng)求的Haystack存儲(chǔ)節(jié)點(diǎn)是可寫的。一般來說琼蚯,Haystack后端的存儲(chǔ)節(jié)點(diǎn)寫一段時(shí)間以后達(dá)到容量上限變?yōu)橹蛔x境蜕,因此,可寫節(jié)點(diǎn)的照片為最近增加的照片凌停,是熱點(diǎn)數(shù)據(jù)粱年。本節(jié)暫不討論CDN,只討論Haystack后端存儲(chǔ)系統(tǒng)罚拟,包括Haystack目錄和Haystack緩存兩個(gè)部分台诗。
1.寫流程
如圖4-7所示完箩,Haystack的寫請(qǐng)求(照片上傳)處理流程為:Web服務(wù)器首先請(qǐng)求Haystack目錄獲取可寫的邏輯卷軸,接著生成照片唯一id并將數(shù)據(jù)寫入每一個(gè)對(duì)應(yīng)的物理卷軸(備份數(shù)一般為3)拉队。寫操作成功要求所有的物理卷軸都成功弊知,如果中間出現(xiàn)故障,需要重試粱快。
Haystack的一致性模型保證只要寫操作成功秩彤,邏輯卷軸對(duì)應(yīng)的所有物理卷軸都存在一個(gè)有效的照片文件,但有效照片文件在不同物理卷軸中的偏移(offset)可能不同事哭。
Haystack存儲(chǔ)節(jié)點(diǎn)只支持追加操作漫雷,如果需要更新一張照片,可以新增一張編號(hào)相同的照片到系統(tǒng)中鳍咱,如果新增照片和原有的照片在不同的邏輯卷軸降盹,Haystack目錄的元數(shù)據(jù)會(huì)更新為最新的邏輯卷軸;如果新增照片和原有的照片在相同的邏輯卷軸谤辜,Haystack存儲(chǔ)會(huì)以偏移更大的照片文件為準(zhǔn)蓄坏。
2.容錯(cuò)處理
(1)Haystack存儲(chǔ)節(jié)點(diǎn)容錯(cuò)
檢測(cè)到存儲(chǔ)節(jié)點(diǎn)故障時(shí),所有物理卷軸對(duì)應(yīng)的邏輯卷軸都被標(biāo)記為只讀丑念。存儲(chǔ)節(jié)點(diǎn)上的未完成的寫操作全部失敗涡戳,寫操作將重試;如果發(fā)生故障的存儲(chǔ)節(jié)點(diǎn)不可恢復(fù)脯倚,需要執(zhí)行一個(gè)拷貝任務(wù)渔彰,從其他副本所在的存儲(chǔ)節(jié)點(diǎn)拷貝丟失的物理卷軸的數(shù)據(jù);由于物理卷軸一般很大挠将,比如100GB胳岂,所以拷貝的過程會(huì)很長,一般為小時(shí)級(jí)別舔稀。
2)Haystack目錄容錯(cuò)
Haystack目錄采用主備數(shù)據(jù)庫(Replicated Database)做持久化存儲(chǔ)乳丰,由主備數(shù)據(jù)庫提供容錯(cuò)機(jī)制。
3.Haystack目錄
Haystack目錄的功能如下:
1)提供邏輯卷軸到物理卷軸的映射内贮,維護(hù)照片id到邏輯卷軸的映射产园;
2)提供負(fù)載均衡,為寫操作選擇邏輯卷軸夜郁,讀操作選擇物理卷軸什燕;
3)屏蔽CDN服務(wù),可以選擇某些圖片請(qǐng)求直接走Haystack緩存竞端;
4)標(biāo)記某些邏輯卷軸為只讀屎即。
根據(jù)前面的計(jì)算結(jié)果可知,F(xiàn)acebook相冊(cè)系統(tǒng)每秒的寫操作大約為3500次,每秒的讀請(qǐng)求大約為100萬次技俐。每個(gè)寫請(qǐng)求都需要通過Haystack緩存獲取可寫的卷軸乘陪,每個(gè)讀請(qǐng)求需要通過Haystack緩存構(gòu)造讀取URL。這里需要注意雕擂,照片id到邏輯卷軸的映射的數(shù)據(jù)量太大啡邑,單機(jī)內(nèi)存無法存放,筆者猜測(cè)內(nèi)部使用了MySQL Sharding集群井赌,另外谤逼,還增加了一個(gè)Memcache集群滿足查詢需求。
4.Haystack存儲(chǔ)
Haystack存儲(chǔ)保存物理卷軸仇穗,每個(gè)物理卷軸對(duì)應(yīng)文件系統(tǒng)中的一個(gè)物理文件流部,每個(gè)物理文件的格式如圖4-8所示。
多個(gè)照片文件存放在一個(gè)物理卷軸中仪缸,每個(gè)照片文件是一個(gè)Needle贵涵,包含實(shí)際數(shù)據(jù)及邏輯照片文件的元數(shù)據(jù)列肢。部分元數(shù)據(jù)需要裝載到內(nèi)存中用于照片查找恰画,包括Key(照片id,8字節(jié))瓷马,Alternate Key(照片規(guī)格拴还,包括Thumbnail、Small欧聘、Medium及Large片林,4字節(jié)),照片在物理卷軸的偏移Offset(4字節(jié))怀骤,照片的大小Size(4字節(jié))费封,每張照片占用8+8+4=20字節(jié)的空間,假設(shè)每臺(tái)機(jī)器的可用磁盤為8TB蒋伦,照片平均大小為80KB弓摘,單機(jī)存儲(chǔ)的照片數(shù)為8TB/80KB=100MB,占用內(nèi)存100MB×20=2GB痕届。
存儲(chǔ)節(jié)點(diǎn)宕機(jī)時(shí)韧献,需要恢復(fù)內(nèi)存中的邏輯照片查找表,掃描整個(gè)物理卷軸耗時(shí)太長研叫,因此锤窑,對(duì)每個(gè)物理卷軸維護(hù)了一個(gè)索引文件(Index File),保存每個(gè)Needle查找相關(guān)的元數(shù)據(jù)嚷炉。寫操作首先更新物理卷軸文件渊啰,然后異步更新索引文件。由于更新索引文件是異步的申屹,所以可能出現(xiàn)索引文件和物理卷軸文件不一致的情況绘证,不過由于對(duì)物理卷軸文件和索引文件的操作都是追加操作走搁,只需要掃描物理卷軸文件最后寫入的幾個(gè)Needle,然后補(bǔ)全索引文件即可迈窟。這種技術(shù)在僅支持追加的文件系統(tǒng)很常見私植。
Haystack Store存儲(chǔ)節(jié)點(diǎn)采用延遲刪除的回收策略,刪除照片只是向卷軸中追加一個(gè)帶有刪除標(biāo)記的Needle车酣,定時(shí)執(zhí)行Compaction任務(wù)回收已刪除空間曲稼。所謂Compaction操作,即將所有老數(shù)據(jù)文件中的數(shù)據(jù)掃描一遍湖员,以保留最新一個(gè)照片的原則進(jìn)行刪除贫悄,并生成新的數(shù)據(jù)文件。
討論
相比TFS,Haystack的一大特色就是磁盤空間回收娘摔。Blob文件在TFS中通過<Block id,Block offset>標(biāo)識(shí)窄坦,因此,不能對(duì)TFS中的數(shù)據(jù)塊進(jìn)行重整操作凳寺;而Haystack中的元信息只能定位到Blob文件所在的邏輯卷軸鸭津,Haystack存儲(chǔ)節(jié)點(diǎn)可以根據(jù)情況對(duì)物理卷軸進(jìn)行Compaction操作以回收磁盤空間。
Facebook Haystack中每個(gè)邏輯卷軸的大小為100GB肠缨,這樣減少了元信息逆趋,但是增加了遷移的時(shí)間。假設(shè)限制內(nèi)部網(wǎng)絡(luò)帶寬為20MB/s晒奕,那么遷移100GB的數(shù)據(jù)需要的時(shí)間為100GB/20MB/s=5000s闻书,大約是一個(gè)半小時(shí)。而TFS設(shè)計(jì)的數(shù)據(jù)規(guī)模相比Haystack要小脑慧,因此魄眉,可以選擇64MB的塊大小,有利于負(fù)載均衡闷袒。
另外坑律,Haystack使用RAID 6,并且底層文件系統(tǒng)使用性能更好的XFS霜运,淘寶TFS不使用RAID機(jī)制脾歇,文件系統(tǒng)使用Ext3,由應(yīng)用程序負(fù)責(zé)管理多個(gè)磁盤淘捡。Haystack使用了Akamai&Limelight的CDN服務(wù)藕各,而淘寶已經(jīng)使用自建的CDN,當(dāng)然焦除,F(xiàn)acebook也在考慮自建CDN激况。