FastDFS原理詳解

FastDFS原理

FastDFS是一個(gè)開(kāi)源的輕量級(jí)分布式文件系統(tǒng),純C實(shí)現(xiàn),目前提供了C、Java和PHP API。功能包括:文件存儲(chǔ),文件同步,文件訪問(wèn)(文件上傳、文件下載)等,解決了大容量存儲(chǔ)和負(fù)載均衡的問(wèn)題。特別適合以中小文件(建議范圍:4KB < file_size <500MB)為載體的在線服務(wù)。

Fast DFS系統(tǒng)有三個(gè)角色:跟蹤服務(wù)器(Tracker Server)、存儲(chǔ)服務(wù)器(Storage Server)和客戶端(Client)。client請(qǐng)求Tracker server 進(jìn)行文件上傳、下載,通過(guò)Tracker server調(diào)度最終由Storage server完成文件上傳和下載,在底層存儲(chǔ)上通過(guò)邏輯的分組概念,使得通過(guò)在同組內(nèi)配置多個(gè)Storage,從而實(shí)現(xiàn)軟RAID10。

  • Tracker server:跟蹤服務(wù)器,主要做調(diào)度工作,起到均衡的作用;負(fù)責(zé)管理所有的Storage server和group,每個(gè)storage在啟動(dòng)后會(huì)連接Tracker,告知自己所屬group等信息,并保持周期性心跳。tracker上的元信息都是由storage匯報(bào)的信息生成的,本身不需要持久化任何數(shù)據(jù),這樣使得tracker非常容易擴(kuò)展,直接增加tracker機(jī)器即可擴(kuò)展為tracker cluster來(lái)服務(wù),cluster里每個(gè)tracker之間是完全對(duì)等的,所有的tracker都接受stroage的心跳信息,生成元數(shù)據(jù)信息來(lái)提供讀寫(xiě)服務(wù),tracker根據(jù)storage的心跳信息,建立group==>[storage server list]的映射表。
  • Storage server:存儲(chǔ)服務(wù)器,主要提供容量和備份服務(wù);以group為單位,每個(gè)group內(nèi)部可以有多臺(tái)storage server,數(shù)據(jù)互為備份??蛻舳松蟼鞯奈募罱K存儲(chǔ)在storage服務(wù)器上,Storage server沒(méi)有實(shí)現(xiàn)自己的文件系統(tǒng),而是利用操作系統(tǒng)的文件系統(tǒng)來(lái)管理文件,可以將storage稱為存儲(chǔ)服務(wù)器。storage可配置多個(gè)數(shù)據(jù)存儲(chǔ)目錄,比如有10塊磁盤(pán),分別掛載在/data/disk1-/data/disk10,則可將這10個(gè)目錄都配置為storage的數(shù)據(jù)存儲(chǔ)目錄。
  • Client:客戶端,上傳下載數(shù)據(jù)的服務(wù)器,也就是我們自己的項(xiàng)目所部署在的服務(wù)器。FastDFS向使用者提供基本文件訪問(wèn)接口,比如upload、download、append、delete等,以客戶端庫(kù)的方式提供給用戶使用
image

跟蹤服務(wù)器和存儲(chǔ)節(jié)點(diǎn)都可以由一臺(tái)或多臺(tái)服務(wù)器構(gòu)成,跟蹤服務(wù)器和存儲(chǔ)節(jié)點(diǎn)均可以隨時(shí)增加或者下線不會(huì)影響線上服務(wù),其中跟蹤服務(wù)器中所有服務(wù)器是對(duì) 等,可以根據(jù)服務(wù)器壓力情況隨時(shí)增加或減少

文件的上傳

image

Storage server會(huì)連接集群中所有的Tracker server,定時(shí)向他們報(bào)告自己的狀態(tài),包括磁盤(pán)剩余空間、文件同步狀況、文件上傳下載次數(shù)等統(tǒng)計(jì)信息。

上傳的內(nèi)部機(jī)制如下:

  • 選擇tracker server

    當(dāng)集群中不止一個(gè)tracker server時(shí),由于tracker之間是完全對(duì)等無(wú)狀態(tài)的關(guān)系,當(dāng)集群中不止一個(gè)tracker server時(shí),由于tracker之間是完全對(duì)等的關(guān)系,客戶端在upload文件時(shí)可以任意選擇一個(gè)trakcer。 選擇存儲(chǔ)的group 當(dāng)tracker接收到upload file的請(qǐng)求時(shí),會(huì)為該文件分配一個(gè)可以存儲(chǔ)該文件的group,支持如下選擇group的規(guī)則:

    1. Round robin,所有的group間輪詢

    2. Specified group,指定某一個(gè)確定的group

    3. Load balance,剩余存儲(chǔ)空間多多group優(yōu)先

  • 選擇storage server

    當(dāng)選定group后,tracker會(huì)在group內(nèi)選擇一個(gè)storage server給客戶端,支持如下選擇storage的規(guī)則:

    1. Round robin,在group內(nèi)的所有storage間輪詢

    2. First server ordered by ip,按ip排序

    3. First server ordered by priority,按優(yōu)先級(jí)排序(優(yōu)先級(jí)在storage上配置)

  • 選擇storage path

    當(dāng)分配好storage server后,客戶端將向storage發(fā)送寫(xiě)文件請(qǐng)求,storage將會(huì)為文件分配一個(gè)數(shù)據(jù)存儲(chǔ)目錄,支持如下規(guī)則:

    1. Round robin,多個(gè)存儲(chǔ)目錄間輪詢
    2. 剩余存儲(chǔ)空間最多的優(yōu)先
  • 生成Fileid

    選定存儲(chǔ)目錄之后,storage會(huì)為文件生一個(gè)Fileid,由storage server ip、文件創(chuàng)建時(shí)間、文件大小、文件crc32和一個(gè)隨機(jī)數(shù)拼接而成,然后將這個(gè)二進(jìn)制串進(jìn)行base64編碼,轉(zhuǎn)換為可打印的字符串。 選擇兩級(jí)目錄 當(dāng)選定存儲(chǔ)目錄之后,storage會(huì)為文件分配一個(gè)fileid,每個(gè)存儲(chǔ)目錄下有兩級(jí)256*256的子目錄,storage會(huì)按文件fileid進(jìn)行兩次hash(猜測(cè)),路由到其中一個(gè)子目錄,然后將文件以fileid為文件名存儲(chǔ)到該子目錄下

  • 生成文件名

    當(dāng)文件存儲(chǔ)到某個(gè)子目錄后,即認(rèn)為該文件存儲(chǔ)成功,接下來(lái)會(huì)為該文件生成一個(gè)文件名,文件名由group、存儲(chǔ)目錄、兩級(jí)子目錄、fileid、文件后綴名(由客戶端指定,主要用于區(qū)分文件類(lèi)型)拼接而成

文件的下載

image

跟upload file一樣,在download file時(shí)客戶端可以選擇任意tracker server。tracker發(fā)送download請(qǐng)求給某個(gè)tracker,必須帶上文件名信息,tracke從文件名中解析出文件的group、大小、創(chuàng)建時(shí)間等信息,然后為該請(qǐng)求選擇一個(gè)storage用來(lái)服務(wù)讀請(qǐng)求。

定位文件:客戶端上傳文件后存儲(chǔ)服務(wù)器將文件ID返回給客戶端,此文件ID用于以后訪問(wèn)該文件的索引信息。文件索引信息包括:組名,虛擬磁盤(pán)路徑,數(shù)據(jù)兩級(jí)目錄,文件名。

image
  • 組名:文件上傳后所在的storage組名稱,在文件上傳成功后有storage服務(wù)器返回,需要客戶端自行保存。
  • 虛擬磁盤(pán)路徑:storage配置的虛擬路徑,與磁盤(pán)選項(xiàng)store_path*對(duì)應(yīng)。如果配置了store_path0則是M00,如果配置了store_path1則是M01,以此類(lèi)推。
  • 數(shù)據(jù)兩級(jí)目錄:storage服務(wù)器在每個(gè)虛擬磁盤(pán)路徑下創(chuàng)建的兩級(jí)目錄,用于存儲(chǔ)數(shù)據(jù)文件。
  • 文件名:與文件上傳時(shí)不同。是由存儲(chǔ)服務(wù)器根據(jù)特定信息生成,文件名包含:源存儲(chǔ)服務(wù)器IP地址、文件創(chuàng)建時(shí)間戳、文件大小、隨機(jī)數(shù)和文件拓展名等信息。
image

知道FastDFS FID的組成后,我們來(lái)看看FastDFS是如何通過(guò)這個(gè)精巧的FID定位到需要訪問(wèn)的文件:

  1. 通過(guò)組名tracker能夠很快的定位到客戶端需要訪問(wèn)的存儲(chǔ)服務(wù)器組,并將選擇合適的存儲(chǔ)服務(wù)器提供客戶端訪問(wèn)
  2. 存儲(chǔ)服務(wù)器根據(jù)“文件存儲(chǔ)虛擬磁盤(pán)路徑”和“數(shù)據(jù)文件兩級(jí)目錄”可以很快定位到文件所在目錄,并根據(jù)文件名找到客戶端需要訪問(wèn)的文件

同步時(shí)間管理

當(dāng)一個(gè)文件上傳成功后,客戶端馬上發(fā)起對(duì)該文件下載請(qǐng)求(或刪除請(qǐng)求)時(shí),tracker是如何選定一個(gè)適用的存儲(chǔ)服務(wù)器呢? 其實(shí)每個(gè)存儲(chǔ)服務(wù)器都需要定時(shí)將自身的信息上報(bào)給tracker,這些信息就包括了本地同步時(shí)間(即,同步到的最新文件的時(shí)間戳)。而tracker根據(jù)各個(gè)存儲(chǔ)服務(wù)器的上報(bào)情況,就能夠知道剛剛上傳的文件,在該存儲(chǔ)組中是否已完成了同步。同步信息上報(bào)如下圖:

image

寫(xiě)文件時(shí),客戶端將文件寫(xiě)至group內(nèi)一個(gè)storage server即認(rèn)為寫(xiě)文件成功,storage server寫(xiě)完文件后,會(huì)由后臺(tái)線程將文件同步至同group內(nèi)其他的storage server。

每個(gè)storage寫(xiě)文件后,同時(shí)會(huì)寫(xiě)一份binlog,binlog里不包含文件數(shù)據(jù),只包含文件名等元信息,這份binlog用于后臺(tái)同步,storage會(huì)記錄向group內(nèi)其他storage同步的進(jìn)度,以便重啟后能接上次的進(jìn)度繼續(xù)同步;進(jìn)度以時(shí)間戳的方式進(jìn)行記錄,所以最好能保證集群內(nèi)所有server的時(shí)鐘保持同步。

storage的同步進(jìn)度會(huì)作為元數(shù)據(jù)的一部分匯報(bào)到tracker上,tracke在選擇讀storage的時(shí)候會(huì)以同步進(jìn)度作為參考。 比如一個(gè)group內(nèi)有A、B、C三個(gè)storage server,A向C同步到進(jìn)度為T(mén)1 (T1以前寫(xiě)的文件都已經(jīng)同步到B上了),B向C同步到時(shí)間戳為T(mén)2(T2 > T1),tracker接收到這些同步進(jìn)度信息時(shí),就會(huì)進(jìn)行整理,將最小的那個(gè)做為C的同步時(shí)間戳,本例中T1即為C的同步時(shí)間戳為T(mén)1(即所有T1以前寫(xiě)的數(shù)據(jù)都已經(jīng)同步到C上了);同理,根據(jù)上述規(guī)則,tracker會(huì)為A、B生成一個(gè)同步時(shí)間戳。

集成Nginx

FastDFS通過(guò)Tracker服務(wù)器,將文件放在Storage服務(wù)器存儲(chǔ),但是同組存儲(chǔ)服務(wù)器之間需要進(jìn)入文件復(fù)制,有同步延遲的問(wèn)題。

假設(shè)Tracker服務(wù)器將文件上傳到了192.168.4.125,上傳成功后文件ID已經(jīng)返回給客戶端。此時(shí)FastDFS存儲(chǔ)集群機(jī)制會(huì)將這個(gè)文件同步到同組存儲(chǔ)192.168.4.126,在文件還沒(méi)有復(fù)制完成的情況下,客戶端如果用這個(gè)文件ID在192.168.4.126上取文件,就會(huì)出現(xiàn)文件無(wú)法訪問(wèn)的錯(cuò)誤。

而fastdfs-nginx-module可以重定向文件連接到文件上傳時(shí)的源服務(wù)器取文件,避免客戶端由于復(fù)制延遲導(dǎo)致的文件無(wú)法訪問(wèn)錯(cuò)誤。

另外,使用nginx反向代理后,后端可以以HTTP請(qǐng)求的方式來(lái)訪問(wèn)文件資源。訪問(wèn)nginx反向代理+上傳文件時(shí)的ID

MooseFS原理

MooseFS 是一款具有冗余容錯(cuò)功能的分布式文件系統(tǒng)。它把數(shù)據(jù)分散在多臺(tái)服務(wù)器上,確保一份數(shù)據(jù)多個(gè)備份副本,對(duì)外提供統(tǒng)一的結(jié)構(gòu)。對(duì)于標(biāo)準(zhǔn)的文件操作,MooseFS 表現(xiàn)與其他類(lèi)Unix文件系統(tǒng)一致。 支持的通過(guò)文件系統(tǒng)特性:

  • 層次結(jié)構(gòu)(目錄樹(shù))

  • 兼容 POSIX 文件屬性

  • 支持特殊文件

  • 符號(hào)鏈接和硬鏈接

  • 基于 IP 地址和密碼的訪問(wèn)控制

  • 高可靠性(數(shù)據(jù)的多個(gè)副本存儲(chǔ)在不同服務(wù)器)

  • 容量動(dòng)態(tài)擴(kuò)展(添加新硬盤(pán)或者服務(wù)器)

  • 可以回收在制定時(shí)間內(nèi)刪除的文件,類(lèi)似回收站功能

  • 可以對(duì)整個(gè)文件甚至是正在被寫(xiě)入的文件創(chuàng)建文件快照

MooseFS架構(gòu)中的四種角色

  • 管理服務(wù)器(Master Server):也稱為元數(shù)據(jù)服務(wù)器,負(fù)責(zé)管理各個(gè)數(shù)據(jù)存儲(chǔ)服務(wù)器,調(diào)度文件讀寫(xiě),回收文件空間以及恢復(fù)多節(jié)點(diǎn)拷貝。目前MFS只支持一個(gè)元數(shù)據(jù)服務(wù)器master,這是一個(gè)單點(diǎn)故障,需要一個(gè)性能穩(wěn)定的服務(wù)器來(lái)充當(dāng)
  • 元數(shù)據(jù)日志服務(wù)器(Metalogger Server):負(fù)責(zé)備份管理服務(wù)器的變化日志文件,文件類(lèi)型為changelog_ml.*.mfs,以便于在管理服務(wù)器出問(wèn)題時(shí)接替其進(jìn)行工作。元數(shù)據(jù)日志服務(wù)器是mfs 1.6以后版本新增的服務(wù),可以把元數(shù)據(jù)日志保留在管理服務(wù)器中,也可以單獨(dú)存儲(chǔ)在一臺(tái)服務(wù)器中。為保證數(shù)據(jù)的安全性和可靠性,建議單獨(dú)用一臺(tái)服務(wù)器來(lái)存放元數(shù)據(jù)日志。需要注意的是,元數(shù)據(jù)日志守護(hù)進(jìn)程跟管理服務(wù)器在同一個(gè)服務(wù)器上,備份元數(shù)據(jù)日志服務(wù)器作為它的客戶端,從管理服務(wù)器取得日志文件進(jìn)行備份
  • 數(shù)據(jù)存儲(chǔ)服務(wù)器(Chunk Server):數(shù)據(jù)存儲(chǔ)服務(wù)器是真正存儲(chǔ)用戶數(shù)據(jù)的服務(wù)器,負(fù)責(zé)連接管理服務(wù)器,聽(tīng)從管理服務(wù)器調(diào)度,提供存儲(chǔ)空間,并為客戶提供數(shù)據(jù)傳輸。在存儲(chǔ)文件時(shí),首先把文件分成塊,然后將這些塊在數(shù)據(jù)存儲(chǔ)服務(wù)器之間互相復(fù)制
  • 客戶端(Client):通過(guò)FUSE內(nèi)核接口掛載遠(yuǎn)程管理服務(wù)器上所管理的數(shù)據(jù)存儲(chǔ)服務(wù)器,使共享的文件系統(tǒng)和使用本地文件系統(tǒng)的效果看起來(lái)是一樣的
image

讀機(jī)制

image
  1. 首先客戶端(Client)訪問(wèn)主服務(wù)器(Master),獲取文件實(shí)體的位置等相關(guān)信息
  2. 主服務(wù)器(Master)查詢緩存記錄,把文件實(shí)體的位置等相關(guān)信息發(fā)給客戶端(Client)
  3. 客戶端(Client)根據(jù)拿到的信息去訪問(wèn)對(duì)應(yīng)的存儲(chǔ)實(shí)體數(shù)據(jù)的服務(wù)器(Chunk Server)
  4. 存儲(chǔ)實(shí)體數(shù)據(jù)的服務(wù)器(Chunk Server)把對(duì)應(yīng)的數(shù)據(jù)返回給客戶端(Client)

寫(xiě)機(jī)制

image
  1. 客戶端(Client)訪問(wèn)主服務(wù)器(Master),請(qǐng)求寫(xiě)入數(shù)據(jù)
  2. 主服務(wù)器(Master)查詢緩存記錄,如果是新文件,則聯(lián)系后面的數(shù)據(jù)服務(wù)器(Chunk Server)創(chuàng)建對(duì)應(yīng)的chunk對(duì)象準(zhǔn)備存放文件
  3. 數(shù)據(jù)服務(wù)器(Chunk Server)返回創(chuàng)建chunk對(duì)象成功的消息給主服務(wù)器(Master)
  4. 主服務(wù)器(Master)把文件實(shí)體的位置等相關(guān)信息發(fā)給客戶端(Client)
  5. 客戶端(Client)訪問(wèn)對(duì)應(yīng)的數(shù)據(jù)服務(wù)器(Chunk Server)寫(xiě)數(shù)據(jù)
  6. 數(shù)據(jù)服務(wù)器(Chunk Server)之間進(jìn)行數(shù)據(jù)同步,互相確認(rèn)成功
  7. 數(shù)據(jù)服務(wù)器(Chunk Server)返回成功寫(xiě)入信息給客戶端(Client)
  8. 客戶端(Client)回報(bào)給主服務(wù)器(Master)寫(xiě)入結(jié)束

MooseFS VS FastDFS

對(duì)比說(shuō)明 / 文件系統(tǒng) FastDFS MooseFS
開(kāi)發(fā)語(yǔ)言 C perl
性能 很高 相對(duì)較差
易用性 安裝簡(jiǎn)單,社區(qū)相對(duì)活躍,不需要二次開(kāi)發(fā)即可直接使用 安裝簡(jiǎn)單,官方文檔多,且提供Web界面的方式進(jìn)行管理與監(jiān)控
適用場(chǎng)景 單集群的中小文件 單集群的大中文件
在線擴(kuò)容 支持 支持
冗余備份 支持 支持
單點(diǎn)故障 不存在 存在
跨集群同步 部分支持 不支持
數(shù)據(jù)存儲(chǔ)方式 文件/塊
FUSE掛載 不支持 支持
訪問(wèn)接口 不支持POSIX 支持POSIX
  • FUSE掛載:fuse解決了文件系統(tǒng)必須在內(nèi)核態(tài)的的難題。實(shí)現(xiàn)了一個(gè)對(duì)文件系統(tǒng)訪問(wèn)的回調(diào),它使無(wú)特權(quán)的用戶能夠無(wú)需編輯內(nèi)核代碼而創(chuàng)建自己的文件系統(tǒng)

  • POSIX:表示可移植操作系統(tǒng)接口(Portable Operating System Interface of UNIX,縮寫(xiě)為 POSIX ),也就是Unix下應(yīng)用程序共同遵循的一種規(guī)范。支持POSIX的應(yīng)用程序意味著在各個(gè)Unix系統(tǒng)間提供了跨平臺(tái)運(yùn)行的支持。

例如:#include <pthread.h> //在Linux下編寫(xiě)多線程程序需要包含的頭文件

POSIX線程(POSIX threads),簡(jiǎn)稱Pthreads,是線程的POSIX標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)定義了創(chuàng)建和操縱線程的一整套API。在類(lèi)Unix操作系統(tǒng)(Unix、Linux、Mac OS X等)中,都使用Pthreads作為操作系統(tǒng)的線程。Windows操作系統(tǒng)也有其移植版pthreads-win32。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容