是一個開源的分佈式文件存儲系統,由LiveJournal旗下的Danga Interactive公司開發。
Danga團隊開發了包括 Memcached、MogileFS、Perlbal 等多個知名的開源項目。
目前使用MogileFS 的公司很是多,以大衆點評爲例,用戶所有圖片均有mogileFS存儲,數據量已經達到500TB級別以上。
支持多節點冗餘
可實現自動的文件複製
使用名稱空間(命名空間),每一個文件經過key來肯定。123.jpg /000/000/00/01/md5hash.fid
不須要RAID,應用層能夠直接實現RAID,不共享任何東西,經過「集羣」接口提供服務
工做於應用層,沒有特殊的組件要求;
不共享任何數據,MogileFS不須要依靠昂貴的SAN來共享磁盤,每一個機器只用維護好本身的磁盤
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 服務,擴容就是增長這些機器,實際文件存放的地方。
每次文件的上傳和讀取,都通過前端TrackerServer 服務。
trackerServer 服務器受到client 端的請求,查詢數據庫,返回一個上傳或者是讀取的可用的後端StorageServer 的地址,而後由client 端直接操做後端StorageServer 服務器。
upload 操做返回就是成功或者失敗的結果。 read 操做就是返回對應的查詢數據。
Domain:
一個MogileFS能夠有多個Domain,用來存放不一樣文件(大小,類型),同一個Domain內key必須惟一,不一樣Domain內,key能夠相同。
每個存儲節點稱爲一個主機host,一個主機上能夠有多個存儲設備dev(單獨的硬盤),每一個設備都有ID號,Domain+Fid用來定位文件。 Class:
文件屬性管理,定位文件存儲在不一樣設備上的份數。
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
主程序:/usr/bin/mogilefsd
命令行管理工具程序:/usr/bin/mogadm
主配置文件(Tracker):/etc/mogilefs/mogilefsd.conf
主配置文件(Storage Nodes):/etc/mogilefs/mogstored.conf
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上存儲的實際位置,建議使用的是一個單獨掛載使用的磁盤
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 &)
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功能能夠平衡各個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策略
Tengine反代MogileFS負載均衡:html
1.環境:前端
mogilefsd+mogstored+mariadb garela三臺centos7:node
192.168.20.11
mysql
192.168.20.12nginx
192.168.20.13sql
Tengine一臺(或兩臺作keepalived)centos7:192.168.20.95數據庫
2.三臺配置mogilefsd+mogstored+mariadb garela:
vim
garela: 後端
/etc/my.cnf.d/server.cnfcentos
[server]
[mysqld]
[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.20.12,192.168.20.11,192.168.20.13"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_slave_threads=2
innodb_flush_log_at_trx_commit=0
[embedded]
[mariadb]
[mariadb-10.2]
Mogilefsd:
/etc/mogilefs/mogilefsd.conf
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogilefs:host=192.168.20.12
db_user = mogilefs
db_pass = PASSWD
listen = 0.0.0.0:7001
conf_port = 7001
query_jobs = 5
delete_jobs = 1
relicate_jobs = 2
reaper_jobs = 1
Mogstored:
/etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /data/mogilefs/
分別添加/data/mogilefs/dev目錄,改屬主屬組
perl安裝啓動:
[root@node1 ~]#su mogilefs -c mogilefsd
[root@node1 ~]#nohup mogstored &
添加主機到trackers中,這樣storage節點才能被tracker節點所管理,並將主機信息註冊到數據庫中
#mogadm check
#mogadm --trackers=192.168.20.12:7001 host add node1 --ip=192.168.20.11 --status=alive
#mogadm --trackers=192.168.20.12:7001 host add node2 --ip=192.168.20.12 --status=alive
#mogadm --trackers=192.168.20.12:7001 host add node3 --ip=192.168.20.13 --status=alive
#mogadm host list
#mogadm device list
#mogadm device add node1 dev1
#mogadm device add node2 dev2
#mogadm device add node3 dev3
添加建立域和類:
#mogadm domain add images
#mogadm class add images jpg --mindevcount=3
#mogadm class list
上傳數據:
#find /usr/share/ -iname "*.jpg" | xargs -i cp {} ./
#mogupload --trackers=192.168.20.12:7001 --domain='images' --class='jpg' --key='default' --file='default.jpg'
查看:
#mogfileinfo --trackers=192.168.20.12:7001 --domain='images' --key=default
- file: default
class: jpg
devcount: 1
domain: images
fid: 82
key: default
length: 961243
- http://192.168.20.11:7500/dev1/0/000/000/0000000082.fid
查看images域下全部key
#moglistkeys --trackers=192.168.20.12:7001 --domain=images
能夠建立一個配置文件指明trackers是誰就不用每次輸入命令的時候指定了
#vim /etc/mogilefs/mogilefs.conf
trackers=192.168.20.12:7001
刪除
#mogdelete --domain=images --key=default
#mogupload --domain='images' --class='jpg' --key='night' --file='night.jpg'
3.下載編譯安裝配置Tengine及nginx_mogilefs_module:
安裝:
#tar xf tengine-2.1.1.tar.gz
#tar xf nginx_mogilefs_module-1.0.4.tar.gz
#groupadd -r nginx
#useradd -r -g nginx nginx
#cd nginx_mogilefs_module-1.0.4
#./configure --prefix=/usr --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-debug --add-module=../nginx_mogilefs_module-1.0.4
#make && make install
配置:
/usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/run/nginx/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=process
KillSignal=SIGOUT
TimeoutStopSec=5
PrivateTmp=true
[Install]
WantedBy=multi-user.target
grep -v -E '^$|^[[:space:]]*#' /etc/nginx/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream trackers {
server 192.168.20.11:7001 weight=1;
server 192.168.20.12:7001 weight=1;
server 192.168.20.13:7001 weight=1;
check interval=1000 rise=2 fall=5 timeout=1000;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /image/ {
mogilefs_tracker trackers;
mogilefs_domain images;
mogilefs_methods GET;
mogilefs_noverify on;
mogilefs_pass {
proxy_pass $mogilefs_path;
proxy_hide_header Content-Type;
proxy_buffering off;
}
}
location /status {
check_status;
access_log off;
allow 192.168.20.0/24;
deny all;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
解決CentOS7下MogileFS的複製Bug問題:
發現只有上傳節點有文件,其餘節點並無同步:
解決方法以下:
三個節點編譯安裝源碼包:
#yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes
#wget http://pkgs.fedoraproject.org/repo/pkgs/perl-Sys-Syscall/Sys-Syscall-0.23.tar.gz/be6dc2d791684a6f8abb3dd39ff2d1de/Sys-Syscall-0.23.tar.gz
#tar -zxvf Sys-Syscall-0.23.tar.gz
#cd Sys-Syscall-0.23
#perl Makefile.PL
#make && make install
重啓mogilefsd,mogstored服務後測試正常