分布式存儲(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ù).
架構(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ǔ)到該目錄中
總結(jié):1.高可靠性:無(wú)單點(diǎn)故障 2.高吞吐性:只要 Group 足夠多,數(shù)據(jù)流量是足夠分散的
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
其中,組名:文件上傳后所在的存儲(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)
注釋:
- 整個(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ò)程
下載
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)題
文件合并原理
小文件合并存儲(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 中讀取文件