24 November 2014

MogileFS是分散式檔案系統(DFS)的一種,
在MogileFS中,主要分成2個角色,
     1. tracker: 記錄有哪些storage
     2. storage node: 單純放檔案的角色
其實還有第三個角色,是tracker的DB,
這db角色是用來存放storage在哪裡、有幾個storage等資訊,
以及每個檔案類型要replicate幾份等等之類的資訊,
不過我會把tracker's DB和tracker本身歸類在一起,
因為它們兩個一定得在同檯機器上,而且缺一不可,
但tracker和storage不一定要在同檯機器上面!

如果說為什麼要用mogilefs的話,大概有以下2個原因吧,
     1. 自動作replicate
     2. application level,不需要特別的kernel module(setup簡單)

1. Install mogilefs

安裝mogilefs方式大概有三種,用cpan, apt, 拿source自己build,
個人偏好用apt-get安裝,
這裡選擇在ubuntu 14.04上安裝,
apt-get install python-software-properties
add-apt-repository ppa:saz/mogilefs
apt-get update
apt-get install mogilefsd mogstored mogilefs-utils

這樣就完成安裝,接下來要setup mogilefs,

2. Setup mogilefs tracker

前面有說到有tracker就一定要有db,
所以請先安裝好mysql,安裝好以後就執行下面的command,
記得把password換成你想要使用的密碼!
mysql> CREATE DATABASE mogilefs;
mysql> CREATE USER 'mogilefs'@'%' IDENTIFIED BY 'password';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,ALTER ON mogilefs.* TO 'mogilefs'@'%';
mysql> flush privileges;

接著要編輯/etc/mogilefs/mogilefsd.conf這個檔案,
這個檔案,其實只有在tracker的角色上才需要去編輯,
意思是說如果你有三檯機器,那麼只有其中一檯才需要去設定這個檔案!
只要改下面兩個設定就好,
db_pass = password
listen = 10.0.0.172:7001
db_pass就是上一步驟你所輸入的密碼,
listen就是這個tracker要listen在哪個ip以及哪一個port上面!

接著使用下面的command進行db setup,
一樣記得把password換成跟上面一樣的!
mogdbsetup --dbhost=10.0.0.172:7001 --dbname=mogilefs --dbuser=mogilefs --dbpassword=password

接著編輯.mogilefs.conf,這檔案會記錄著你的tracker在哪裡,
然後mogilefs會去問這tracker所有storage的資訊.
echo "trackers = 10.0.0.172:7001" > ~/.mogilefs.conf


3. Setup mogilefs storage node

tracker的目的在於記錄著有哪些storage可以用,
所以在完成setup tracker以後,接著就要來setup storage,
首先,先增加一個store host,
mogadm --trackers=10.0.0.172:7001 host add store1 --ip=10.0.0.172 --status=alive
--trackers:指定加在哪個tracker上
store1:是你的host name,
--ip:就是那一顆storage在哪裡

那麼有了host以後,
就要有device,一個host裡面可以有很多個device,
可以把device想像成local disk、NFS...etc.
所以接著要告訴host有哪些device,
mogadm --trackers=10.0.0.172:7001 device add store1 1 --status=alive
比較特別參數是“1”,
1的意思是device 1,

再來還要增加一個domain,等等後面會說明這domain的用途
mogadm domain add ken-storage

完成增加一個device了,
接著mogilefs store會去找那個device,
所以接著要去create folder,之後檔案都會放在那folder裡面,
mkdir -p /var/mogdata/dev1
chown mogstored /var/mogdata/dev1

這樣storage也設定完成了,
那麼該怎麼知道有設定成功?
可以透過mogadm check指令去看,
如果是成功的話,應該會看到下面的畫面,
root@ip-10-0-0-172:~# mogadm check
Checking trackers...
10.0.0.172:7001 ... OK

Checking hosts...
[ 1] store1 ... OK

Checking devices...
host device size(G) used(G) free(G) use% ob state I/O%
---- ------------ ---------- ---------- ---------- ------ ---------- -----
[ 1] dev1 7.324 1.480 5.844 20.21% writeable N/A
---- ------------ ---------- ---------- ---------- ------
total: 7.324 1.480 5.844 20.21%



4. Test using command line

測試之前,請先建立一個tmp file(hello.txt)
上傳檔案,
mogupload  --file="./hello.txt" --domain=ken-storage --key="first-file"
下載檔案
mogfetch --key="first-file" --file="./output-file" --domain=ken-storage
刪除檔案
mogdelete --key="first-file"  --domain=ken-storage


5. Advance: Replication

完成上面的基本操作以後,
並沒有發揮mogilefs replicate的功能,
那要做到replication也很簡單,
記得上面我們有add domain嗎?
domain其實有點難解釋,可以把它想像成像是AWS S3的bucket,
而這bucket下有許多policy,
所以我們現在就要替這這bucket(domain)加replicate的policy,
mogadm class add ken-storage txt --mindevcount=2
這指令的意思是,當檔案的class是txt時,請replicate 2份!

完成replication設定以後,
因為前面的設定都只有一個device,
只有一個deivce情況下,mogilefsd是不會進行replication的,
所以我們得再增加一個device,
建議你不要在同一檯機器上多增加一個device,畢竟沒有太大意義,
你在同一檯機器上做replication....?
如果這檯機器掛了,檔案就通通不見了,
所以會建議你在第二檯機器上增加一個device,
第二檯機器上就單純是storage node的角色了,
所以只需要做下面設定,記得把ip換成第二檯的ip!(只要改10.0.0.199的部分)
echo "trackers = 10.0.0.172:7001" > ~/.mogilefs.conf
mogadm --trackers=10.0.0.172:7001 host add store2 --ip=10.0.0.199 --status=alive
mogadm --trackers=10.0.0.172:7001 device add store2 2 --status=alive
mkdir -p /var/mogdata/dev2
chown mogstored /var/mogdata/dev2

6. Test Replication

其實跟第四步驟是一樣的,只是多一個參數--class,
這class就和上一步驟所填寫的一樣即可.這樣hello.txt就會被複製到另外一檯機器上去!
mogupload  --file="./hello.txt" --domain=ken-storage --key="first-file" --class=txt

如果replication失敗,那麼在db裡面的table file_to_replication將會有那筆資料,
你也可以透過/var/log/syslog看是什麼error message,
我自己使用的mogilefs版本,就有遇到一個syscal module的版本問題
透過連結的中的方法去解決的!


7. Advance: Integrate it with application

當然有了mogilefs以後,不可能都透過command line去操作呀,
如果我想要整合在我的application裡怎麼辦?
其實也很簡單,看你用什麼language,至少我用的language(java, python)都有相關的lib可以使用,
這裡使用pyhton來作為說明,
pymogile來作為操作mogile的lib,
安裝pymogile,
git clone https://github.com/AloneRoad/pymogile.git
cd pymogile/
python setup.py install

下面是一個簡單的example用pymogile操作mogilefs,
from pymogile import Client, MogileFSError

datastore = Client(domain='ken-storage', trackers=['10.0.0.172:7001'])
key_id='replicate'

def upload_file():
fp = datastore.new_file(key_id)
fp.write('test')
fp.close()

def get_path():
print datastore.get_paths(key_id)

def get_data():
print datastore.get_file_data(key_id)

upload_file()
get_path()
get_data()











blog comments powered by Disqus