TFS介紹

簡介

TFS主要針對海量非結構化(結構化的數據是指像mysql中的數據,非結構化就是像NOSQL中的數據)的小數據,通常的文件大小不超過1M,可以滿足對小文件存儲的需求.

採用了HA架構:HA架構就是高可用的縮寫,有一個活動節點和備份節點,當活動節點掛了的時候,備份節點會監測到,然後代替活動節點進行工作.

平滑擴容: 下面會說到

扁平化數據組織結構,可將文件名映射到文件的物理地址,簡化了文件的訪問流程,一定程度上爲TFS提供了良好的讀寫性能

TFS的總體結構

一個TFS集羣由兩個NameServer節點(一主一備),和多個DataServer節點組成.這些服務程序都是作爲一個用戶級的普通程序運行在Linux虛擬機上的

在TFS中.將大量的小文件(就是傳過來的圖片之類的)合併成一個大文件,這個大文件稱爲Block(塊),每個Block塊擁有一個集羣內唯一的BlockId 這是由NameServer創建Block時分配的,NameServer負責維護Block和DataServer的關係,Block的信息(Block元文件)都儲存在NameServer上,而Block實際的數據都儲存在DataServer上.每臺DataServer服務器上基本都會有很多DataServer進程,他們通常掛載在一個獨立的磁盤文件目錄(分區),以降低磁盤損壞帶來的影響.

12350543-1ffc887fcb86fd05.png
TFS的流程圖

NameServer的主要功能:
管理維護Block和DataServer相關信息,包括!DataServer加入,退出, 心跳信息, block和!DataServer的對應關係建立,解除。

正常情況下,一個塊會在!DataServer上存在, 主NameServer負責Block的創建,刪除,複製,均衡,整理, NameServer不負責實際數據的讀寫,實際數據的讀寫由!DataServer完成。

NameServer的主機綁定對外VIP(就是主機的IP) 提供服務,當主機宕機之後,迅速將VIP綁定至備份NameServer 將其切換爲主機,對外提供服務,HeartAgent完成此功能

DataServer主要功能: 負責實際數據的存儲和讀寫。

12350543-a165b07c97c34570.png
image.png

理解了上圖中所有組件的作用

HeartAgent 負責監聽NameServer(主機) 和Slave NameServer(從機) 主機從機之間

Sync Data 同步數據 NameServer 中關於Block的信息都儲存在內存中,所以速度很快

app訪問NameServer主機.然後NameServer主機給app分配DataServer和Block 然後app在上面讀和寫

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

TFS還支持跨集羣同步

可以再創建一個和TFS對等的集羣,由主集羣負責寫入這個集羣 和同步數據 這個集羣只對外提供讀的功能, 當主機羣掛了的時候,這個集羣會自動頂上去.

平滑擴容:

由於NameServer和DataServer 之間是通過心跳機制來通信的,如果集羣需要擴容,只需要將新的DataServer服務器部署好,然後啓動即可.這些DataServer服務器會像NameServer發送心跳彙報 . NameServer的寫入策略是 在容量較小,負載較輕的服務器寫入新數據的概率會比較高, 同時.在集羣負載較輕的時候, NameServer 會對所有的DataServer 和Block進行均衡. 使所有的DataServer容器儘早達到均衡.

均衡移動的原理和過程(感覺不是很重要,直接看了一遍然後copy過來)

進行均衡計劃時,首先計算每臺機器應擁有的blocks平均數量,然後將機器劃分爲兩堆,一堆是超過平均數量的,作爲移動源;一類是低於平均數量的,作爲移動目的。
移動目的的選擇:首先一個block的移動的源和目的,應該保持在同一網段內,也就是要與另外的block不同網段;另外,在作爲目的的一定機器內,優先選擇同機器的源到目的之間移動,也就是同臺!DataServer服務器中的不同!DataServer進程。
當有服務器故障或者下線退出時(單個集羣內的不同網段機器不能同時退出),不影響TFS的服務。此時!NameServer會檢測到備份數減少的Block,對這些Block重新進行數據複製。
在創建複製計劃時,一次要複製多個block, 每個block的複製源和目的都要儘可能的不同,並且保證每個block在不同的子網段內。因此採用輪換選擇(roundrobin)算法,並結合加權平均。
由於DataServer之間的通信是主要發生在數據寫入轉發的時候和數據複製的時候,集羣擴容基本沒有影響。假設一個Block爲64M,數量級爲1PB。那麼NameServer上會有 1 * 1024 * 1024 * 1024 / 64 = 16.7M個block。假設每個Block的元數據大小爲0.1K,則佔用內存不到2G。

容錯機制(高可用):

TFS有四重容錯機制(我覺得應該算四層,官方文檔裏面是三層)

1.集羣容錯:(已瞭解,直接copy過來,不知道我們會不會部署多個集羣呢0.0)
TFS可以配置主輔集羣,一般主輔集羣會存放在兩個不同的機房。主集羣提供所有功能,輔集羣只提供讀。主集羣會把所有操作重放到輔集羣。這樣既提供了負載均衡,又可以在主集羣機房出現異常的情況不會中斷服務或者丟失數據。

2.NameServer容錯:
NameServer採用了HA結構,一主一備,主NameServer上的操作會重放至備NameServer。如果主NameServer出現問題,可以實時切換到備NameServer。

另外: NameServer 與DataServer之間也有心跳機制.DataServer 會將他的Block的信息定時發送到NameServer上, NameServer會根據這些信息重建Block和DataServer的關係(這裏高版本的TFS已經不將這個功能放到心跳機制裏了,心跳機制只用來檢查DataServer是否還活着,以及有沒有其他的DataServer加入).

3.DataServer容錯:
TFS採用備份多個Block來實現DataServer容錯,每個Block 在集羣中存在多份,並且他們分別部署在不同網段的不同DataServer上,一般爲3份,我記得可以通過配置max_Block....來修改,正是因爲這樣,如果你只有一臺DataServer的時候,那麼你的這個屬性就要改爲1 否則不能啓動TFS

對於每一個寫入請求.必須等待所有的Block備份完成之後纔算寫入成功.當出現磁盤損壞或者DataServer宕機的時候,TFS會啓動複製流程,通過心跳機制獲得這些DataServer上Block的信息,把那備份數小於3的Block儘快複製到其他的DataServer上去.

4.對單個文件的容錯:
TFS對每一個文件會記錄校驗crc ,當客戶端訪問這個文件的時候發現crc和文件內容不匹配的時候,會自動切換到一個好的Block上去讀取.此後客戶端會修復單個文件損壞的情況.

併發機制:

對同一個文件來說,TFS支持併發的讀 ,但是不支持併發的寫入,其實單個Block塊也是不支持併發的寫入

TFS文件結構:

TFS的文件名由塊號和文件號通過某種對應關係組成,最大長度爲18字節。文件名固定以T開始,第二字節爲該集羣的編號(可以在配置項中指定,取值範圍 1~9)。餘下的字節由Block ID和File ID通過一定的編碼方式得到。文件名由客戶端程序進行編碼和解碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章