MogileFS & FastDFS 為兩個開源分布式文件系統,都主要適用於互聯網文件共享,上傳,下載等功能,主要用於多上傳和下載,不經常修改的操作。M和F部署架構都比較類似,設計中都避免的cluster中某一個環節的單點問題。

 MogileFS

————————-
官網https://code.google.com/p/mogilefs/
基本架構:TrackerServer(Tracker + DataBase) + StorageServer

[ Mogilefs的組成部分 ]

1. 數據庫(MySQL)部分
你可以用mogdbsetup程序來初始化數據庫。數據庫保存了Mogilefs的所有元數據,你可以單獨拿數據庫服務器來做,也可以跟其他程序跑在一起,數據庫 部分非常重要,類似郵件系統的認證中心那么重要,如果這兒掛了,那么整個Mogilefs將處於不可用狀態。因此最好是HA結構。

2. storageServer(存儲節點)
mogstored 程序的啟動將使本機成為一個存儲節點。啟動時默認去讀/etc/mogilefs/mogstored.conf ,具體配置可以參考配置部分。mogstored啟動后,便可以通過mogadm增加這台機器到cluster中。一台機器可以只運行一個mogstored作為存儲節點即可,也可以同時運行其他程序。

3. trackersServer(跟蹤器)
mogilefsd即 trackers程序,類似mogilefs的wiki上介紹的,trackers做了很多工作,Replication ,Deletion,Query,Reaper,Monitor等等。mogadm,mogtool的所有操作都要跟trackers打交 道,Client的一些操作也需要定義好trackers,因此最好同時運行多個trackers來做負載均衡。trackers也可以只運行在一台機器 上,也可以跟其他程序運行在一起,只要你配置好他的配置文件即可,默認在/etc/mogilefs/mogilefsd.conf。

4. 工具
主要就是mogadm,mogtool這兩個工具了,用來在命令行下控制整個mogilefs系統以及查看狀態等等。
如果使用其他語言調用接口,需要二次開發。

5. Client
Client實際上是一個Perl的pm,可以寫程序調用該pm來使用mogilefs系統,對整個系統進行讀寫操作。

[ 邏輯原理 ]

每次文件的上傳和讀取,都經過前端TrackerServer服務器,trackerServer服務器受到client端的請求,查詢數據庫,返回一個上傳或者是讀取的可用的后端StorageServer的地址,然后由client端直接操作后端StorageServer服務器。upload操作返回就是成功或者失敗的結果,read操作就是返回對應的查詢數據。

====================================

FastDFS

————————-
官網:https://code.google.com/p/fastdfs/
基本架構:TrackerServer + StorageServer

[ FastDFS的組成部分 ] 

1. Storage server
在其他文件系統中通常稱作Trunk server或Data server。Storage server直接利用OS的文件系統存儲文件。FastDFS不會對文件進行分塊存儲,客戶端上傳的文件和Storage server上的文件一一對應。

2. TrackerServer
Tracker server作為中心結點,其主要作用是負載均衡和調度。Tracker server在內存中記錄分組和Storage server的狀態等信息,不記錄文件索引信息,占用的內存量很少。另外,客戶端(應用)和Storage server訪問Tracker server時,Tracker server掃描內存中的分組和Storage server信息,然后給出應答。

[ 邏輯原理 ]

StorageServer作為主動方,在服務起來之后,會定時(時間可以配置)向他對應的tracker發布自己的狀態和相關信息。TrackerServer服務只是會記錄相對於的group對應的服務器IP,以便在read的時候直接 返回服務器IP。TrackerServer里面存儲着每一個group的server列表,server列表里面的storage服務器都是實時相互備份操作。

在單個tracker,多個storage的架構的環境中,首先是upload操作:
client端將upload的請求直接發送給tracker服務器,tracker收到之后,會根據自己的一套定義的規則(可以配置),將回復可以上傳的storage服務器IP,client將文件upload至storage服務器,完成操作。
read操作:
client端發送需要get的URL地址,tracker根據URL中的group來划分屬於哪些storage服務器,然后返回可以訪問的服務器IP地址。
client直接訪問指定storage服務器,此storage服務器已經部署Nginx類似的HTTP服務,並加載fastdfs的模塊,需提前進行域名跳轉的設定,完成文件的讀取。

關於多tracker和多storage的系統架構設計
根據fastdfs的架構描述,tracker和storage都是可以橫向無限延伸,現還未有一個比較標准的一個tracker和storage配對的模式,只是說個人建議在一個group中,storage盡量保證在2-3台存儲服務器,配對的tracker保持2台即可。
對於一個cluster的模式,大概可以這樣去設計系統架構:
2台Nginx最前端的服務器,用於client端的read請求,主要作用是用來做負載均衡服務,熱備操作,最好在nginx的config配置里面加入location設置,根據groupname直接跳轉到對應的storage服務器。
2台tracker服務器,用於write操作的分發,也可以做熱備操作,后端的storage服務器配置中tracker設置需要將2台服務器都綁定上去。
N台storage服務器,一個group配備2-3台服務器,可以根據數據量的大小,從小的規模做起,如有新的擴容,直接新增新的group和storage服務器即可,這樣只需修改前端那nginx服務配置,其他都不用調整。

====================================

MogileFS VS FastDFS

[ 類似點 ]

1. 架構都比較雷同,都具備tracker和storage兩個部分的cluster架構,可以都很方便進行橫向擴張。
2. 對於storageServer方面一旦有某機器宕機,硬盤損壞情況,都能自動完成修復功能。
3. 架構設計都無單點失敗問題,cluster中服務器都無需采用raid服務,避免出現類似hadoop設計的cluster中前端mapreduce宕機,整個系統失效的問題
4. 文件存儲都不能對大文件拆分(hadoop可以實現),所以如果單個文件超過一台存儲物理機的存儲空間,就不能使用此系統存儲
5. 文件系統的存儲格式都不是原文存儲,就算你登陸到文件服務器也無法獲取到系統中的數據,必須經過一定的接口才能獲取

[ 不同點 ]

1. F架構中不具備數據庫,M中必須使用數據庫來存儲每一個文件的地址。但是F架構中在每次上傳之后會返回一個相對地址,此地址需自己完成寫入某個數據源中進行保存,在下一次讀取的時候就能找到此文件對於文件系統中的位置。也就是說F中的數據是獨立於文件系統之外,可以自己來設計的,M是包含到文件系統之中。
2. F是由C開發,M是有Perl開發,性能方面F占優
3. F直接使用socket通信方式,相對於M的HTTP方式,效率更高。並且F使用sendfile傳輸文件,采用了內存零拷貝,系統開銷更小,文件傳輸效率更高。
4. F從V1.14開始支持相同文件內容只保存一份,這樣可以節省存儲空間,提高文件訪問性能,M不具備這個功能
5. F中有Group的概念,每個Group的就是一個存儲的cluster,一個cluster每個存儲服務器都互相復制數據。M中沒有Group,但引入class來對不同的文件區分存儲的方式。例如附錄01中的配置,不同文件可以在upload操作的選擇使用哪一種class,就可以采用不一樣的備份數量控制。
6. F是國人開發出來,有問題可以直接問作者(QQ群:212801927),M想找到相關資料比較麻煩

附錄01

mogadm class list
domain               class                mindevcount   replpolicy
——————– ——————– ————- ————
toast                byhost                    2        MultipleHosts()
toast                default                   2        MultipleHosts()
toast                four                      4        MultipleHosts()
toast                fourbynamenet             1        HostsPerNetwork(near=2,far=1)

mogadm class add toast twoontwonets –replpolicy “HostsPerNetwork(near=2,far=2)”
mogadm class modify toast twoontwonets –replpolicy “HostsPerNetwork(near=3,far=3)”