|
一、淘寶網(wǎng)的困境
對(duì)于淘寶網(wǎng)這樣的大型電子商務(wù)網(wǎng)站,對(duì)于圖片服務(wù)的要求特別的高。而且對(duì)于賣家來說,圖片遠(yuǎn)勝于文字描述,因此賣家也格外看重圖片的顯示質(zhì)量、訪問速度等問題。根據(jù)淘寶網(wǎng)的流量分析,整個(gè)淘寶網(wǎng)流量中,圖片的訪問流量會(huì)占到90%以上,而主站的網(wǎng)頁則占到不到10%。同時(shí)大量的圖片需要根據(jù)不同的應(yīng)用位置,生成不同大小規(guī)格的縮略圖。考慮到多種不同的應(yīng)用場景以及改版的可能性,一張?jiān)瓐D有可能需要生成20多個(gè)不同尺寸規(guī)格的縮略圖。
淘寶整體圖片存儲(chǔ)系統(tǒng)容量1800TB(1.8PB),已經(jīng)占用空間990TB(約1PB)。保存的圖片文件數(shù)量達(dá)到286億多個(gè),這些圖片文件包括根據(jù)原圖生成的縮略圖。平均圖片大小是17.45K;8K以下圖片占圖片數(shù)總量的61%,占存儲(chǔ)容量的11%。對(duì)于如此大規(guī)模的小文件存儲(chǔ)與讀取需要頻繁的尋道和換道,在大量高并發(fā)訪問量的情況下,非常容易造成讀取延遲。
2007年之前淘寶采用NETApp公司的文件存儲(chǔ)系統(tǒng)。至2006年, NETApp公司最高端的產(chǎn)品也不能滿足淘寶存儲(chǔ)的要求。首先是商用的存儲(chǔ)系統(tǒng)沒有對(duì)小文件存儲(chǔ)和讀取的環(huán)境進(jìn)行有針對(duì)性的優(yōu)化;其次,文件數(shù)量大,網(wǎng)絡(luò)存儲(chǔ)設(shè)備無法支撐;另外,整個(gè)系統(tǒng)所連接的服務(wù)器也越來越多,網(wǎng)絡(luò)連接數(shù)已經(jīng)到達(dá)了網(wǎng)絡(luò)存儲(chǔ)設(shè)備的極限。此外,商用存儲(chǔ)系統(tǒng)擴(kuò)容成本高,10T的存儲(chǔ)容量需要幾百萬,而且存在單點(diǎn)故障,容災(zāi)和安全性無法得到很好的保證。
二、淘寶網(wǎng)自主開發(fā)的目的
- 商用軟件很難滿足大規(guī)模系統(tǒng)的應(yīng)用需求,無論存儲(chǔ)還是CDN還是負(fù)載均衡,因?yàn)樵趶S商實(shí)驗(yàn)室端,很難實(shí)現(xiàn)如此大的數(shù)據(jù)規(guī)模測試。
- 研發(fā)過程中,將開源和自主開發(fā)相結(jié)合,會(huì)有更好的可控性,系統(tǒng)出問題了,完全可以從底層解決問題,系統(tǒng)擴(kuò)展性也更高。
- 在一定規(guī)模效應(yīng)基礎(chǔ)上,研發(fā)的投入都是值得的。當(dāng)規(guī)模超過交叉點(diǎn)后自主研發(fā)才能收到較好的經(jīng)濟(jì)效果。實(shí)際上淘寶網(wǎng)的規(guī)模已經(jīng)遠(yuǎn)遠(yuǎn)超過了交叉點(diǎn)。
- 自主研發(fā)的系統(tǒng)可在軟件和硬件多個(gè)層次不斷的優(yōu)化。
三、淘寶TFS的介紹
1、TFS 1.0 版本
從2006年開始,淘寶網(wǎng)決定自己開發(fā)一套針對(duì)海量小文件存儲(chǔ)難題的文件系統(tǒng),用于解決自身圖片存儲(chǔ)的難題。到2007年6月,TFS(淘寶文件系統(tǒng),Taobao File System)正式上線運(yùn)營。在生產(chǎn)環(huán)境中應(yīng)用的集群規(guī)模達(dá)到了200臺(tái)PC Server(146G*6 SAS 15K Raid5),文件數(shù)量達(dá)到上億級(jí)別;系統(tǒng)部署存儲(chǔ)容量: 140 TB;實(shí)際使用存儲(chǔ)容量: 50 TB;單臺(tái)支持隨機(jī)IOPS 200+,流量3MBps。
圖為淘寶集群文件系統(tǒng)TFS 1.0第一版的邏輯架構(gòu):集群由一對(duì)Name Server和多臺(tái)Data Server構(gòu)成,Name Server的兩臺(tái)服務(wù)器互為雙機(jī),就是集群文件系統(tǒng)中管理節(jié)點(diǎn)的概念。
- 每個(gè)Data Server運(yùn)行在一臺(tái)普通的Linux主機(jī)上
- 以block文件的形式存放數(shù)據(jù)文件(一般64M一個(gè)block)
- block存多份保證數(shù)據(jù)安全
- 利用ext3文件系統(tǒng)存放數(shù)據(jù)文件
- 磁盤raid5做數(shù)據(jù)冗余
- 文件名內(nèi)置元數(shù)據(jù)信息,用戶自己保存TFS文件名與實(shí)際文件的對(duì)照關(guān)系–使得元數(shù)據(jù)量特別小。
TFS最大的特點(diǎn)就是將一部分元數(shù)據(jù)隱藏到圖片的保存文件名上,大大簡化了元數(shù)據(jù),消除了管理節(jié)點(diǎn)對(duì)整體系統(tǒng)性能的制約,這一理念和目前業(yè)界流行的“對(duì)象存儲(chǔ)”較為類似。傳統(tǒng)的集群系統(tǒng)里面元數(shù)據(jù)只有1份,通常由管理節(jié)點(diǎn)來管理,因而很容易成為瓶頸。而對(duì)于淘寶網(wǎng)的用戶來說,圖片文件究竟用什么名字來保存實(shí)際上用戶并不關(guān)心,因此TFS在設(shè)計(jì)規(guī)劃上考慮在圖片的保存文件名上暗藏了一些元數(shù)據(jù)信息,例如圖片的大小、時(shí)間、訪問頻次等等信息,包括所在的邏輯塊號(hào)。而在元數(shù)據(jù)上,實(shí)際上保存的信息很少,因此元數(shù)據(jù)結(jié)構(gòu)非常簡單。僅僅只需要一個(gè)fileID,能夠準(zhǔn)確定位文件在什么地方。由于大量的文件信息都隱藏在文件名中,整個(gè)系統(tǒng)完全拋棄了傳統(tǒng)的目錄樹結(jié)構(gòu),因?yàn)槟夸洏溟_銷最大。拿掉后,整個(gè)集群的高可擴(kuò)展性極大提高。
2、 TFS 1.3版本
到2009年6月,TFS 1.3版本上線,集群規(guī)模大大擴(kuò)展,部署到淘寶的圖片生產(chǎn)系統(tǒng)上,整個(gè)系統(tǒng)已經(jīng)從原有200臺(tái)PC服務(wù)器擴(kuò)增至440臺(tái)PC Server(300G*12 SAS 15K RPM) + 30臺(tái)PC Server (600G*12 SAS 15K RPM)。支持文件數(shù)量也擴(kuò)容至百億級(jí)別;系統(tǒng)部署存儲(chǔ)容量:1800TB(1.8PB);當(dāng)前實(shí)際存儲(chǔ)容量:995TB;單臺(tái)Data Server支持隨機(jī)IOPS 900+,流量15MB+;目前Name Server運(yùn)行的物理內(nèi)存是217MB(服務(wù)器使用千兆網(wǎng)卡)。
圖為TFS1.3版本的邏輯結(jié)構(gòu)圖,在TFS1.3版本中,淘寶網(wǎng)的軟件工作組重點(diǎn)改善了心跳和同步的性能,最新版本的心跳和同步在幾秒鐘之內(nèi)就可完成切換,同時(shí)進(jìn)行了一些新的優(yōu)化:包括元數(shù)據(jù)存內(nèi)存上,清理磁盤空間,性能上也做了優(yōu)化,包括:
- 完全扁平化的數(shù)據(jù)組織結(jié)構(gòu),拋棄了傳統(tǒng)文件系統(tǒng)的目錄結(jié)構(gòu)。
- 在塊設(shè)備基礎(chǔ)上建立自有的文件系統(tǒng),減少EXT3等文件系統(tǒng)數(shù)據(jù)碎片帶來的性能損耗
- 單進(jìn)程管理單塊磁盤的方式,摒除RAID5機(jī)制
- 帶有HA機(jī)制的中央控制節(jié)點(diǎn),在安全穩(wěn)定和性能復(fù)雜度之間取得平衡。
- 盡量縮減元數(shù)據(jù)大小,將元數(shù)據(jù)全部加載入內(nèi)存,提升訪問速度。
- 跨機(jī)架和IDC的負(fù)載均衡和冗余安全策略。
- 完全平滑擴(kuò)容。
TFS主要的性能參數(shù)不是IO吞吐量,而是單臺(tái)PCServer提供隨機(jī)讀寫IOPS。由于硬件型號(hào)不同,很難給出一個(gè)參考值來說明性能。但基本上可以達(dá)到單塊磁盤隨機(jī)IOPS理論最大值的60%左右,整機(jī)的輸出隨盤數(shù)增加而線性增加。
3、 TFS 2.0 版本
TFS 2.0(下面簡稱TFS,目前已經(jīng)開源)是一個(gè)高可擴(kuò)展、高可用、高性能、面向互聯(lián)網(wǎng)服務(wù)的分布式文件系統(tǒng),主要針對(duì)海量的非結(jié)構(gòu)化數(shù)據(jù),它構(gòu)筑在普通的Linux機(jī)器集群上,可為外部提供高可靠和高并發(fā)的存儲(chǔ)訪問。TFS為淘寶提供海量小文件存儲(chǔ),通常文件大小不超過1M,滿足了淘寶對(duì)小文件存儲(chǔ)的需求,被廣泛地應(yīng)用在淘寶各項(xiàng)應(yīng)用中。它采用了HA架構(gòu)和平滑擴(kuò)容,保證了整個(gè)文件系統(tǒng)的可用性和擴(kuò)展性。同時(shí)扁平化的數(shù)據(jù)組織結(jié)構(gòu),可將文件名映射到文件的物理地址,簡化了文件的訪問流程,一定程度上為TFS提供了良好的讀寫性能。
一個(gè)TFS集群由兩個(gè)!NameServer節(jié)點(diǎn)(一主一備)和多個(gè)!DataServer節(jié)點(diǎn)組成。這些服務(wù)程序都是作為一個(gè)用戶級(jí)的程序運(yùn)行在普通Linux機(jī)器上的。在TFS中,將大量的小文件(實(shí)際數(shù)據(jù)文件)合并成為一個(gè)大文件,這個(gè)大文件稱為塊(Block), 每個(gè)Block擁有在集群內(nèi)唯一的編號(hào)(Block Id), Block Id在!NameServer在創(chuàng)建Block的時(shí)候分配, !NameServer維護(hù)block與!DataServer的關(guān)系。Block中的實(shí)際數(shù)據(jù)都存儲(chǔ)在!DataServer上。而一臺(tái)!DataServer服務(wù)器一般會(huì)有多個(gè)獨(dú)立!DataServer進(jìn)程存在,每個(gè)進(jìn)程負(fù)責(zé)管理一個(gè)掛載點(diǎn),這個(gè)掛載點(diǎn)一般是一個(gè)獨(dú)立磁盤上的文件目錄,以降低單個(gè)磁盤損壞帶來的影響。正常情況下,一個(gè)塊會(huì)在!DataServer上存在,主!NameServer負(fù)責(zé)Block的創(chuàng)建,刪除,復(fù)制,均衡,整理, !NameServer不負(fù)責(zé)實(shí)際數(shù)據(jù)的讀寫,實(shí)際數(shù)據(jù)的讀寫由!DataServer完成。
- !NameServer主要功能是: 管理維護(hù)Block和!DataServer相關(guān)信息,包括!DataServer加入,退出, 心跳信息, block和!DataServer的對(duì)應(yīng)關(guān)系建立,解除。
- !DataServer主要功能是: 負(fù)責(zé)實(shí)際數(shù)據(jù)的存儲(chǔ)和讀寫。
同時(shí)為了考慮容災(zāi),!NameServer采用了HA結(jié)構(gòu),即兩臺(tái)機(jī)器互為熱備,同時(shí)運(yùn)行,一臺(tái)為主,一臺(tái)為備,主機(jī)綁定到對(duì)外vip,提供服務(wù);當(dāng)主機(jī)器宕機(jī)后,迅速將vip綁定至備份!NameServer,將其切換為主機(jī),對(duì)外提供服務(wù)。圖中的HeartAgent就完成了此功能。
TFS的塊大小可以通過配置項(xiàng)來決定,通常使用的塊大小為64M。TFS的設(shè)計(jì)目標(biāo)是海量小文件的存儲(chǔ),所以每個(gè)塊中會(huì)存儲(chǔ)許多不同的小文件。!DataServer進(jìn)程會(huì)給Block中的每個(gè)文件分配一個(gè)ID(File ID,該ID在每個(gè)Block中唯一),并將每個(gè)文件在Block中的信息存放在和Block對(duì)應(yīng)的Index文件中。這個(gè)Index文件一般都會(huì)全部load在內(nèi)存,除非出現(xiàn)!DataServer服務(wù)器內(nèi)存和集群中所存放文件平均大小不匹配的情況。
另外,還可以部署一個(gè)對(duì)等的TFS集群,作為當(dāng)前集群的輔集群。輔集群不提供來自應(yīng)用的寫入,只接受來自主集群的寫入。當(dāng)前主集群的每個(gè)數(shù)據(jù)變更操作都會(huì)重放至輔集群。輔集群也可以提供對(duì)外的讀,并且在主集群出現(xiàn)故障的時(shí)候,可以接管主集群的工作。
平滑擴(kuò)容
原有TFS集群運(yùn)行一定時(shí)間后,集群容量不足,此時(shí)需要對(duì)TFS集群擴(kuò)容。由于DataServer與NameServer之間使用心跳機(jī)制通信,如果系統(tǒng)擴(kuò)容,只需要將相應(yīng)數(shù)量的新!DataServer服務(wù)器部署好應(yīng)用程序后啟動(dòng)即可。這些!DataServer服務(wù)器會(huì)向!NameServer進(jìn)行心跳匯報(bào)。!NameServer會(huì)根據(jù)!DataServer容量的比率和!DataServer的負(fù)載決定新數(shù)據(jù)寫往哪臺(tái)!DataServer的服務(wù)器。根據(jù)寫入策略,容量較小,負(fù)載較輕的服務(wù)器新數(shù)據(jù)寫入的概率會(huì)比較高。同時(shí),在集群負(fù)載比較輕的時(shí)候,!NameServer會(huì)對(duì)!DataServer上的Block進(jìn)行均衡,使所有!DataServer的容量盡早達(dá)到均衡。
進(jìn)行均衡計(jì)劃時(shí),首先計(jì)算每臺(tái)機(jī)器應(yīng)擁有的blocks平均數(shù)量,然后將機(jī)器劃分為兩堆,一堆是超過平均數(shù)量的,作為移動(dòng)源;一類是低于平均數(shù)量的,作為移動(dòng)目的。
移動(dòng)目的的選擇:首先一個(gè)block的移動(dòng)的源和目的,應(yīng)該保持在同一網(wǎng)段內(nèi),也就是要與另外的block不同網(wǎng)段;另外,在作為目的的一定機(jī)器內(nèi),優(yōu)先選擇同機(jī)器的源到目的之間移動(dòng),也就是同臺(tái)!DataServer服務(wù)器中的不同!DataServer進(jìn)程。
當(dāng)有服務(wù)器故障或者下線退出時(shí)(單個(gè)集群內(nèi)的不同網(wǎng)段機(jī)器不能同時(shí)退出),不影響TFS的服務(wù)。此時(shí)!NameServer會(huì)檢測到備份數(shù)減少的Block,對(duì)這些Block重新進(jìn)行數(shù)據(jù)復(fù)制。
在創(chuàng)建復(fù)制計(jì)劃時(shí),一次要復(fù)制多個(gè)block, 每個(gè)block的復(fù)制源和目的都要盡可能的不同,并且保證每個(gè)block在不同的子網(wǎng)段內(nèi)。因此采用輪換選擇(roundrobin)算法,并結(jié)合加權(quán)平均。
由于DataServer之間的通信是主要發(fā)生在數(shù)據(jù)寫入轉(zhuǎn)發(fā)的時(shí)候和數(shù)據(jù)復(fù)制的時(shí)候,集群擴(kuò)容基本沒有影響。假設(shè)一個(gè)Block為64M,數(shù)量級(jí)為1PB。那么NameServer上會(huì)有 1 * 1024 * 1024 * 1024 / 64 = 16.7M個(gè)block。假設(shè)每個(gè)Block的元數(shù)據(jù)大小為0.1K,則占用內(nèi)存不到2G。
存儲(chǔ)機(jī)制
在TFS中,將大量的小文件(實(shí)際用戶文件)合并成為一個(gè)大文件,這個(gè)大文件稱為塊(Block)。TFS以Block的方式組織文件的存儲(chǔ)。每一個(gè)Block在整個(gè)集群內(nèi)擁有唯一的編號(hào),這個(gè)編號(hào)是由NameServer進(jìn)行分配的,而DataServer上實(shí)際存儲(chǔ)了該Block。在!NameServer節(jié)點(diǎn)中存儲(chǔ)了所有的Block的信息,一個(gè)Block存儲(chǔ)于多個(gè)!DataServer中以保證數(shù)據(jù)的冗余。對(duì)于數(shù)據(jù)讀寫請(qǐng)求,均先由!NameServer選擇合適的!DataServer節(jié)點(diǎn)返回給客戶端,再在對(duì)應(yīng)的!DataServer節(jié)點(diǎn)上進(jìn)行數(shù)據(jù)操作。!NameServer需要維護(hù)Block信息列表,以及Block與!DataServer之間的映射關(guān)系,其存儲(chǔ)的元數(shù)據(jù)結(jié)構(gòu)如下:
在!DataServer節(jié)點(diǎn)上,在掛載目錄上會(huì)有很多物理塊,物理塊以文件的形式存在磁盤上,并在!DataServer部署前預(yù)先分配,以保證后續(xù)的訪問速度和減少碎片產(chǎn)生。為了滿足這個(gè)特性,!DataServer現(xiàn)一般在EXT4文件系統(tǒng)上運(yùn)行。物理塊分為主塊和擴(kuò)展塊,一般主塊的大小會(huì)遠(yuǎn)大于擴(kuò)展塊,使用擴(kuò)展塊是為了滿足文件更新操作時(shí)文件大小的變化。每個(gè)Block在文件系統(tǒng)上以“主塊+擴(kuò)展塊”的方式存儲(chǔ)。每一個(gè)Block可能對(duì)應(yīng)于多個(gè)物理塊,其中包括一個(gè)主塊,多個(gè)擴(kuò)展塊。
在DataServer端,每個(gè)Block可能會(huì)有多個(gè)實(shí)際的物理文件組成:一個(gè)主Physical Block文件,N個(gè)擴(kuò)展Physical Block文件和一個(gè)與該Block對(duì)應(yīng)的索引文件。Block中的每個(gè)小文件會(huì)用一個(gè)block內(nèi)唯一的fileid來標(biāo)識(shí)。!DataServer會(huì)在啟動(dòng)的時(shí)候把自身所擁有的Block和對(duì)應(yīng)的Index加載進(jìn)來。
容錯(cuò)機(jī)制
集群容錯(cuò)。TFS可以配置主輔集群,一般主輔集群會(huì)存放在兩個(gè)不同的機(jī)房。主集群提供所有功能,輔集群只提供讀。主集群會(huì)把所有操作重放到輔集群。這樣既提供了負(fù)載均衡,又可以在主集群機(jī)房出現(xiàn)異常的情況不會(huì)中斷服務(wù)或者丟失數(shù)據(jù)。
!NameServer容錯(cuò)。Namserver主要管理了!DataServer和Block之間的關(guān)系。如每個(gè)!DataServer擁有哪些Block,每個(gè)Block存放在哪些!DataServer上等。同時(shí),!NameServer采用了HA結(jié)構(gòu),一主一備,主NameServer上的操作會(huì)重放至備NameServer。如果主NameServer出現(xiàn)問題,可以實(shí)時(shí)切換到備NameServer。另外!NameServer和!DataServer之間也會(huì)有定時(shí)的heartbeat,!DataServer會(huì)把自己擁有的Block發(fā)送給!NameServer。!NameServer會(huì)根據(jù)這些信息重建!DataServer和Block的關(guān)系。
!DataServer容錯(cuò)。TFS采用Block存儲(chǔ)多份的方式來實(shí)現(xiàn)!DataServer的容錯(cuò)。每一個(gè)Block會(huì)在TFS中存在多份,一般為3份,并且分布在不同網(wǎng)段的不同!DataServer上。對(duì)于每一個(gè)寫入請(qǐng)求,必須在所有的Block寫入成功才算成功。當(dāng)出現(xiàn)磁盤損壞!DataServer宕機(jī)的時(shí)候,TFS啟動(dòng)復(fù)制流程,把備份數(shù)未達(dá)到最小備份數(shù)的Block盡快復(fù)制到其他DataServer上去。 TFS對(duì)每一個(gè)文件會(huì)記錄校驗(yàn)crc,當(dāng)客戶端發(fā)現(xiàn)crc和文件內(nèi)容不匹配時(shí),會(huì)自動(dòng)切換到一個(gè)好的block上讀取。此后客戶端將會(huì)實(shí)現(xiàn)自動(dòng)修復(fù)單個(gè)文件損壞的情況。
并發(fā)機(jī)制
對(duì)于同一個(gè)文件來說,多個(gè)用戶可以并發(fā)讀。現(xiàn)有TFS并不支持并發(fā)寫一個(gè)文件。一個(gè)文件只會(huì)有一個(gè)用戶在寫。這在TFS的設(shè)計(jì)里面對(duì)應(yīng)著是一個(gè)block同時(shí)只能有一個(gè)寫或者更新操作。
TFS文件名的結(jié)構(gòu)
TFS的文件名由塊號(hào)和文件號(hào)通過某種對(duì)應(yīng)關(guān)系組成,最大長度為18字節(jié)。文件名固定以T開始,第二字節(jié)為該集群的編號(hào)(可以在配置項(xiàng)中指定,取值范圍 1~9)。余下的字節(jié)由Block ID和File ID通過一定的編碼方式得到。文件名由客戶端程序進(jìn)行編碼和解碼,它映射方式如下圖:
TFS客戶程序在讀文件的時(shí)候通過將文件名轉(zhuǎn)換為BlockID和FileID信息,然后可以在!NameServer取得該塊所在!DataServer信息(如果客戶端有該Block與!DataServere的緩存,則直接從緩存中取),然后與!DataServer進(jìn)行讀取操作。
四、圖片服務(wù)器部署與緩存
下圖為淘寶網(wǎng)整體系統(tǒng)的拓?fù)鋱D結(jié)構(gòu)。整個(gè)系統(tǒng)就像一個(gè)龐大的服務(wù)器一樣,有處理單元、緩存單元和存儲(chǔ)單元。前面已經(jīng)詳細(xì)介紹過了后臺(tái)的TFS集群文件存儲(chǔ)系統(tǒng),在TFS前端,還部署著200多臺(tái)圖片文件服務(wù)器,用Apache實(shí)現(xiàn),用于生成縮略圖的運(yùn)算。
根據(jù)淘寶網(wǎng)的縮略圖生成規(guī)則,縮略圖都是實(shí)時(shí)生成的。這樣做的好處有兩點(diǎn):一是為了避免后端圖片服務(wù)器上存儲(chǔ)的圖片數(shù)量過多,大大節(jié)約后臺(tái)存儲(chǔ)空間的需求,淘寶網(wǎng)計(jì)算,采用實(shí)時(shí)生成縮略圖的模式比提前全部生成好縮略圖的模式節(jié)約90%的存儲(chǔ)空間,也就是說,存儲(chǔ)空間只需要后一種模式的10%;二是,縮略圖可根據(jù)需要實(shí)時(shí)生成出來,更為靈活。
淘寶網(wǎng)圖片存儲(chǔ)與處理系統(tǒng)全局拓?fù)洌瑘D片服務(wù)器前端還有一級(jí)和二級(jí)緩存服務(wù)器,盡量讓圖片在緩存中命中,最大程度的避免圖片熱點(diǎn),實(shí)際上后端到達(dá)TFS的流量已經(jīng)非常離散和平均。
圖片文件服務(wù)器的前端則是一級(jí)緩存和二級(jí)緩存,前面還有全局負(fù)載均衡的設(shè)置,解決圖片的訪問熱點(diǎn)問題。圖片的訪問熱點(diǎn)一定存在,重要的是,讓圖片盡量在緩存中命中。目前淘寶網(wǎng)在各個(gè)運(yùn)營商的中心點(diǎn)設(shè)有二級(jí)緩存,整體系統(tǒng)中心店設(shè)有一級(jí)緩存,加上全局負(fù)載均衡,傳遞到后端TFS的流量就已經(jīng)非常均衡和分散了,對(duì)前端的響應(yīng)性能也大大提高。
根據(jù)淘寶的緩存策略,大部分圖片都盡量在緩存中命中,如果緩存中無法命中,則會(huì)在本地服務(wù)器上查找是否存有原圖,并根據(jù)原圖生成縮略圖,如果都沒有命中,則會(huì)考慮去后臺(tái)TFS集群文件存儲(chǔ)系統(tǒng)上調(diào)取,因此,最終反饋到TFS集群文件存儲(chǔ)系統(tǒng)上的流量已經(jīng)被大大優(yōu)化了。
淘寶網(wǎng)將圖片處理與緩存編寫成基于Nginx的模塊(Nginx-tfs),淘寶認(rèn)為Nginx是目前性能最高的HTTP服務(wù)器(用戶空間),代碼清晰,模塊化非常好。淘寶使用GraphicsMagick進(jìn)行圖片處理,采用了面向小對(duì)象的緩存文件系統(tǒng),前端有LVS+Haproxy將原圖和其所有縮略圖請(qǐng)求都調(diào)度到同一臺(tái)Image Server。
文件定位上,內(nèi)存用hash算法做索引,最多一次讀盤。寫盤方式則采用Append方式寫,并采用了淘汰策略FIFO,主要考慮降低硬盤的寫操作,沒有必要進(jìn)一步提高Cache命中率,因?yàn)镮mage Server和TFS在同一個(gè)數(shù)據(jù)中心,讀盤效率還是非常高的。
it知識(shí)庫:淘寶圖片服務(wù)的學(xué)習(xí),轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。