淘寶分布式文件系統TFS安裝配置手冊:內部實現
TFS文件名的結構
TFS的文件名由塊號和文件號通過某種對應關系組成,***長度為18字節。文件名固定以T開始,第二字節為該集群的編號(可以在配置項中指定,取值范圍 1~9)。余下的字節由Block ID和File ID通過一定的編碼方式得到。文件名由客戶端程序進行編碼和解碼,它映射方式如下圖:
TFS客戶程序在讀文件的時候通過將文件名轉換為BlockID和FileID信息,然后可以在!NameServer取得該塊所在!DataServer信息(如果客戶端有該Block與!DataServere的緩存,則直接從緩存中?。缓笈c!DataServer進行讀取操作。
TFS寫操作數據流
TFS系統中,nameserver會保證一個文件有多個副本存儲于不同的dataserver上以保證冗余。當由于dataserver服務器宕機或由于其他原因退出系統導致某些文件副本數量下降時,nameserver將會調度新的dataserver節點存儲文件備份。同樣為了保證數據一致性,當寫入一個文件時,只有所有參與的dataserver均寫入成功時,該操作才算成功。TFS的寫操作數據流圖如下所示:
客戶端首先向nameserver發起寫請求,nameserver需要根據dataserver上的可寫塊,容量和負載加權平均來選擇一個可寫的block。并且在該block所在的多個dataserver中選擇一個作為寫入的master,這個選擇過程也需要根據dataserver的負載以及當前作為master的次數來計算,使得每個dataserver作為master的機會均等。master一段選定,除非master宕機,不會更換,一旦master宕機,需要在剩余的dataserver中選擇新的master。返回一個dataserver列表。 客戶端向master dataserver開始數據寫入操作。master server將數據傳輸為其他的dataserver節點,只有當所有dataserver節點寫入均成功時,master server才會向nameserver和客戶端返回操作成功的信息。
獲得Block ID和File ID
根據TFS文件名解析出Block ID和block中的File ID。
獲取dataserver地址
向nameserver發送查詢請求得到Block ID所在的dataserver地址。
由于nameserver中維護了block和dataserver的對應關系,所以nameserver能夠提供相應的信息。
Note: 由于TFS是把大量小文件放在一個block里面,
所以TFS的文件復制是基于block的,而且復制出來的block的block id應該是一致的
請求文件
通過發送Block_ID、File_ID和offset為參數的讀請求到對應的dataserver,得到文件內容。
dataserver會根據本地記錄的信息來得到File ID所在block的偏移量,從而讀取到正確的文件內容.
TFS 在2.0版本增加了一個server, 叫做 rcserver. 這個 server 主要是為了淘寶內部管理使用 TFS 的各個應用. 我們給每個應用分配一個唯一的 AppKey. TFS 客戶端使用這個 AppKey 登錄到 rcserver, 取得自己應該訪問的 TFS 集群信息. 客戶端還會定期把自己的一些統計值發送給 rcserver. 具體信息可以參看源碼中 doc 目錄下的關于 rcserve 的文檔。