MooseFS的簡介、部署及應(yīng)用
mooseFS簡介
MooseFS正式的推出是在2008-05-30,到2009-10-12為止,最新的版本是1.5.12。
mooseFS是一款網(wǎng)絡(luò)分布式文件系統(tǒng)。它把數(shù)據(jù)分散在多臺服務(wù)器上,但對于用戶來講,看到的只是一個源。MFS也像其他類unix文件系統(tǒng)一樣,包含了層級結(jié)構(gòu)(目錄樹),存儲著文件屬性(權(quán)限,最后訪問和修改時間),可以創(chuàng)建特殊的文件(塊設(shè)備,字符設(shè)備,管道,套接字),符號鏈接,硬鏈接。
mooseFS系統(tǒng)的組成
1.master(元數(shù)據(jù)服務(wù)器)
master負(fù)責(zé)在整個系統(tǒng)中管理數(shù)據(jù)。是整個系統(tǒng)的維護(hù)者。但是它有個弱點(diǎn)就是master只有一個!也就是說如果master壞掉,整個系統(tǒng)將停止工作!不過這算不上致命弱點(diǎn),因為我們做好數(shù)據(jù)備份以后,恢復(fù)master是很簡單的事。
2.chunkserver(數(shù)據(jù)存儲服務(wù)器)
chunkserver是mfs系統(tǒng)中的數(shù)據(jù)存儲者。真正的用戶數(shù)據(jù)按照算法被分成chunk,并分發(fā)到各個chunkserver上。這樣就保證了數(shù)據(jù)的安全性。
3.client
凡是使用mfs文件系統(tǒng)的機(jī)器都可以被稱為client。client是mfs系統(tǒng)的使用者。當(dāng)client把mfs文件系統(tǒng)掛載到本機(jī)以后,它可以像使用一個普通的磁盤分區(qū)一樣,來使用mfs。#p#
試驗環(huán)境
本文只介紹moosefs的部署與應(yīng)用,出于試驗的目的,并沒有考慮性能因素,因此所有的服務(wù)器均使用虛擬機(jī)來實(shí)現(xiàn)。以后有機(jī)會做單獨(dú)的物理服務(wù)器,然后對其性能進(jìn)行測試。
拓?fù)鋱D
備注:
(1) chunkserver1-4 均添加了一塊虛擬的磁盤sda(磁盤空間一定要大于1G,我這里設(shè)置了4G),掛載到系統(tǒng)的/data下。所有服務(wù)器均升級內(nèi)核為2.6.18-164本版,為什么要升級內(nèi)核,下文會有介紹。
(2) 所有服務(wù)器均安裝了完整版的mfs組件
安裝與配置
安裝mfs的前提條件
由于mfs的客戶端程序也就是加載mfs磁盤系統(tǒng)的命令是使用fuse編寫的,因此只要是想掛載mfs的服務(wù)器,必要的前提條件就是先安裝fuse,這樣編譯mfs的時候才能順利通過。另外一點(diǎn)需要注意:linux 2.6.18-164.e15 版本的linux內(nèi)核中已經(jīng)內(nèi)置了fuse模塊。但在該版本之前的linux內(nèi)核中是不包含這個模塊的。另fuse 從2.8.0-pre1 版本的源碼包中去掉了fuse系統(tǒng)模塊的源碼部分,原因就是上一點(diǎn)提到的。這樣我們在編譯安裝當(dāng)前最新版本的fuse(2.8以上版本) 且正在使用的linux內(nèi)核版本低于2.6.18-164.e15版本,則系統(tǒng)中是不包含fuse模塊的。
解決的方法:
1、升級系統(tǒng)內(nèi)核為2.6.18-164版本
為了方便起見直接利用yum升級系統(tǒng)內(nèi)核即可。yum install kernel
安裝成功后需重啟系統(tǒng)
2、使用fuse 2.7x版本編譯安裝
該版本的fuse中包含了linux內(nèi)核需要的fuse模塊,配置編譯選項時指定 –enable-kernel-module 選項,make的時候就會編譯相應(yīng)的fuse模塊,make intall會將fuse.ko復(fù)制到 /lib/modules/`uname -r`/kernel/fs/fuse/ 目錄下 安裝后利用
- # modprobe -l | grep fuse
- /lib/modules/2.6.18-128.el5xen/kernel/fs/fuse/fuse.ko
查看是否正常安裝
3、利用yum安裝當(dāng)前內(nèi)核版本的fuse模塊
- yum install -y dkms-fuse dkms
安裝fuse
如果只編譯元數(shù)據(jù)服務(wù)端或數(shù)據(jù)存儲服務(wù)端的話是沒有必要安裝fuse的。只有mfsmount需要fuse支持(編譯時需要fuse的開發(fā)包,使用mfsmount掛載時需要fuse.ko系統(tǒng)模塊)。可以使用源碼或yum兩種方式安裝fuse
1、源碼安裝
- # wget http://ncu.dl.sourceforge.net/project/fuse/fuse-2.X/2.8.1/fuse-2.8.1.tar.gz
- # tar -xvzf fuse-2.8.1.tar.gz
- # cd fuse-2.8.1
- # ./configure –prefix=/usr/ –libdir=/usr/lib64
- # make && make install
由于我系統(tǒng)為64位,因此在編譯fuse時將lib目錄定為/usr/lib64。這樣在下面編譯安裝mfs時就不會因為找不到fuse的lib文件報錯了。
2、yum安裝
- # yum install -y fuse fuse-devel
安裝mfs
- # useradd mfs -s /sbin/nologin
- # ./configure –prefix=/usr/local/mfs –with-default-user=mfs –with-default-group=mfs –enable-mfsmount
- # make && make install
查看安裝后目錄結(jié)構(gòu)
- # ll /usr/local/mfs/
- total 20
- drwxr-xr-x 2 root root 4096 Oct 14 15:14 bin
- drwxr-xr-x 2 root root 4096 Oct 14 12:13 etc
- drwxr-xr-x 2 root root 4096 Oct 14 15:14 sbin
- drwxr-xr-x 3 root root 4096 Oct 14 12:13 share
- drwxr-xr-x 3 root root 4096 Oct 14 12:13 var
bin – 客戶端工具
etc – 元數(shù)據(jù)服務(wù)器,數(shù)據(jù)存儲服務(wù)器的配置文件都放在該目錄中
sbin – 元數(shù)據(jù)服務(wù)器端程序mfsmaster、數(shù)據(jù)存儲服務(wù)器端服務(wù)程序mfschunkserver
share – 文檔
var – 元數(shù)據(jù)目錄(可在配置文件中自定義到其他目錄)
配置master(元數(shù)據(jù)服務(wù)器)
IP:192.168.108.108
- [root@master~]#vi/usr/local/mfs/etc/mfsmaster.cfg
- #WORKING_USER=mfs
- #WORKING_GROUP=mfs
- #LOCK_FILE=/var/run/mfs/mfsmaster.pid
- #DATA_PATH=/usr/local/mfs/var/mfs
- #SYSLOG_IDENT=mfsmaster
- #BACK_LOGS=50
- #REPLICATIONS_DELAY_INIT=300
- #REPLICATIONS_DELAY_DISCONNECT=3600
- MATOCS_LISTEN_HOST=192.168.108.108
- #MATOCS_LISTEN_PORT=9420
- #MATOCU_LISTEN_HOST=*
- #MATOCU_LISTEN_PORT=9421
- #CHUNKS_LOOP_TIME=300
- #CHUNKS_DEL_LIMIT=100
- #CHUNKS_REP_LIMIT=15
注:這個配置文件中所有注掉的設(shè)置都是默認(rèn)的配置。在這里我只更改了MATOCS_LISTEN_HOST的值,也就是將它修改為本機(jī)的ip地址:192.168.108.108 。如果又需要還可以修改DATA_PATH的設(shè)置將元數(shù)據(jù)目錄存儲到其他的分區(qū)或磁盤。其他的參數(shù)都很簡單根據(jù)需要調(diào)整即可。
master會打開9420端口等待 mfschunkserver 連接
啟動mfsmaster
- [root@master~]#/usr/local/mfs/sbin/mfsmaster
- [root@master~]#ps-ef|grepmfsmaster|grep-vgrep
- mfs101321017:37?00:00:00/usr/local/mfs/sbin/mfsmaster
- [root@master~]#netstat-tulnp|grepmfsmaster
- tcp00192.168.108.108:94200.0.0.0:*LISTEN10132/mfsmaster
- tcp000.0.0.0:94210.0.0.0:*LISTEN10132/mfsmaster
查看系統(tǒng)日志
- [root@master~]#tail-f/var/log/messages
- Oct1417:37:35mastermfsmaster:config:usingdefaultvalueforoption‘SYSLOG_IDENT’–‘mfsmaster’
- Oct1417:37:35mastermfsmaster[10130]:config:usingdefaultvalueforoption‘WORKING_USER’–‘mfs’
- Oct1417:37:35mastermfsmaster[10130]:config:usingdefaultvalueforoption‘WORKING_GROUP’–‘mfs’
- …
- Oct1417:37:35mastermfsmaster[10132]:config:usingdefaultvalueforoption‘CHUNKS_LOOP_TIME’–’300′
# 以上日志內(nèi)容省略的很多,主要是程序讀取配置的過程。
# 下面的部分為檢查元數(shù)據(jù)和檢查數(shù)據(jù)存儲服務(wù)器的情況(每1分鐘檢查一次)。
# 由于我這里還沒有啟動chunkservers 因此在chunkservers status:的顯示結(jié)果為空。total: usedspace: 的結(jié)果也為空。
- Oct1417:38:00mastermfsmaster[10132]:inodes:45
- Oct1417:38:00mastermfsmaster[10132]:dirnodes:3
- Oct1417:38:00mastermfsmaster[10132]:filenodes:42
- Oct1417:38:00mastermfsmaster[10132]:chunks:14
- Oct1417:38:00mastermfsmaster[10132]:chunkstodelete:0
- Oct1417:38:00mastermfsmaster[10132]:chunkserversstatus:
- Oct1417:38:00mastermfsmaster[10132]:total:usedspace:0(0GB),totalspace:0(0GB),usage:0.00%
設(shè)置服務(wù)隨系統(tǒng)啟動
- [root@master~]#echo“/usr/local/mfs/sbin/mfsmaster”>>/etc/rc.local
配置chunkserver(數(shù)據(jù)存儲服務(wù)器)
IP:192.168.108.161~164
- [root@chunkserver-1~]#vi/usr/local/mfs/etc/mfschunkserver.cfg
- #WORKING_USER=mfs
- #WORKING_GROUP=mfs
- #DATA_PATH=/usr/local/mfs/var/mfs
- #LOCK_FILE=/var/run/mfs/mfschunkserver.pid
- #SYSLOG_IDENT=mfschunkserver
- #BACK_LOGS=50
- #MASTER_RECONNECTION_DELAY=30
- MASTER_HOST=192.168.108.108
- #MASTER_PORT=9420
- #MASTER_TIMEOUT=60
- #CSSERV_LISTEN_HOST=*
- #CSSERV_LISTEN_PORT=9422
- #CSSERV_TIMEOUT=60
- #CSTOCS_TIMEOUT=60
- #HDD_CONF_FILENAME=/usr/local/mfs/etc/mfshdd.cfg
配置存儲分區(qū)
- [root@chunkserver-1~]#vi/usr/local/mfs/etc/mfshdd.cfg
- 刪除
- /mnt/hd1
- /mnt/hd2
- /mnt/hd3
- /mnt/hd4
添加獨(dú)立的分區(qū)
/data
修改分區(qū)所有者為mfs
- [root@chunkserver-1~]#chownmfs.mfs/data
注:mfschunkserver 服務(wù)器的主配置很簡單,沒有特殊要求只需要修改MASTER_HOST的地址即可。存儲分區(qū)的配置選擇一個獨(dú)立的磁盤分區(qū)(分區(qū)必須大于1G)。
啟動mfschunkserver
- [root@chunkserver-1~]#/usr/local/mfs/sbin/mfschunkserver
- [root@chunkserver-1~]#netstat-an|grep9420
- tcp00192.168.108.161:15099192.168.108.108:9420ESTABLISHED
同時查看系統(tǒng)日志
- Oct1417:53:45vm_web_1mfschunkserver[1992]:connecting…
- Oct1417:53:45vm_web_1mfschunkserver[1992]:connectedtoMaster
說明已經(jīng)和master服務(wù)器成功連接
再查看master的日志查看
- Oct1417:59:00experimentmfsmaster[10132]:server1(192.168.108.161):usedspace:560484352(0GB),totalspace:4226125824(3GB),usage:13.26%
- Oct1417:59:00experimentmfsmaster[10132]:total:usedspace:560484352(0GB),totalspace:4226125824(3GB),usage:13.26%
同樣也說明有一臺 chunkserver 與自己連接,并給出了使用空間和剩余磁盤空間
剩余的3臺mfschunkserver利用同樣的方法配置好后啟動mfschunkserver程序,這時候再查看master系統(tǒng)日志:
- Oct1615:27:00experimentmfsmaster[10132]:inodes:9
- Oct1615:27:00experimentmfsmaster[10132]:dirnodes:1
- Oct1615:27:00experimentmfsmaster[10132]:filenodes:8
- Oct1615:27:00experimentmfsmaster[10132]:chunks:18
- Oct1615:27:00experimentmfsmaster[10132]:chunkstodelete:0
- Oct1615:27:00experimentmfsmaster[10132]:chunkserversstatus:
- Oct1615:27:00experimentmfsmaster[10132]:server1(192.168.108.162):usedspace:924282880(0GB),totalspace:4226125824(3GB),usage:21.87%
- Oct1615:27:00experimentmfsmaster[10132]:server2(192.168.108.164):usedspace:924282880(0GB),totalspace:4226125824(3GB),usage:21.87%
- Oct1615:27:00experimentmfsmaster[10132]:server3(192.168.108.163):usedspace:924282880(0GB),totalspace:4226125824(3GB),usage:21.87%
- Oct1615:27:00experimentmfsmaster[10132]:server4(192.168.108.161):usedspace:924028928(0GB),totalspace:4226125824(3GB),usage:21.86%
- Oct1615:27:00experimentmfsmaster[10132]:total:usedspace:3696877568(3GB),totalspace:16904503296(15GB),usage:21.87%
這里可以看到有4臺chunkserver已經(jīng)連接到了master#p#
客戶端掛載與工具使用
192.168.108.109
掛載MFS
mfsmount
- [root@client~]#mkdir/mnt/mfs
- [root@client~]#mfsmount-h192.168.108.108
- *mfsmount默認(rèn)情況下將分區(qū)加載到/mnt/mfs目錄下。如果想加載到其他目錄請利用-w參數(shù)。
- mfsmount–help
- usage:/usr/local/mfs/bin/mfsmount[-r][-m][-c][-v0..2][-hmasterhost][-pmasterport][-lpath][-wmountpoint]
- r:readonlymode
- m:mountmetadata
- c:allowusingcache
- v:verboselevel
- defaults:
- h:mfsmaster
- p:9421
- l:/
- w:/mnt/mfs
修改MFS文件刪除延遲時間
- mfsrsettrashtime
- [root@client~]#mfsrsettrashtime100/mnt/mfs/
- /mnt/mfs/:
- inodeswithtrashtimechanged:1(1)
- inodeswithtrashtimenotchanged:0(0)
- inodeswithpermissiondenied:0(0)
查看MFS文件刪除延遲時間
- mfsrgettrashtime
- #mfsrgettrashtime/mnt/mfs/
- /mnt/mfs/:
- directorieswithtrashtime100:1(1)
- mfssettrashtime
- [root@client~]#mfssettrashtime60/mnt/mfs/
- /mnt/mfs/:60
- mfsgettrashtime
- [root@client~]#mfsgettrashtime/mnt/mfs/
- /mnt/mfs/:60
- 設(shè)置文件保存份數(shù)
- mfssetgoal
- [root@client~]#mfssetgoal4/mnt/mfs/
- /mnt/mfs/:4
- 查看文件保存保存數(shù)
- mfsgetgoal
- [root@client~]#mfsgetgoal/mnt/mfs/
- /mnt/mfs/:4
- mfsrsetgoal
- [root@client~]#mfsrsetgoal3/mnt/mfs/
- /mnt/mfs/:
- inodeswithgoalchanged:1(1)
- inodeswithgoalnotchanged:0(0)
- inodeswithpermissiondenied:0(0)
- mfsrgetgoal
- [root@client~]#mfsrgetgoal/mnt/mfs/
- /mnt/mfs/:
- directorieswithgoal3:1(1)
文件(文件夾)的查看(檢查)命令
- 先生成1個10M的文件
- [root@client~]#ddif=/dev/zeroof=filebs=1Mcount=10
- [root@client~]#cpfile/mnt/mfs
- 文件信息查看
- mfsfileinfo
- [root@client~]#mfsfileinfo/mnt/mfs/file
- /mnt/mfs/file:
- chunk0:0000000000000001_00000001/(id:1ver:1)
- copy1:192.168.108.161:9422
- copy2:192.168.108.162:9422
- copy3:192.168.108.163:9422
- 文件檢查
- mfscheckfile
- [root@client~]#mfscheckfile/mnt/mfs/file
- /mnt/mfs/file:
- 3copies:1chunks
目錄信息查看
mfsdirinfo
- [root@client~]#rm/mnt/mfs/file
- [root@client~]#mkdir/mnt/mfs/newdir
- [root@client~]#cpfile/mnt/mfs/newdir
- [root@client~]#mfsdirinfo/mnt/mfs/newdir
- /mnt/mfs/newdir/:
- inodes:2(2)//inode個數(shù),1個目錄,1個文件
- directories:1(1)//1個目錄
- files:1(1)//1個文件
- goodfiles:1(1)//正常文件個數(shù)
- undergoalfiles:0(0)
- missingfiles:0(0)
- chunks:1(1)
- goodchunks:1(1)
- undergoalchunks:0(0)
- missingchunks:0(0)
- length:10M(10485760)
- size:10M(10490880)//這里是文件大小
- hddusage:30M(31472640)//由于我設(shè)置文件份數(shù)為3,因此這里為3*100M
- [root@client~]#cp/data/filenewdir/file_2
- /mnt/mfs/newdir/:
- inodes:3(3)
- directories:1(1)
- files:2(2)
- goodfiles:2(2)
- undergoalfiles:0(0)
- missingfiles:0(0)
- chunks:2(2)
- goodchunks:2(2)
- undergoalchunks:0(0)
- missingchunks:0(0)
- length:20M(20971520)
- size:20M(20981760)
- hddusage:60M(62945280)
創(chuàng)建文件快照
mfssnapshot
- [root@client/mnt/mfs/newdir]#mfssnapshotmysnapshotfile
- [root@client/mnt/mfs/newdir]#ll
- total30720
- -rw-r–r–1rootroot10485760Oct1616:43file
- -rw-r–r–1rootroot10485760Oct1616:44file_2
- -rw-r–r–1rootroot10485760Oct1616:58mysnapshot
- [root@monitor/mnt/mfs/newdir]#mfsfileinfomysnapshot
- mysnapshot:
- chunk0:0000000000000003_00000001/(id:3ver:1)
- copy1:192.168.108.161:9422
- copy2:192.168.108.162:9422
- copy3:192.168.108.163:9422
- [root@monitor/mnt/mfs/newdir]#mfsfileinfofile
- file:
- chunk0:0000000000000003_00000001/(id:3ver:1)
- copy1:192.168.108.161:9422
- copy2:192.168.108.162:9422
- copy3:192.168.108.163:9422
通過mfsfileinfo命令可以查看創(chuàng)建出來的文件快照,它只占用了一個inode,并不占用磁盤空間,就像ln命令創(chuàng)建硬鏈接類似。但mfsdirinfo的顯示似乎有些問題:
- [root@monitor/mnt/mfs/newdir]#mfsdirinfo/mnt/mfs/newdir/
- /mnt/mfs/newdir/:
- inodes:4(4)
- directories:1(1)
- files:3(3)
- goodfiles:3(3)
- undergoalfiles:0(0)
- missingfiles:0(0)
- chunks:3(3)
- goodchunks:3(3)
- undergoalchunks:0(0)
- missingchunks:0(0)
- length:30M(31457280)
- size:30M(31472640)
- hddusage:90M(94417920)
利用mfsdirinfo查看目錄信息發(fā)現(xiàn)剛剛創(chuàng)建的快照文件也占用了與原文件相同大小的磁盤空間。但實(shí)際情況真的如此嗎?
查看master的系統(tǒng)日志
- Oct1617:14:00experimentmfsmaster[24445]:inodes:5
- Oct1617:14:00experimentmfsmaster[24445]:dirnodes:2
- Oct1617:14:00experimentmfsmaster[24445]:filenodes:3
- Oct1617:14:00experimentmfsmaster[24445]:chunks:2
- Oct1617:14:00experimentmfsmaster[24445]:chunkstodelete:0
通過日志的chunks: 2 可知有2個chunks 剛剛mfsfineinfo查看文件得知file文件占用1個chunks那么2個chunks 說明有2個文件。再往上看一行filenodes: 3 說明文件inode數(shù)為3 說明有3個文件,這正是2個文件+1個快照文件。
查看各個mfschunkserver的mfs文件
通過查看master日志和查看各個數(shù)據(jù)存儲服務(wù)器上的mfs文件,驗證了我們剛才用mfsfileinfo的檢查結(jié)果!文件快照,它只占用了一個inode,并不占用磁盤空間,就像ln命令創(chuàng)建硬鏈接類似。