FastDFS由跟蹤服務(wù)器(Tracker Server)、存儲服務(wù)器(Storage Server)和客戶端(Client)構(gòu)成。
跟蹤服務(wù)器Tracker Server
和TFS的NameServer相似,負責接收客戶端的請求,選擇合適的組合StorageServer ,他們與StorageServer之間也用心跳機制來檢查對方是否還活著。
Tracker需要管理的信息也都放在內(nèi)存中,并且里面所有的Tracker都是對等的,很容易擴展
客戶端訪問集群的時候會隨機分配一個Tracker來和客戶端交互。
存儲服務(wù)器Storage Server
主要負責提供容量和備份服務(wù)。
他們是以group為單位,一個group里面的Storage數(shù)據(jù)互相備份,也就是數(shù)據(jù)是一樣的。這種方法的好處是可以隔離不同應(yīng)用的數(shù)據(jù),比如一個應(yīng)用的數(shù)據(jù)放在一個group里面,
缺點也很明顯了, 整個group的容量其實就是每一個Stroage的容量,容量會受到限制。
而且部署時候Storage的容量要保持一致,這樣可以避免浪費資源
當group里有機子壞掉的時候,數(shù)據(jù)恢復(fù)只能依賴group組內(nèi)的其他服務(wù)器,會比較慢。。。不是很懂,那怎樣操作才是快呢。
寫操作的時候,storage會將他所掛載的所有數(shù)據(jù)存儲目錄的底下都創(chuàng)建2級子目錄,每一級256個總共65536個,新寫的文件會以hash的方式被路由到其中某個子目錄下,然后將文件數(shù)據(jù)作為本地文件存儲到該目錄中。
客戶端Client
主要是上傳下載數(shù)據(jù)的服務(wù)器,也就是我們自己的項目所部署在的服務(wù)器。每個客戶端服務(wù)器都需要安裝Nginx

FastDFS的存儲策略
為了支持大容量,存儲節(jié)點(服務(wù)器)采用了分卷(或分組)的組織方式。存儲系統(tǒng)由一個或多個卷組成,卷與卷之間的文件是相互獨立的,所有卷的文件容量累加就是整個存儲系統(tǒng)中的文件容量。一個卷可以由一臺或多臺存儲服務(wù)器組成,一個卷下的存儲服務(wù)器中的文件都是相同的,卷中的多臺存儲服務(wù)器起到了冗余備份和負載均衡的作用。
在卷中增加服務(wù)器時,同步已有的文件由系統(tǒng)自動完成,同步完成后,系統(tǒng)自動將新增服務(wù)器切換到線上提供服務(wù)。當存儲空間不足或即將耗盡時,可以動態(tài)添加卷。只需要增加一臺或多臺服務(wù)器,并將它們配置為一個新的卷,這樣就擴大了存儲系統(tǒng)的容量。
這樣做的優(yōu)點是比較靈活,當你的某個應(yīng)用或者模塊(對應(yīng)一個group)的訪問量超過其他的時候,可以直接在group上面增加若干個storage來實現(xiàn)負載均衡
FastDFS的讀取和寫入操作
FastDFS向使用者提供基本文件訪問接口,比如upload、download、append、delete等,以客戶端庫的方式提供給用戶使用


FastDFS的文件同步
當客戶端將一條數(shù)據(jù)成功寫到一個storage中就算寫入成功,他的文件同步是在后臺線程上面運行的,這是和TFS不太一樣的地方。
FastDFS同步的時候會生成一個binlog,這里包含數(shù)據(jù)的元信息,storage會記錄下他同步的進度,以便關(guān)機重啟之后可以繼續(xù)同步,這個進度以時間戳的方式記錄,所以需要所有的服務(wù)器保持時鐘的一致。
他的文件同步機制還帶來了一個安全隱患,就是當客戶端寫入成功之后,進行備份的時候,如果源storage突然爆炸了0.0(就是那種徹底毀壞,數(shù)據(jù)也丟了,系統(tǒng)也壞了的那種損壞)
這個數(shù)據(jù)就會丟失。不過感覺一般不太可能爆炸吧0.0
注意:
1.group2同組的Storage2和Storage3 FastDFS服務(wù)端口必須一致: port=23000。
2.一臺服務(wù)器可以裝多個組(group)但不能裝同組的多個Storage,日志會報錯誤,日志報錯原因是"注意1"
3.Version 4.05之前fastdfs內(nèi)部綁定了libevent作為http服務(wù)器.Version 4.05之后的版本刪除了內(nèi)置的web http服務(wù),內(nèi)置的web http服務(wù)是個累贅,不用也罷!
4.啟動storage server時,一直處于僵死狀態(tài).啟動storage server,storage將連接tracker server,如果連不上,將一直重試。直到連接成功,啟動才算真正完成!如果集群中有2臺tracker server,而其中一臺tracker沒有啟動,可能會導(dǎo)致storage server一直處于僵死狀態(tài)