FastDFS 原理篇

分布式存儲(chǔ)選型

這里主要說(shuō)下按需求選取和使用

在這之前使用過(guò)glusterfs 分布式存儲(chǔ),使用過(guò)程中部署比較簡(jiǎn)單,也容易上手.但是存在如下幾個(gè)問(wèn)題:

  • 使用glusterfs 主要走的是網(wǎng)絡(luò)帶寬,內(nèi)網(wǎng)使用率問(wèn)題.客戶端掛載存在單點(diǎn)問(wèn)題.我曾經(jīng)嘗試過(guò)使用內(nèi)網(wǎng)搭建一套DNS服務(wù)器,做負(fù)載均衡使用.解決單點(diǎn)問(wèn)題.但是由于使用的服務(wù)器廠商,
    無(wú)法自己?jiǎn)伍g一套DNS輪訓(xùn)的機(jī)制.
如果想要深入了解,請(qǐng)移步

[glusterfs詳解](http://www.liuwq.com/2017/04/20/glusterfs%E8%AF%A6%E8%A7%A3/)
[glusterfs集群搭建](http://www.liuwq.com/2017/04/11/glusterfs%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA/)

  • 開(kāi)源的東西,大家都知道肯定存在一些BUG,以及使用和配置的東西.
  • 總結(jié)下:如果對(duì)于客戶端掛載單點(diǎn)問(wèn)題,不是很在意的,可以使用這個(gè)分布式存儲(chǔ),廉價(jià)\簡(jiǎn)單易于維護(hù).

主要介紹下Glusterfs與FastDFS對(duì)比

指標(biāo) FastDFS Glusterfs
適合類型 建議4KB - 500MB 適合大文件存儲(chǔ)
文件分布 小文件合并存儲(chǔ) 不分片處理 AFR (raid1)
Stripe( raid0 )
DHT(彈性哈希)
系統(tǒng)性能 1.很高(未使用數(shù)據(jù)庫(kù)),文件訪問(wèn)點(diǎn)對(duì)點(diǎn)不經(jīng)過(guò) tracker中轉(zhuǎn)
2.無(wú)法動(dòng)態(tài)調(diào)整磁盤(pán)空間負(fù)載.
3.客戶端需要記錄存儲(chǔ)信息
無(wú)元數(shù)據(jù)服務(wù)器
復(fù)雜度 簡(jiǎn)單( tracker和 storage兩個(gè)角色) 簡(jiǎn)單
是否支持 FUSE 不支持 支持
是否支持POSIX 不支持 支持
備份機(jī)制 分組組內(nèi)備份 鏡像
通訊協(xié)議接口 原生API\HTTP IP/RDMA
活躍度 國(guó)內(nèi)使用比較多 使用較多

FastDFS

介紹

FastDFS 是一個(gè) C 語(yǔ)言實(shí)現(xiàn)的開(kāi)源輕量級(jí)分布式文件系統(tǒng),作者余慶(happyfish100),支持
Linux籽孙、 FreeBSD、 AID 等 Unix 系統(tǒng),解決了大數(shù)據(jù)存儲(chǔ)和讀寫(xiě)負(fù)載均衡等問(wèn)題,適合存儲(chǔ) 4KB~500MB
之間的小文件,如圖片網(wǎng)站令杈、短視頻網(wǎng)站漫雕、文檔滩援、app 下載站等,UC卷要、京東赂苗、支付寶盏触、迅雷渗蟹、酷狗
等都有使用,其中 UC 基于 FastDFS 向用戶提供網(wǎng)盤(pán)、廣告和應(yīng)用下載的業(yè)務(wù)的存儲(chǔ)服務(wù) FastDFS
與 MogileFS赞辩、HDFS雌芽、TFS 等都不是系統(tǒng)級(jí)的分布式文件系統(tǒng),而是應(yīng)用級(jí)的分布式文件存儲(chǔ)服務(wù).

開(kāi)源地址:

舊地址:

相關(guān)文檔:

架構(gòu)

FastDFS 服務(wù)有三個(gè)角色:跟蹤服務(wù)器(tracker server)、存儲(chǔ)服務(wù)器(storage server)和
客戶端(client)

tracker server:跟蹤服務(wù)器,主要做調(diào)度工作,起到均衡的作用;負(fù)責(zé)管理所有的 storage server
和 group,每個(gè) storage 在啟動(dòng)后會(huì)連接 Tracker,
告知自己所屬 group 等信息,并保持周期性心跳,
Tracker 根據(jù) storage 心跳信息,建立 group--->[storage server list]的映射表;tracker 管理
的元數(shù)據(jù)很少,會(huì)直接存放在內(nèi)存;tracker 上的元信息都是由 storage 匯報(bào)的信息生成的,本身
不需要持久化任何數(shù)據(jù),tracker 之間是對(duì)等關(guān)系,因此擴(kuò)展 tracker 服務(wù)非常容易,之間增加
tracker 服務(wù)器即可,所有 tracker 都接受 stroage 心跳信息,生成元數(shù)據(jù)信息來(lái)提供讀寫(xiě)服務(wù)(與
其他 Master-Slave 架構(gòu)的優(yōu)勢(shì)是沒(méi)有單點(diǎn),tracker 也不會(huì)成為瓶頸,最終數(shù)據(jù)是和一個(gè)可用的
Storage Server 進(jìn)行傳輸?shù)?

storage server:存儲(chǔ)服務(wù)器,主要提供容量和備份服務(wù);以 group 為單位,每個(gè) group 內(nèi)可以包
含多臺(tái) storage server,數(shù)據(jù)互為備份,存儲(chǔ)容量空間以 group 內(nèi)容量最小的 storage 為準(zhǔn);建
議 group 內(nèi)的 storage server 配置相同;以 group 為單位組織存儲(chǔ)能夠方便的進(jìn)行應(yīng)用隔離辨嗽、負(fù)
載均衡和副本數(shù)定制;缺點(diǎn)是 group 的容量受單機(jī)存儲(chǔ)容量的限制,同時(shí) group 內(nèi)機(jī)器壞掉,數(shù)據(jù)
恢復(fù)只能依賴 group 內(nèi)其他機(jī)器重新同步(壞盤(pán)替換,重新掛載重啟 fdfs_storaged 即可)

多個(gè) group 之間的存儲(chǔ)方式有 3 種策略:round robin(輪詢)世落、load balance(選擇最大剩余空
間的組上傳文件)、specify group(指定 group 上傳)

group 中 storage 存儲(chǔ)依賴本地文件系統(tǒng),
storage 可配置多個(gè)數(shù)據(jù)存儲(chǔ)目錄,
磁盤(pán)不做 raid,
直接分別掛載到多個(gè)目錄,將這些目錄配置為 storage 的數(shù)據(jù)目錄即可

storage 接受寫(xiě)請(qǐng)求時(shí),會(huì)根據(jù)配置好的規(guī)則,選擇其中一個(gè)存儲(chǔ)目錄來(lái)存儲(chǔ)文件;為避免單
個(gè)目錄下的文件過(guò)多,storage 第一次啟時(shí),會(huì)在每個(gè)數(shù)據(jù)存儲(chǔ)目錄里創(chuàng)建 2 級(jí)子目錄,每級(jí) 256
個(gè),總共 65536 個(gè),新寫(xiě)的文件會(huì)以 hash 的方式被路由到其中某個(gè)子目錄下,然后將文件數(shù)據(jù)直
接作為一個(gè)本地文件存儲(chǔ)到該目錄中

image

總結(jié):1.高可靠性:無(wú)單點(diǎn)故障 2.高吞吐性:只要 Group 足夠多,數(shù)據(jù)流量是足夠分散的

image

FastDFS 提供基本的文件訪問(wèn)接口,如 upload糟需、download屉佳、append、delete 等

選擇 tracker server

集群中 tracker 之間是對(duì)等關(guān)系,客戶端在上傳文件時(shí)可用任意選擇一個(gè) tracker

選擇存儲(chǔ) group

當(dāng) tracker 接收到 upload file 的請(qǐng)求時(shí),會(huì)為該文件分配一個(gè)可以存儲(chǔ)文件的 group,目前
支持選擇 group 的規(guī)則為:

  • Round robin,所有 group 輪詢使用
  • Specified group,指定某個(gè)確定的 group
  • Load balance,剩余存儲(chǔ)空間較多的 group 優(yōu)先

選擇 storage server

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

  • Round robin,所有 server 輪詢使用(默認(rèn))
  • 根據(jù) IP 地址進(jìn)行排序選擇第一個(gè)服務(wù)器(IP 地址最小者)
  • 根據(jù)優(yōu)先級(jí)進(jìn)行排序(上傳優(yōu)先級(jí)由 storage server 來(lái)設(shè)置,參數(shù)為 upload_priority)

選擇 storage path(磁盤(pán)或者掛載點(diǎn))

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

  • round robin,輪詢(默認(rèn))
  • load balance,選擇使用剩余空間最大的存儲(chǔ)路徑

選擇下載服務(wù)器

目前支持的規(guī)則為:

  • 輪詢方式,可以下載當(dāng)前文件的任一 storage server
  • 從源 storage server 下載

生成 file_id

選擇存儲(chǔ)目錄后,storage 會(huì)生成一個(gè) file_id,采用 Base64 編碼,包含字段包括:storage
server ip洲押、文件創(chuàng)建時(shí)間武花、文件大小、文件 CRC32 校驗(yàn)碼和隨機(jī)數(shù);每個(gè)存儲(chǔ)目錄下有兩個(gè) 256*256
個(gè)子目錄,storage 會(huì)按文件 file_id 進(jìn)行兩次 hash,路由到其中一個(gè)子目錄,,然后將文件已
file_id 為文件名存儲(chǔ)到該子目錄下,最后生成文件路徑:group 名稱杈帐、虛擬磁盤(pán)路徑体箕、數(shù)據(jù)兩級(jí)
目錄、file_id

image

其中,組名:文件上傳后所在的存儲(chǔ)組的名稱,在文件上傳成功后由存儲(chǔ)服務(wù)器返回,需要客戶端
自行保存

虛擬磁盤(pán)路徑:存儲(chǔ)服務(wù)器配置的虛擬路徑,與磁盤(pán)選項(xiàng) store_path*參數(shù)對(duì)應(yīng)

數(shù)據(jù)兩級(jí)目錄:存儲(chǔ)服務(wù)器在每個(gè)虛擬磁盤(pán)路徑下創(chuàng)建的兩級(jí)目錄,用于存儲(chǔ)數(shù)據(jù)文件

同步機(jī)制

新增 tracker 服務(wù)器數(shù)據(jù)同步問(wèn)題

由于 storage server 上配置了所有的 tracker server,storage server 和 tracker
server 之間的通信是由 storage server 主動(dòng)發(fā)起的,storage server 為每個(gè) tracker
server 啟動(dòng)一個(gè)線程進(jìn)行通信;在通信過(guò)程中,若發(fā)現(xiàn)該 tracker server 返回的本組
storage server 列表比本機(jī)記錄少,就會(huì)將該 tracker server 上沒(méi)有的 storage server
同步給該 tracker,這樣的機(jī)制使得 tracker 之間是對(duì)等關(guān)系,數(shù)據(jù)保持一致

新增 storage 服務(wù)器數(shù)據(jù)同步問(wèn)題

若新增 storage server 或者其狀態(tài)發(fā)生變化,tracker server 都會(huì)將 storage server
列表同步給該組內(nèi)所有 storage server;以新增 storage server 為例,因?yàn)樾录尤氲?br> storage server 會(huì)主動(dòng)連接 tracker server,tracker server 發(fā)現(xiàn)有新的 storage server
加入,就會(huì)將該組內(nèi)所有的 storage server 返回給新加入的 storage server,并重新將
該組的 storage server 列表返回給該組內(nèi)的其他 storage server;

組內(nèi) storage 數(shù)據(jù)同步問(wèn)題

組內(nèi) storage server 之間是對(duì)等的,
文件上傳娘荡、
刪除等操作可以在組內(nèi)任意一臺(tái) storage
server 上進(jìn)行干旁。文件同步只能在同組內(nèi)的 storage server 之間進(jìn)行,采用 push 方式,
即源服務(wù)器同步到目標(biāo)服務(wù)器

  • 只在同組內(nèi)的 storage server 之間進(jìn)行同步
  • 源數(shù)據(jù)才需要同步,備份數(shù)據(jù)不再同步
  • 特例:新增 storage server 時(shí),由其中一臺(tái)將已有所有數(shù)據(jù)(包括源數(shù)據(jù)和備份數(shù)

據(jù))同步到新增服務(wù)器

storage server 的 7 種狀態(tài):
通過(guò)命令 fdfs_monitor /etc/fdfs/client.conf 可以查看 ip_addr 選項(xiàng)顯示 storage
server 當(dāng)前狀態(tài)
INIT: 初始化,尚未得到同步已有數(shù)據(jù)的源服務(wù)器
WAIT_SYNC :等待同步,已得到同步已有數(shù)據(jù)的源服務(wù)器
SYNCING : 同步中
DELETED : 已刪除,該服務(wù)器從本組中摘除
OFFLINE : 離線
ONLINE : 在線,尚不能提供服務(wù)
ACTIVE : 在線,可以提供服務(wù)

組內(nèi)增加 storage serverA 狀態(tài)變化過(guò)程

  • storage server A 主動(dòng)連接 tracker server,此時(shí) tracker server 將 storage serverA 狀態(tài)設(shè)置為 INIT
  • storage server A 向 tracker server 詢問(wèn)追加同步的源服務(wù)器和追加同步截止時(shí)間點(diǎn)(當(dāng)前時(shí)間),若組內(nèi)只有 storage server A 或者上傳文件數(shù)為 0,則告訴新機(jī)器不需要數(shù)據(jù)同步,storage server A 狀態(tài)設(shè)置為 ONLINE ;若組內(nèi)沒(méi)有 active狀態(tài)機(jī)器,就返回錯(cuò)誤給新機(jī)器,新機(jī)器睡眠嘗試;否則 tracker 將其狀態(tài)設(shè)置為WAIT_SYNC
  • 假如分配了 storage server B 為同步源服務(wù)器和截至?xí)r間點(diǎn),那么 storage server B 會(huì)將截至?xí)r間點(diǎn)之前的所有數(shù)據(jù)同步給 storage server A,并請(qǐng)求 tracker 設(shè)置 storage server A 狀態(tài)為 SYNCING;到了截至?xí)r間點(diǎn)后, storage server B 向 storage server A 的同步將由追加同步切換為正常 binlog 增量同步,當(dāng)取不到更多的 binlog 時(shí),請(qǐng)求 tracker 將 storage server A 設(shè)置為 OFFLINE 狀態(tài),此時(shí)源同步完成
  • storage server B 向 storage server A 同步完所有數(shù)據(jù),暫時(shí)沒(méi)有數(shù)據(jù)要同步時(shí),storage server B 請(qǐng)求 tracker server 將 storage server A 的狀態(tài)設(shè)置為 ONLINE
  • 當(dāng) storage server A 向 tracker server 發(fā)起心跳時(shí),tracker sercer 將其狀態(tài)更改為 ACTIVE,之后就是增量同步(binlog)
image

注釋:

  • 整個(gè)源同步過(guò)程是源機(jī)器啟動(dòng)一個(gè)同步線程,將數(shù)據(jù) push 到新機(jī)器,最大達(dá)到一個(gè)磁盤(pán)的 IO,不能并發(fā)
  • 由于源同步截止條件是取不到 binlog,系統(tǒng)繁忙,不斷有新數(shù)據(jù)寫(xiě)入的情況,將會(huì)導(dǎo)致一直無(wú)法完成源同步過(guò)程

下載

image

client 發(fā)送下載請(qǐng)求給某個(gè) tracker,必須帶上文件名信息,tracker 從文件名中解析出文件的
group驶沼、大小炮沐、創(chuàng)建時(shí)間等信息,然后為該請(qǐng)求選擇一個(gè) storage 用于讀請(qǐng)求;由于 group 內(nèi)的文
件同步在后臺(tái)是異步進(jìn)行的,可能出現(xiàn)文件沒(méi)有同步到其他 storage server 上或者延遲的問(wèn)題,
后面我們?cè)谑褂?nginx_fastdfs_module 模塊可以很好解決這一問(wèn)題

image

文件合并原理

小文件合并存儲(chǔ)主要解決的問(wèn)題:

  • 本地文件系統(tǒng) inode 數(shù)量有限,存儲(chǔ)小文件的數(shù)量受到限制
  • 多級(jí)目錄+目錄里很多文件,導(dǎo)致訪問(wèn)文件的開(kāi)銷很大(可能導(dǎo)致很多次 IO)
  • 按小文件存儲(chǔ),備份和恢復(fù)效率低

海量小文件存儲(chǔ)問(wèn)題請(qǐng)參考:
地址1
地址2

FastDFS 提供合并存儲(chǔ)功能,默認(rèn)創(chuàng)建的大文件為 64MB,然后在該大文件中存儲(chǔ)很多小文件;
大文件中容納一個(gè)小文件的空間稱作一個(gè) Slot,規(guī)定 Slot 最小值為 256 字節(jié),最大為 16MB,即小于 256 字節(jié)的文件也要占用 256 字節(jié),超過(guò) 16MB 的文件獨(dú)立存儲(chǔ);

為了支持文件合并機(jī)制, FastDFS 生成的文件 file_id 需要額外增加 16 個(gè)字節(jié);
每個(gè) trunk file
由一個(gè) id 唯一標(biāo)識(shí),trunk file 由 group 內(nèi)的 trunk server 負(fù)責(zé)創(chuàng)建(trunk server 是 tracker
選出來(lái)的),并同步到 group 內(nèi)其他的 storage,文件存儲(chǔ)合并存儲(chǔ)到 trunk file 后,根據(jù)其文件
偏移量就能從 trunk file 中讀取文件

博客地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市回怜,隨后出現(xiàn)的幾起案子大年,更是在濱河造成了極大的恐慌换薄,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翔试,死亡現(xiàn)場(chǎng)離奇詭異轻要,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)垦缅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門冲泥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人壁涎,你說(shuō)我怎么就攤上這事凡恍。” “怎么了怔球?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵嚼酝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我竟坛,道長(zhǎng)闽巩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任担汤,我火速辦了婚禮涎跨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘崭歧。我一直安慰自己六敬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布驾荣。 她就那樣靜靜地躺著外构,像睡著了一般。 火紅的嫁衣襯著肌膚如雪播掷。 梳的紋絲不亂的頭發(fā)上审编,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音歧匈,去河邊找鬼垒酬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛件炉,可吹牛的內(nèi)容都是我干的勘究。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼斟冕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼口糕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起磕蛇,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤景描,失蹤者是張志新(化名)和其女友劉穎十办,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體超棺,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡向族,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棠绘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片件相。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖氧苍,靈堂內(nèi)的尸體忽然破棺而出适肠,到底是詐尸還是另有隱情,我是刑警寧澤候引,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布侯养,位于F島的核電站,受9級(jí)特大地震影響澄干,放射性物質(zhì)發(fā)生泄漏逛揩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一麸俘、第九天 我趴在偏房一處隱蔽的房頂上張望辩稽。 院中可真熱鬧,春花似錦从媚、人聲如沸逞泄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)喷众。三九已至,卻和暖如春紧憾,著一層夾襖步出監(jiān)牢的瞬間到千,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工赴穗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留憔四,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓般眉,卻偏偏與公主長(zhǎng)得像了赵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子甸赃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容