MogileFS介紹
MogileFS
是一個開源的分布式文件存儲系統,由LiveJournal旗下的Danga Interactive公司開發。
Danga團隊開發了包括 Memcached、MogileFS、Perlbal 等多個知名的開源項目。
目前使用MogileFS 的公司非常多,以大眾點評為例,用戶全部圖片均有mogileFS存儲,數據量已經達到500TB級別以上。
mogilefs的特性
支持多節點冗余
可實現自動的文件復制
使用名稱空間(命名空間),每個文件通過key來確定。123.jpg /000/000/00/01/md5hash.fid
不需要RAID,應用層可以直接實現RAID,不共享任何東西,通過“集群”接口提供服務
工作於應用層,沒有特殊的組件要求;
不共享任何數據,MogileFS不需要依靠昂貴的SAN來共享磁盤,每個機器只用維護好自己的磁盤
mogileFS主要由三部分構成
tracker節點,database節點,storage節點
1》Tracker(MogileFSd 進程):
這個是 MogileFS 的核心部分,他是一個調度器,MogileFSd 進程就是trackers進程程序,trackers 做了很多工作:Replication(復制),Deletion,Query,Reaper(收割程序),Monitor 等等,這個是基於事件的( event-based ) 父進程/消息總線來管理所有來之於客戶端應用的交互(requesting operations to be performed),包括將請求負載平衡到多個“query workers”中,然后讓 MogileFSd 的子進程去處理;
2》MySQL:
用來存放 MogileFS 的元數據 (命名空間, 和文件在那里),是Trackers 來操作和管理它,可以用mogdbsetup程序來初始化數據庫,因為數據庫保存了MogileFS的所有元數據,建議做成HA架構;
3》Storage Nodes:
這個是 MogileFS 存儲文件存放在這些機器上,也是 mogstored 節點,也叫 Storage Server,一台存儲主要都要啟動一個 mogstored 服務,擴容就是增加這些機器,實際文件存放的地方。
mogileFS架構
每次文件的上傳和讀取,都經過前端TrackerServer 服務。
trackerServer 服務器受到client 端的請求,查詢數據庫,返回一個上傳或者是讀取的可用的后端StorageServer 的地址,然后由client 端直接操作后端StorageServer 服務器。
upload 操作返回就是成功或者失敗的結果。
read 操作就是返回對應的查詢數據。
mogileFS管理的幾個概念
Domain:
一個MogileFS可以有多個Domain,用來存放不同文件(大小,類型),同一個Domain內key必須唯一,不同Domain內,key可以相同。
每一個存儲節點稱為一個主機host,一個主機上可以有多個存儲設備dev(單獨的硬盤),每個設備都有ID號,Domain+Fid用來定位文件。
Class:
文件屬性管理,定位文件存儲在不同設備上的份數。
mogilefs安裝方式
yum安裝
使用epel源進行安裝環境包
yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO
本地安裝的rpm包:
MogileFS-Server-2.46-2.el7.noarch.rpm #核心服務
MogileFS-Server-mogilefsd-2.46-2.el7.noarch.rpm # tracker節點
MogileFS-Server-mogstored-2.46-2.el7.noarch.rpm #Storage存儲節點
MogileFS-Utils-2.19-1.el7.noarch.rpm #主要是MogileFS的一些管理工具,例如mogadm等。
perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm #socket
perl-MogileFS-Client-1.14-1.el7.noarch.rpm #客戶端
perl-Perlbal-1.78-1.el6.noarch.rpm
perl程序安裝
通過perl的包管理命令cpanm進行安裝
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes
cpanm安裝
wget http://xrl.us/cpanm -O /usr/bin/cpanm; sudo chmod +x
/usr/bin/cpanm
#cpanm DBD::mysql
#cpanm MogileFS::Server
#cpanm MogileFS::Utils
#cpanm MogileFS::Client
#cpanm IO::AIO
mogilefs程序路徑
主程序:/usr/bin/mogilefsd
命令行管理工具程序:/usr/bin/mogadm
主配置文件(Tracker):/etc/mogilefs/mogilefsd.conf
主配置文件(Storage Nodes):/etc/mogilefs/mogstored.conf
mogilefs程序功能的配置文件
daemonize = 1 ##設置為1表示啟動為守護進程
db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = username
db_pass = password ##配置數據庫連接相關信息
listen = 127.0.0.1:7001 ##mogilefs監聽地址,監聽在127.0.0.1表示只允許從本機登錄進行管理
query_jobs = 10 ##啟動多少個查詢工作線程
delete_jobs = 1 ##啟動多少個刪除工作線程
replicate_jobs = 5 ##啟動多少個復制工作線程
reaper_jobs = 1 ##啟動多少個用於回收資源的線程
maxconns = 10000 ##存儲系統的最大連接數.
httplisten = 0.0.0.0:7500 ##可通過http訪問的服務端口
mgmtlisten = 0.0.0.0:7501 ##mogilefs的管理端口
docroot = /var/mogdata ##該項決定了數據的在storage上存儲的實際位置,建議使用的是一個單獨掛載使用的磁盤
mogilefs服務初始化
1》數據庫授權
GRANT ALL PRIVILEGES ON *.* TO 'mogile' @'localhost' IDENTIFIED BY 'mogile' WITH GRANT OPTION;
2》設定數據庫:
mogdbsetup --help
mogdbsetup --dbhost=127.0.0.1 --dbpass=mogpass
用戶名默認為:mogile
3》添加運行用戶
useradd -r mogilefs
mkdir /var/run/mogilefsd/
chown -R mogilefs.mogilefs /var/run/mogilefsd #yum安裝的話已經完成
4》修改主配置文件:
/etc/mogilefs/mogilefsd.conf
5》啟動服務 (tracker 服務為 mogilefsd ) (storage服務為mogstored)
mogilefs的管理
mogstored 程序的啟動將使主機本身成為一個存儲的節點,mogstored 的啟動后,還需要使用 mogadm 來讓當前的這個主機加入到 MogileFS 的系統中.這就是一個存儲節點.注意存儲節點中還需要添加設備,每個設備有一個 uniq 的 ID 號.同樣也要使用 mogadm 來加入到 MogileFS 的系統中.
MogileFS 中的存儲主機(節點)管理
現在加入“存儲節點”到 trackers 中.告訴注冊自己到 trackers.相當於為每個主機加入 MogileFS 的存儲系統
添加主機,將主機信息注冊到數據庫中
mogadm host add <storage_node_name> --ip=127.0.0.1 --port=7500 --status=alive
檢查這個主機是否加入到 MogileFS 的系統中.
mogadm host list
可以修改主機IP
mogadm host modify node1 --ip=123.xxx.xxx.70 --status=alive
MogileFS 中的存儲設備管理
建一個目錄 ( 並且需要 mount 一個硬盤給這個目錄 ) 給這個"設備" 使用, 我們這的例子是使用dev1在主機中建一個目錄,建目錄使用 dev + ID 這種格式,記的所有系統中 ID 不能重復.也必須和配置文件中的路徑一樣.
mkdir -p /data/mogdata/dev1
一定要注意, 給相對應用的塊設備 mount 到這個點, 軟鏈也行. 不然寫文件都會寫到系統硬上,其它的硬盤都是空的
給"設備"加入”存儲的節點“當中,相當於為每個設備加入 MogileFS 的存儲系統
mogadm device add <storage_node_name> ID
檢查我們加入的"設備"信息,這樣就能見到上面這個設備了.還能顯示加入的大小.
mogadm device list
標記失效的設備,當硬盤壞了,設備有問題時,這時會自動在一個域內復制到最小設置的保存份數.恢復上面一樣在一次 add 設備就好了
mogadm device mark <storage_node_name> <storage_node_name> ID dead
MogileFS 中域,類的管理
當上面的准備好了,MogileFS 是運行中時,接下來我們要建一個我們自己的'名字空間'和加入文件到存儲當中.
我們使用 mogadm 的工具來能創建一個"域"和"類".也可以使用這個來增加文件到"類"中.
建"域"
mogadm domain add <domain_name>
檢查"域",顯示存在的域
mogadm domain list
在"域"中建"類",並加入最小保存份數
mogadm class add <domain_name> <class_name> --mindevcount=3
MogileFS 中文件管理
我們可以簡單的使用 mog 開頭的系列 Linux 命令, 來進行管理, 當然也可以用 Client 的 API來管理. 新的 MogileFS 的工具, 拆分成多個了. 下面這些命令, 都需要在/etc/mogilefs/mogilefs.conf 中指定 trackers , 不然就需要在下面的命令都加上 –trackers來指定.
1. 上傳文件
mogupload --domain=magedu --key=<key_name> --file=<file_path>
2. 查詢文件
mogfileinfo --trackers=host --domain=<domain_name> --key=<key_name>
3.查詢一個叫 crossdomain 的 key .在指定的 domain 中.
mogfileinfo --domain=magedu --key=magedu
4. 刪除指定文件
mogdelete --domain=<domain_name> --key=<key_name>
5. 列出所有的文件 key
這個可以列出指定 domain 下面的所有的 key , 也可以指定的一個前綴, 來找特定前綴的所有文件的 key.
moglistkeys --domain=<domain_name> --key_prefix=<key_name>
6. 列出指定 fid 的文件
這個 fromfid 是指 mogileFS 內部的文件 id , 這個是自增的, 你可以指定一個開始的位置, 指定顯示多少文件, 這個用於查詢指定時間段內上傳的文件時很有用. 比如我們在 8 點上傳了一個文件, 是 100 的 id, 我們可以查詢到從這個之后的所有的 id 的文件.
moglistfids --fromfid=<file_id> --count=<數量>
暫時停止服務器
如果你需要維護一個服務器,比如更新內存,升級操作系統之類的需要關機的操作,推薦你在操作之前先設置這些為 "down". MogileFS 對這種偶然的故障可以很彈性的處理.
mogadm host mark mystorage down
mogadm host mark mystorage alive
硬盤設備編號
添加新的硬盤設備需要給一個唯一的,增量的設備 ID(devid).
如果你用一個新的硬盤來更換壞掉的硬盤,總是需要給一個新的 devid.不能重用老的 devid. 之所以這樣做的原因是可以讓你從舊設備中給所有文件列表中的文件,重新復制到其它的Mogilefs 的硬盤中.不然容易引起文件不會復制到這個中和錯誤的更新,也不會重新復制的舊文件.
添加設備
添加設備的命令如下:
mogadm device add mystorage 5 --status=alive
... or...
mogadm device add mystorage 5 --status=down
只讀模式和耗盡(Drain) 模式
如果你想要凍結設備上所有的文件,你要使用只讀模式就行了。這將停掉 MogileFS 存放新文件到這個設備上,但它也將阻止刪除文件.代替的刪除的操作是會給這些內容放到隊列中等待為您標記為'alive'着或'drain'。
mogadm device mark mystorage 5 readonly
mogadm device mark mystorage 5 drain
耗盡(Drain) 模式, 在 2.40 和更高以上,告訴 MogileFS 不會有新的文件應寫入設備. 但是在耗盡(Drain) 模式,文件可能被刪除.所以如果你不希望寫文件到這個設備上,可以設置為drain 的模式
注:耗盡(Drain) 模式在 MogileFS 的早期版本,,將會從設備刪除 FIDS.現在它已經被重新均衡的功能取代。
重新復制文件
如果有一個硬盤壞了,MogileFS 可以自動的讓請求不在訪問這個設備,但是不會自動的重新復制這個硬盤的文件,你必須通過 mogadm 來手工來標志成 'dead'. 只要你這樣做, MogileFS 將開始刪除設備上的文件,並試圖在集群間重新復制它們到其它的設備上.
MogileFS的rebalance功能
MogileFS的rebalance功能可以平衡各個storage節點磁盤的使用情況,將磁盤剩余空間很少的磁盤中的數據搬到磁盤剩余空間大的磁盤上,使磁盤的使用率基本達到平衡
使用方法
mogadm rebalance policy --options="from_hosts=2 to_percent_free=99" #設置rebalance策略,表示從設備id為2,搬到剩余空間為99%的存儲設備
mogadm rebalance test #查看一下策略
Tested rebalance policy...
Policy: from_hosts=2 to_percent_free=99
Source devices:
- 2
Destination devices:
- 1
- 3
mogadm rebalance start #運行此策略
mogadm rebalance stop #停止rebalance策略