-
TFS
鎖定
目錄
- 1 特性
- 2 總體架構
- ▪ NameServer
- ▪ DataServer
- 3 存儲機制
- ▪ Block的存儲方式
- ▪ 文件名結構
- 4 併發機制
- 5 容錯機制
- ▪ 集羣容錯
- ▪ NameServer容錯
- ▪ DataServer容錯
- 6 平滑擴容
TFS特性
2。 使用HA架構和平滑擴容
[2]
3。 支持多種客户端
[2]
7。 Resource Center Server,用於管理TFS集羣的用户資源配置
[2]
9。 優化數據流,讓寫請求儘可能均勻的分佈在不同的DataServer
[2]
TFS總體架構
一個TFS集羣由兩個NameServer節點(一主一備)和多個DataServer節點組成。這些服務程序都是作為一個用户級的程序運行在普通Linux機器上的
[3]
。
同時為了考慮容災,NameServer採用了HA結構,即兩台機器互為熱備,同時運行,一台為主,一台為備,主機綁定到對外vip,提供服務;當主機器宕機後,迅速將vip綁定至備份NameServer,將其切換為主機,對外提供服務。圖1中的HeartAgent就完成了此功能
[2]
。
TFS的設計目標是海量小文件的存儲,所以在TFS中,將大量的小文件(實際數據文件)合併成為一個大文件,這個大文件稱為塊(Block), 每個Block擁有在集羣內唯一的編號(BlockId),Block Id在NameServer在創建Block的時候分配, NameServer維護block與DataServer的關係。Block中的實際數據都存儲在DataServer上。而一台DataServer服務器一般會有多個獨立DataServer進程存在,每個進程負責管理一個掛載點,這個掛載點一般是一個獨立磁盤上的文件目錄,以降低單個磁盤損壞帶來的影響
[2]
。
TFSNameServer
正常情況下,一個塊會在DataServer上存在, 主NameServer負責Block的創建,刪除,複製,均衡,整理, NameServer不負責實際數據的讀寫,實際數據的讀寫由DataServer完成
[2]
。
TFSDataServer
TFS的塊大小可以通過配置項來決定,通常使用的塊大小為64M。TFS的設計目標是海量小文件的存儲,所以每個塊中會存儲許多不同的小文件。DataServer進程會給Block中的每個文件分配一個ID(File ID,該ID在每個Block中唯一),並將每個文件在Block中的信息存放在和Block對應的Index文件中。這個Index文件一般都會全部存放在內存,除非出現DataServer服務器內存和集羣中所存放文件平均大小不匹配的情況
[2]
。
另外,還可以部署一個對等的TFS集羣,作為當前集羣的輔集羣。輔集羣不提供來自應用的寫入,只接受來自主集羣的寫入。當前主集羣的每個數據變更操作都會重放至輔集羣。輔集羣也可以提供對外的讀,並且在主集羣出現故障的時候,可以接管主集羣的工作
[1]
。
TFS存儲機制
TFSBlock的存儲方式
在TFS中,將大量的小文件(實際用户文件)合併成為一個大文件,這個大文件稱為塊(Block)。TFS以Block的方式組織文件的存儲。每一個Block在整個集羣內擁有唯一的編號,這個編號是由NameServer進行分配的,而DataServer上實際存儲了該Block。在NameServer節點中存儲了所有的Block的信息,一個Block存儲於多個DataServer中以保證數據的冗餘。對於數據讀寫請求,均先由NameServer選擇合適的DataServer節點返回給客户端,再在對應的DataServer節點上進行數據操作。NameServer需要維護Block信息列表,以及Block與DataServer之間的映射關係,其存儲的元數據結構如下
[2]
:
在DataServer節點上,在掛載目錄上會有很多物理塊,物理塊以文件的形式存在磁盤上,並在DataServer部署前預先分配,以保證後續的訪問速度和減少碎片產生。為了滿足這個特性,DataServer現一般在EXT4文件系統上運行。物理塊分為主塊和擴展塊,一般主塊的大小會遠大於擴展塊,使用擴展塊是為了滿足文件更新操作時文件大小的變化。每個Block在文件系統上以“主塊+擴展塊”的方式存儲。每一個Block可能對應於多個物理塊,其中包括一個主塊,多個擴展塊
[2]
。
在DataServer端,每個Block可能會有多個實際的物理文件組成:一個主Physical Block文件,N個擴展Physical Block文件和一個與該Block對應的索引文件。Block中的每個小文件會用一個block內唯一的fileid來標識。DataServer會在啓動的時候把自身所擁有的Block和對應的索引文件加載進來
[2]
。
TFS文件名結構
TFS的文件名由塊號和文件號通過某種對應關係組成,最大長度為18字節。文件名固定以T開始,第二字節為該集羣的編號(可以在配置項中指定,取值範圍 1~9)。餘下的字節由Block ID和File ID通過一定的編碼方式得到。文件名由客户端程序進行編碼和解碼,它映射方式如下圖
[2]
:
TFS客户程序在讀文件的時候通過將文件名轉換為BlockID和FileID信息,然後可以在NameServer取得該塊所在DataServer信息(如果客户端有該Block與DataServere的緩存,則直接從緩存中取),然後與DataServer進行讀取操作。
[2]
TFS併發機制
對於同一個文件來説,多個用户可以併發讀
[2]
。
現有TFS並不支持併發寫一個文件。一個文件只會有一個用户在寫。這在TFS的設計裏面對應着是一個block同時只能有一個寫或者更新操作
[2]
。
TFS容錯機制
TFS集羣容錯
TFS可以配置主輔集羣,一般主輔集羣會存放在兩個不同的機房。主集羣提供所有功能,輔集羣只提供讀。主集羣會把所有操作重放到輔集羣。這樣既提供了負載均衡,又可以在主集羣機房出現異常的情況不會中斷服務或者丟失數據
[2]
。
TFSNameServer容錯
Namserver主要管理了DataServer和Block之間的關係。如每個DataServer擁有哪些Block,每個Block存放在哪些DataServer上等。同時,NameServer採用了HA結構,一主一備,主NameServer上的操作會重放至備NameServer。如果主NameServer出現問題,可以實時切換到備NameServer
[2]
。
另外NameServer和DataServer之間也會有定時的heartbeat,DataServer會把自己擁有的Block發送給NameServer。NameServer會根據這些信息重建DataServer和Block的關係
[2]
。
TFSDataServer容錯
TFS採用Block存儲多份的方式來實現DataServer的容錯。每一個Block會在TFS中存在多份,一般為3份,並且分佈在不同網段的不同DataServer上。對於每一個寫入請求,必須在所有的Block寫入成功才算成功。當出現磁盤損壞DataServer宕機的時候,TFS啓動複製流程,把備份數未達到最小備份數的Block儘快複製到其他DataServer上去。 TFS對每一個文件會記錄校驗crc,當客户端發現crc和文件內容不匹配時,會自動切換到一個好的block上讀取。此後客户端將會實現自動修復單個文件損壞的情況
[2]
。
TFS平滑擴容
原有TFS集羣運行一定時間後,集羣容量不足,此時需要對TFS集羣擴容。由於DataServer與NameServer之間使用心跳機制通信,如果系統擴容,只需要將相應數量的新DataServer服務器部署好應用程序後啓動即可。這些DataServer服務器會向NameServer進行心跳彙報。NameServer會根據DataServer容量的比率和DataServer的負載決定新數據寫往哪台DataServer的服務器。根據寫入策略,容量較小,負載較輕的服務器新數據寫入的概率會比較高。同時,在集羣負載比較輕的時候,NameServer會對DataServer上的Block進行均衡,使所有DataServer的容量儘早達到均衡
[2]
。
移動目的的選擇:首先一個block的移動的源和目的,應該保持在同一網段內,也就是要與另外的block不同網段;另外,在作為目的的一定機器內,優先選擇同機器的源到目的之間移動,也就是同台DataServer服務器中的不同DataServer進程
[2]
。
在創建複製計劃時,一次要複製多個block, 每個block的複製源和目的都要儘可能的不同,並且保證每個block在不同的子網段內。因此採用輪換選擇(roundrobin)算法,並結合加權平均
[2]
。
由於DataServer之間的通信是主要發生在數據寫入轉發的時候和數據複製的時候,集羣擴容基本沒有影響。假設一個Block為64M,數量級為1。那麼NameServer上會有 1 * 1024 * 1024 * 1024 / 64 = 16。7M個block。假設每個Block的元數據大小為0.1K,則佔用內存不到2G
[2]
。
- 參考資料
-
- 1. 翟猛. 基於TFS的分佈式文件存儲平台研究與實現[D].河北工業大學 .知網.2015[引用日期2020-04-27]
- 2. tfs .github[引用日期2020-4-27]
- 3. 趙洋.淘寶TFS深度剖析[J].數字化用户:58-59 .知網.2013-3-19[引用日期2020-04-27]