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