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























