分佈式文件系統MogileFS



MogileFS 是一個開源的分佈式文件系統,用於組建分佈式文件集羣,由 LiveJournal 旗下 Danga Interactive 公司開發,Danga 團隊開發了包括 Memcached、MogileFS、Perlbal 等不錯的開源項目:(注:Perlbal 是一個強大的 Perl 寫的反向代理服務器)。目前國內使用 MogileFS 的有圖片託管網站 yupoo 等。

MogileFS 特性

1. 應用層 – 不需要特殊的核心組件

2. 無單點失敗 — MogileFS分佈式文件存儲系統安裝的三個組件(存儲節點、跟蹤器、跟蹤用的數據庫),均可運行在多個 機器上,因此沒有單點失敗。(你也可以將跟蹤器和存儲節點運行在同一臺機器上,這樣你就沒有必要用4臺機器)推薦至少兩臺機器。

3. 自動的文件複製 — 基於不同的文件“分類”,文件可以被自動的複製到多個有足夠存儲空間的存儲節點上,這樣可以滿足這個“類別”的最少複製要求。比如你有一個圖片網站,你可 以設置原始的JPEG圖片需要複製 至少三份,但實際只有1or2份拷貝,如果丟失了數據,那麼MogileFS分佈式文件存儲系統可以重新建立遺失的拷貝數。用這種辦 法,MogileFS(不做RAID)可以節約磁盤,否則你將存儲同樣的拷貝多份,完全沒有必要。

4. “比RAID好多了”– 在一個非存儲區域網絡的RAID(non-SAN RAID)的建立中,磁盤是冗餘的,但主機不是,如果你整個機器壞了,那麼文件也將不能訪問。 MogileFS分佈式文件存儲系統在不同的機器之間進行文件複製,因此文件始終是可用的。

傳輸中立,無特殊協議 — MogileFS分佈式文件存儲系統客戶端可以通過NFS或HTTP來和MogileFS的存儲節點來通信,但首先需要告知跟蹤器一下。

5. 簡單的命名空間 –文件通過一個給定的key來確定,是一個全局的命名空間。你可以自己生成多個命名空間,只要你願意,不過這樣可能在同一MogileFS中會造成key衝突。

6. 不用共享任何東西 — MogileFS分佈式文件存儲系統不需要依靠昂貴的SAN來共享磁盤,每個機器只用維護好自己的磁盤。

7. 不需要RAID — 在MogileFS中的磁盤可以是做了RAID的也可以是沒有,如果是爲了安全性着想的話RAID沒有必要買了,因爲MogileFS分佈式文件存儲系統已經提供了。

MogileFS 的結構

在使用前,我們需要對 MogileFS 有個基本的瞭解,就是他的三個大的部分,Tracker and Database 和 Storage Nodes, Client 組成。由二個服務進程 MogileFSd 和 mogstored 。

MogileFS 的組成部分

前面提到 Tracker and Database 和 Storage Nodes, Client 組成,我們這先不講 Client.因爲Client實際上是一個 Perl 的 pm,可以寫程序調用該 pm 來使用 MogileFS 系統,對整個系統進行讀寫操作。另外,象 nginx 之類有相關的模塊。另外也有做成象文件系統一樣採用fuse方式掛載.

Trackers(跟蹤器 ,調度器)

這個是 MogileFS 的核心部分,通俗點講,就他是一個調度器。MogileFSd 進程就是 trackers程序,類似 MogileFS 的 wiki 上介紹的,trackers 做了很多工作,Replication ,Deletion,Query,Reaper,Monitor等等。這個是基於事件的( event-based ) 父進程/消息總線來管理所有來之於客戶端應用的交互(requesting operations to be performed), 包括將請求負載平衡到 “query workers” 中,讓 MogileFSd 的子進程去處理. mogadm,mogtool 的所有操作都要跟 trackers 打交 道,Client 的一些操作也需要定義好 trackers,因此最好同時運行多個 trackers 來做負載均衡。trackers 也可以只運行在一臺機器 上,也可以跟其他程序運行在一起(不建議)

配置文件: /etc/mogilefs/mogilefsd.conf

數據庫(MySQL)部分

如上圖所顯示的,數據庫用來存放 MogileFS 的元數據 (命名空間, 和文件在哪裏). 是 Trackers 來操作和管理它。你可以用 mogdbsetup 程序來初始化數據庫。因爲數據庫保存了MogileFS的所有元數據,如果這兒掛了,那麼整個 MogileFS 將處於不可用狀態。因此最好是HA結構。

存儲節點(Storage Nodes )

實際文件存放的地方. 存儲節點是一個 HTTP 服務器,用來做刪除,存放,重命名等事情,任何 WebDAV 服務器都可以, 不過推薦使用 mogstored 。 MogileFSd 可以配置到兩個機器上使用不同端口… mogstored 爲所有 DAV 操作 (和流量監測), 並且你自己選擇的快速的 HTTP 服務器用來做 GET 操作(給客戶端提供文件). 典型的應用是一個掛載點有一個大容量的 SATA 磁盤,它們被掛載到 /var/mogdata/devNN. 只要配置完配置文件後 mogstored 程序的啓動將會使本機成爲一個存儲節點。當然還需要 mogadm 這個工具增加這臺機器到 Cluster 中。

配置文件: /etc/mogilefs/mogstored.conf

MogileFS 服務進程

對應上面的部分

MogileFSd — MogileFS 的主守護進程,就是上面指的 trackers(跟蹤器 ),由 /etc/MogileFS/MogileFSd.conf 這個配置文件控制。

mogstored — MogileFS 存儲守護進程, 這個就是上面指的存儲節點(Storage Nodes ),由 /etc/MogileFS/mogstored.conf 這個配置文件控制。



MogileFS由3個部分組成
   第1個部分: 是server端,包括mogilefsd和mogstored兩個程序。前者即是mogilefsd的tracker,它將一些全局信息保存在數據庫 裏,例如站點domain,class,host等。後者即是存儲節點(store node),它其實是個HTTP Daemon,默認偵聽在7500端口,接受客戶端的文件備份請求。在安裝完後,要運行mogadm工具將所有的store node註冊到mogilefsd的數據庫裏,mogilefsd會對這些節點進行管理和監控。
   第2個部分:是utils(工具集),主要是MogileFS的一些管理工具,例如mogadm等。
   第3個部分:是客戶端API,目前只有Perl API(MogileFS.pm)、PHP,用這個模塊可以編寫客戶端程序,實現文件的備份管理功能,提供MogileFS.pm。




CAP理論:一致性,可用性,分區容錯性;指一個分佈式系統不可以滿足一致性,可用性和分區容錯性這三個需求,最多隻能同時滿足其中的兩個;
   C(Consistency):一致性,任何一個讀操作總是能夠讀取之前完成的寫操作;就是一個數據寫入一立馬被讀到;
   A(Availability):可用性,每一次操作總是能夠 在確定的時間返回;無論成功或失敗都能收到一個返回值的;
   P(Tolerance of network Partition):分區容錯性,在出現網絡分區的情況下,仍然能夠滿足一致性和可用性;

 

BASE法則模型反ACID模型,完全不同ACID模型,犧牲高一致性,獲得可用性或可靠性:
   BA:Basically Available,基本可以用,支持分區失敗(sharding碎片劃分數據庫);
   S:Soft state,軟狀態,接受一段時間內的狀態不同步,異步;
   E:Eventually consistent:最終一致性,弱一致性的表現;
   BASE思想主要強調基本的可用性,如果你需要High 可用性,也就是純粹的高性能,那麼就要以一致性或容錯性爲犧牲,BASE思想的方案在性能上還是有潛力可挖的。

 

Paxos算法:比2PC提交更輕量級的分佈式事務的協調方式;大概是指不出現故拜占庭將軍的前提下,要取得數據的一致性,在通信信道不安全的時候,我們數據傳輸可能會被人劫持,這樣就不能保證數據的可信了,所以必須保證通信信道安全下Paxos算法纔可行;




[ Mogilefs分爲幾部分 ]

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

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

3. trackers(跟蹤器)
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系統,對整個系統進行讀寫操作。

[ 概念定義 ]
可以參考官方wiki的這兒,簡單說一下
domain:最高域,在一個域下key是唯一的。
class:包含在domain中,可以針對每一個class定義保存的份數。
key:對文件的唯一標識。
file:文件。

[ 適用性 ]
     由於Mogilefs不支持對一個文件的隨機讀寫,因此註定了只適合做一部分應用。比如圖片服務,靜態HTML服務。
即文件寫入後基本上不需要修改的應用,當然你也可以生成一個新的文件覆蓋上去。



三.配置
1)創建數據庫
#mogdbsetup –dbhost=10.15.6.28 –dbname=mogilefs –dbuser=root
2)tracker配置
新建/etc/mogilefsd.conf文件內容:
db_dsn DBI:mysql:mogilefs
db_user mogile
db_pass 123123
conf_port 6001
listener_jobs 5
 
db_dsn指向的是你數據庫的位置,如果你數據庫不在同一個機器上,請改爲:
db_dsn DBI:mysql:mogilefs:127.0.0.1
 
由於mogilefsd不能用root用戶啓動.所以添加mogile用戶
# adduser mogile
在配置下面以前先啓動 trackers server
# su mogile
# mogilefsd -c /etc/mogilefsd.conf –daemon
2)Storage Server 配置
用mogadm工具將storage server加到數據庫中:
#mogadm -lib=/usr/lib/perl5/5.8.8 -trackers=10.15.6.28:6001 host add mogilestorage -ip=10.15.6.28 -port=7500 -status=alive(由於我是在一臺機器上配,故trackers的地址和ip地址是一樣的)
用下面命令來檢測是否成功:
#mogadm -lib=/usr/lib/perl5/5.8.8 -trackers=10.15.6.28:6001 host list
加入一個設備到你的storage server:
#mogadm -lib=/usr/lib/perl5/5.8.8 -trackers=10.15.6.28:6001 device add mogilestorage 1
用下面命令來檢測是否成功:
#mogadm -lib=/usr/lib/perl5/5.8.8 -trackers=10.15.6.28:6001 device list
Device ID 是唯一的,一旦創建將無法刪除,只能mark爲dead. 所以,如果你某個磁盤壞了,你mark爲dead, 後來又修好了,
那麼你必須重新格式化並命名爲新的device id, 不支持將device從dead變爲alive.
 
新建配置文件:/etc/mogstored.conf內容是
httplisten=0.0.0.0:7500
mgmtlisten=0.0.0.0:7501
docroot=/opt/mogdata
建個存放文件的目錄 # mkdir /opt/mogdata
 
在存放文件的目錄下面在建個目錄:
#mkdir -p /opt/mogdata/dev1
PS:mogadm 參數的用法請參考http://search.cpan.org/~dormando/MogileFS-Utils/mogadm
3)運行MogileFS
啓動 storage server
#mogstored -c /etc/mogstored.conf –daemon
啓動 Trackers
su mogile
mogilefsd -c /etc/mogilefs/mogilefsd.conf –daemon
查看你所有的服務都起來沒有
#ps -ef | grep mogilefsd
#ps -ef | grep mogstored
三.測試階段
生成domain
#mogadm -lib=/usr/lib/perl5/5.8.8 -trackers=10.15.6.28:6001 domain add testdomain
 
加一個 class 到domain
#mogadm -lib=/usr/lib/perl5/5.8.8 -trackers=10.15.6.28:6001 class add testdomain testclass






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章