萬盛學電腦網

 萬盛學電腦網 >> 服務器教程 >> 談淘寶網升級圖片存儲服務

談淘寶網升級圖片存儲服務

  一、淘寶網的困境

  對於淘寶網這樣的大型電子商務網站,對於圖片服務的要求特別的高。而且對於賣家來說,圖片遠勝於文字描述,因此賣家也格外看重圖片的顯示質量、訪問速度等問題。根據淘寶網的流量分析,整個淘寶網流量中,圖片的訪問流量會占到90%以上,而主站的網頁則占到不到10%。同時大量的圖片需要根據不同的應用位置,生成不同大小規格的縮略圖。考慮到多種不同的應用場景以及改版的可能性,一張原圖有可能需要生成20多個不同尺寸規格的縮略圖。

  淘寶整體圖片存儲系統容量1800TB(1.8PB),已經占用空間990TB(約1PB)。保存的圖片文件數量達到286億多個,這些圖片文件包括根據原圖生成的縮略圖。平均圖片大小是17.45K;8K以下圖片占圖片數總量的61%,占存儲容量的11%。對於如此大規模的小文件存儲與讀取需要頻繁的尋道和換道,在大量高並發訪問量的情況下,非常容易造成讀取延遲。

  2007年之前淘寶采用NetApp公司的文件存儲系統。至2006年, NetApp公司最高端的產品也不能滿足淘寶存儲的要求。首先是商用的存儲系統沒有對小文件存儲和讀取的環境進行有針對性的優化;其次,文件數量大,網絡存儲設備無法支撐;另外,整個系統所連接的服務器也越來越多,網絡連接數已經到達了網絡存儲設備的極限。此外,商用存儲系統擴容成本高,10T的存儲容量需要幾百萬,而且存在單點故障,容災和安全性無法得到很好的保證。

  二、淘寶網自主開發的目的

  商用軟件很難滿足大規模系統的應用需求,無論存儲還是CDN還是負載均衡,因為在廠商實驗室端,很難實現如此大的數據規模測試。 研發過程中,將開源和自主開發相結合,會有更好的可控性,系統出問題了,完全可以從底層解決問題,系統擴展性也更高。 在一定規模效應基礎上,研發的投入都是值得的。當規模超過交叉點後自主研發才能收到較好的經濟效果。實際上淘寶網的規模已經遠遠超過了交叉點。 自主研發的系統可在軟件和硬件多個層次不斷的優化。

  三、淘寶TFS的介紹

  1、 TFS 1.0版本

  從2006年開始,淘寶網決定自己開發一套針對海量小文件存儲難題的文件系統,用於解決自身圖片存儲的難題。到2007年6月,TFS(淘寶文件系統,Taobao File System)正式上線運營。在生產環境中應用的集群規模達到了200台PC Server(146G*6 SAS 15K Raid5),文件數量達到上億級別;系統部署存儲容量: 140 TB;實際使用存儲容量: 50 TB;單台支持隨機IOPS 200+,流量3MBps。

談淘寶網升級圖片存儲服務 三聯

  圖為淘寶集群文件系統TFS 1.0第一版的邏輯架構:集群由一對Name Server和多台Data Server構成,Name Server的兩台服務器互為雙機,就是集群文件系統中管理節點的概念。

  每個Data Server運行在一台普通的Linux主機上 以block文件的形式存放數據文件(一般64M一個block) block存多份保證數據安全 利用ext3文件系統存放數據文件 磁盤raid5做數據冗余 文件名內置元數據信息,用戶自己保存TFS文件名與實際文件的對照關系–使得元數據量特別小。

  TFS最大的特點就是將一部分元數據隱藏到圖片的保存文件名上,大大簡化了元數據,消除了管理節點對整體系統性能的制約,這一理念和目前業界流行的 “對象存儲”較為類似。傳統的集群系統裡面元數據只有1份,通常由管理節點來管理,因而很容易成為瓶頸。而對於淘寶網的用戶來說,圖片文件究竟用什麼名字來保存實際上用戶並不關心,因此TFS在設計規劃上考慮在圖片的保存文件名上暗藏了一些元數據信息,例如圖片的大小、時間、訪問頻次等等信息,包括所在的邏輯塊號。而在元數據上,實際上保存的信息很少,因此元數據結構非常簡單。僅僅只需要一個fileID,能夠准確定位文件在什麼地方。由於大量的文件信息都隱藏在文件名中,整個系統完全拋棄了傳統的目錄樹結構,因為目錄樹開銷最大。拿掉後,整個集群的高可擴展性極大提高。

  2、 TFS 1.3版本

  到2009年6月,TFS 1.3版本上線,集群規模大大擴展,部署到淘寶的圖片生產系統上,整個系統已經從原有200台PC服務器擴增至440台PC Server(300G*12 SAS 15K RPM) + 30台PC Server (600G*12 SAS 15K RPM)。支持文件數量也擴容至百億級別;系統部署存儲容量:1800TB(1.8PB);當前實際存儲容量:995TB;單台Data Server支持隨機IOPS 900+,流量15MB+;目前Name Server運行的物理內存是217MB(服務器使用千兆網卡)。

tfs-2

  圖為TFS1.3版本的邏輯結構圖,在TFS1.3版本中,淘寶網的軟件工作組重點改善了心跳和同步的性能,最新版本的心跳和同步在幾秒鐘之內就可完成切換,同時進行了一些新的優化:包括元數據存內存上,清理磁盤空間,性能上也做了優化,包括:

  完全扁平化的數據組織結構,拋棄了傳統文件系統的目錄結構。 在塊設備基礎上建立自有的文件系統,減少EXT3等文件系統數據碎片帶來的性能損耗 單進程管理單塊磁盤的方式,摒除RAID5機制 帶有HA機制的中央控制節點,在安全穩定和性能復雜度之間取得平衡。 盡量縮減元數據大小,將元數據全部加載入內存,提升訪問速度。 跨機架和IDC的負載均衡和冗余安全策略。 完全平滑擴容。

  TFS主要的性能參數不是IO吞吐量,而是單台PCServer提供隨機讀寫IOPS。由於硬件型號不同,很難給出一個參考值來說明性能。但基本上可以達到單塊磁盤隨機IOPS理論最大值的60%左右,整機的輸出隨盤數增加而線性增加。

  3、 TFS 2.0版本

  TFS 2.0(下面簡稱TFS,目前已經開源)是一個高可擴展、高可用、高性能、面向互聯網服務的分布式文件系統,主要針對海量的非結構化數據,它構築在普通的 Linux機器集群上,可為外部提供高可靠和高並發的存儲訪問。TFS為淘寶提供海量小文件存儲,通常文件大小不超過1M,滿足了淘寶對小文件存儲的需求,被廣泛地應用在淘寶各項應用中。它采用了HA架構和平滑擴容,保證了整個文件系統的可用性和擴展性。同時扁平化的數據組織結構,可將文件名映射到文件的物理地址,簡化了文件的訪問流程,一定程度上為TFS提供了良好的讀寫性能。

tfs-3-1

  一個TFS集群由兩個!NameServer節點(一主一備)和多個!DataServer節點組成。這些服務程序都是作為一個用戶級的程序運行在普通Linux機器上的。在TFS中,將大量的小文件(實際數據文件)合並成為一個大文件,這個大文件稱為塊(Block), 每個Block擁有在集群內唯一的編號(Block Id), Block Id在!NameServer在創建Block的時候分配, !NameServer維護block與!DataServer的關系。Block中的實際數據都存儲在!DataServer上。而一台!DataServer服務器一般會有多個獨立!DataServer進程存在,每個進程負責管理一個掛載點,這個掛載點一般是一個獨立磁盤上的文件目錄,以降低單個磁盤損壞帶來的影響。正常情況下,一個塊會在!DataServer上存在,主!NameServer負責Block的創建,刪除,復制,均衡,整理, !NameServer不負責實際數據的讀寫,實際數據的讀寫由!DataServer完成。

  !NameServer主要功能是: 管理維護Block和!DataServer相關信息,包括!DataServer加入,退出, 心跳信息, block和!DataServer的對應關系建立,解除。 !DataServer主要功能是: 負責實際數據的存儲和讀寫。

  同時為了考慮容災,!NameServer采用了HA結構,即兩台機器互為熱備,同時運行,一台為主,一台為備,主機綁定到對外vip,提供服務;當主機器宕機後,迅速將vip綁定至備份!NameServer,將其切換為主機,對外提供服務。圖中的HeartAgent就完成了此功能。

  TFS的塊大小可以通過配置項來決定,通常使用的塊大小為64M。TFS的設計目標是海量小文件的存儲,所以每個塊中會存儲許多不同的小文件。!DataServer進程會給Block中的每個文件分配一個ID(File ID,該ID在每個Block中唯一),並將每個文件在Block中的信息存放在和Block對應的Index文件中。這個Index文件一般都會全部 load在內存,除非出現!DataServer服務器內存和集群中所存放文件平均大小不匹配的情況。

  另外,還可以部署一個對等的TFS集群,作為當前集群的輔集群。輔集群不提供來自應用的寫入,只接受來自主集群的寫入。當前主集群的每個數據變更操作都會重放至輔集群。輔集群也可以提供對外的讀,並且在主集群出現故障的時候,可以接管主集群的工作。

  平滑擴容

  原有TFS集群運行一定時間後,集群容量不足,此時需要對TFS集群擴容。由於DataServer與NameServer之間使用心跳機制通信,如果系統擴容,只需要將相應數量的新!DataServer服務器部署好應用程序後啟動即可。這些!DataServer服務器會向!NameServer進行心跳匯報。!NameServer會根據!DataServer容量的比率和!DataServer的負載決定新數據寫往哪台!DataServer的服務器。根據寫入策略,容量較小,負載較輕的服務器新數據寫入的概率會比較高。同時,在集群負載比較輕的時候,!NameServer會對!DataServer上的Block進行均衡,使所有!DataServer的容量盡早達到均衡。

  進行均衡計劃時,首先計算每台機器應擁有的blocks平均數量,然後將機器劃分為兩堆,一堆是超過平均數量的,作為移動源;一類是低於平均數量的,作為移動目的。<

copyright © 萬盛學電腦網 all rights reserved