CentOS如何安裝MooseFS技術實戰
MooseFS(Moose File System,mfs)是一種分布式文件系統,它將數據分布在網絡中的不同服務器上,支持FUSE,客戶端可以作為一個 普通的Unix 文件系統使用MooseFS。
MooseFS中共有四種角色:主控服務器master server、元數據日志服務器metalogger server、存儲塊服務器chunkserver、客戶端client。
主控服務器負責各個存儲塊服務器的管理、文件讀寫調度、文件空間回收以及恢復、多節點拷貝。
元數據日志服務器負責備份主控服務器的元數據、變化日志文件,文件類型為changelog_ml.*.mfs,以便在主控服務器出問題的時候可以恢復。
存儲塊服務器負責提供存儲空間,并為客戶提供數據傳輸。
客戶端則通過fuse掛接主控服務器上所管理的存儲塊服務器,可以像操作本地文件一樣操作MooseFS中的文件。
Keepalived是一款服務器監控軟件,可以監控服務器運行狀態,當服務器死機或出現故障時,可以自動將服務切換到后備服務器上。
一、配置思路
1、自1.6.5之后,MooseFS提供了metalogger服務,默認每24小時自動獲得主控服務器的所有元數據和更改日志,可以作為備份主控
2、使用keepalived,監控主控服務器運行情況,當主控服務器宕掉之后,自動啟動備份主控服務器,接替主控服務器
3、主控服務器與備份主控使用相同的虛擬IP提供對外服務
4、客戶端通過fuse,直接訪問虛擬IP提供的在存儲塊服務器共享的資源
二、服務器信息
10.1.1.105 主控服務器
10.1.1.104 存儲塊服務器、元數據日志服務器,作為備份主控
10.1.1.103 對外的提供服務的虛擬IP
10.1.1.116 存儲塊服務器
10.1.1.111 客戶端
#p#
三、安裝配置MooseFS
對于主控服務器、元數據日志服務器、存儲塊服務器、客戶端,MooseFS提供相同的安裝文件,只是根據配置參數的不同,安裝不同的程序
常用的配置參數有disable-mfsmaster、disable-mfschunkserver、disable-mfsmount、disable-mfscgiserv,以及對應的enable選項,分別表示停用、啟用相應的安裝。所有選項默認是啟用的。在安裝的時候,安裝程序會自動檢測是否安裝了fuse開發包,如果檢測到,就會編譯支持mfsmount(fuse 2.7.2以上版本)選項。
另外還有with-default-user、with-default-group,用于指定MooseFS所對應的用戶、組
1、在http://www.moosefs.org/download.html下載軟件mfs-1.6.24.tar.gz
2、主控、存儲塊服務器、元數據日志服務器安裝
主控、存儲塊服務器、元數據日志服務器可以使用相同的配置安裝,只需要指定安裝目錄、用戶、組,其他的都使用默認配置
創建用戶、組
[root@localhost ~]# groupadd mfs
[root@localhost ~]# useradd -g mfs mfs
解壓、安裝
[root@localhost ~]# tar xvf mfs-1.6.24.tar.gz
[root@localhost ~]# cd mfs-1.6.24
[root@localhost mfs-1.6.24]# ./configure --prefix=/Data/apps/mfs --with-default-user=mfs --with-default-group=mfs
[root@localhost mfs-1.6.24]# make && make install
主控服務器是MooseFS的核心,應當安裝在具有高穩定性、高配置的服務器上。最關鍵的是內存要足夠大,MooseFS對內存的要求與存放的文件個數有關。按照官方的數據,存儲塊服務器上的1百萬文件,主控服務器需要300M內存存放相關的信息。硬盤也要大,受存儲塊服務器上文件、塊的個數(影響元數據文件大小)、文件變更數(影響changelog)的影響;2500萬文件、50小時的變更日志需要20G空間。對CPU也有較高的要求,受MooseFS中文件的操作頻率影響。
在這里,10.1.1.104作為元數據日志服務器的同時,也是備份主控服務器,使用了跟主控服務器相同的配置。
存儲塊服務器應當提供1G以上的可用空間,才可以寫入文件,實際生產環境中,至少應提供幾個G的可用空間。
3、客戶端安裝
客戶端需要安裝fuse及fuse開發包,可以使用yum來安裝
[root@localhost ~]# yum -y install fuse*
創建用戶、組
[root@localhost ~]# groupadd mfs
[root@localhost ~]# useradd -g mfs mfs
解壓、安裝
[root@localhost ~]# tar xvf mfs-1.6.24.tar.gz
[root@localhost ~]# cd mfs-1.6.24
[root@localhost mfs-1.6.24]# ./configure --prefix=/Data/apps/mfs --with-default-user=mfs --with-default-group=mfs --enable-mfsmount
[root@localhost mfs-1.6.24]# make && make install
4、配置
主控服務器、存儲塊服務器、元數據日志服務器分別使用不同的配置文件。配置文件默認存放目錄是安裝目錄下的etc目錄,即${prefix}/etc,其中${prefix}即上面指定的/Data/apps/mfs。
主控服務器使用的配置文件是mfsmaster.cfg,可以參照${prefix}/etc下的mfsmaster.cfg.dist創建,其中注釋掉的信息是當前的默認值,使用這些默認值就可以正常運行。
另外,主控服務器也用到了mfsexports.cfg文件,指定了哪些客戶端機器可以遠程掛載MooseFS文件系統、具有什么權限。在文件里,添加這一行
10.1.1.0/24 / rw,alldirs,maproot=0
表明10.1.1.0~10.1.1.255網段的機器都可以掛載MooseFS文件系統,具有讀寫、掛載任意指定的子目錄權限、自動映射為root用戶。
IP地址有幾種表現形式:所有ip,單個ip,IP網絡地址/位數掩碼,IP網絡地址/子網掩碼,ip段范圍。
權限部分中:ro 只讀模式共享,rw 讀寫方式共享;alldirs 許掛載任何指定的子目錄;maproot 映射為root或者其他的用戶;password 指定客戶端密碼。
在默認數據目錄${prefix}/var/mfs下,安裝時會產生一個空的元數據文件metadata.mfs.empty,根據這個文件復制出初始的元數據文件metadata.mfs:
[root@localhost ~]# cp metadata.mfs.empty metadata.mfs
然后就可以啟動master服務了
[root@localhost ~]# /Data/apps/mfs/sbin/mfsmaster start
master服務運行后,會在數據目錄${prefix}/var/mfs下產生元數據備份文件metadata.mfs.back、日志文件changelog.*.mfs、sessions.mfs文件等,默認保留前50小時的日志,即mfsexports.cfg中BACK_LOGS的設置的值。
master服務每小時會把changelog.*.mfs文件合并到元數據文件中。
元數據日志服務器中使用的配置文件是mfsmetalogger.cfg,可以參照${prefix}/etc下的mfsmetalogger.cfg.dist創建,其中注釋掉的信息是當前的默認值。要注意的是,其中的MASTER_HOST\MASTER_PORT指定了主控服務器的位置、端口,需要修改為正確的。默認MASTER_HOST是mfsmaster。先修改/etc/hosts文件,增加一行
10.1.1.103 mfsmaster
啟動metalogger服務
[root@localhost ~]# /Data/apps/mfs/sbin/mfsmetalogger start
啟動后,可以看到默認數據目錄${prefix}/var/mfs下會復制主控服務器的元數據備份文件metadata_ml.mfs.back、日志文件changelog_ml_back.*.mfs、sessions_ml.mfs文件
另外,可以把mfsmetalogger.cfg文件中的META_DOWNLOAD_FREQ設置成1,即每小時復制一次metadata.mfs.back文件,減少恢復的延遲時間。
存儲塊服務器中使用的配置文件是mfschunkserver.cfg,可以參照${prefix}/etc下的mfschunkserver.cfg.dist創建,其中注釋掉的信息是當前的默認值。要注意的是,其中的MASTER_HOST\MASTER_PORT指定了主控服務器的位置、端口,需要修改為正確的。默認MASTER_HOST是mfsmaster,先修改/etc/hosts文件,增加一行
10.1.1.103 mfsmaster
創建一個用于存放數據的目錄,并授予權限
[root@localhost ~]# mkdir /testshared
[root@localhost ~]# chown -R mfs:mfs /testshared
另外,mfschunkserver.cfg中指定了共享硬盤使用的配置文件mfshdd.cfg,同樣可以參照${prefix}/etc下的mfshdd.cfg.dist創建。在里面添加剛才配置的目錄
/testshared
存儲塊服務器中共享的硬盤應當只供mfs使用,以便mfs能正確的管理它的自由空間。
這樣就可以啟動存儲塊服務器了。
[root@localhost ~]# /Data/apps/mfs/sbin/mfschunkserver start
客戶端
修改/etc/hosts文件,增加一行
10.1.1.103 mfsmaster
創建一個作為掛載點的目錄,使用mfsmount命令掛載,就可以當作本地文件夾一樣操作MooseFS的目錄了
[root@localhost ~]# /Data/apps/mfs/bin/mfsmount /Data/webapps/img.muzhiwan.com/mfs -H mfsmaster
其中,-H參數掛載整個mfs目錄
-P 指定實際使用的端口
-S 指定掛載的子目錄
#p#
四、安裝配置keepalived
通過keepalived,監控主控服務器,當主控服務器10.1.1.105上的mfsmaster服務出現問題時,自動切換到元數據日志服務器10.1.1.104。
到http://www.keepalived.org/download.html 下載最新的keepalived。
解壓、安裝
- [root@localhost ~]# tar xvf keepalived-1.2.2.tar.gz
- [root@localhost ~]# cd keepalived-1.2.2
- [root@localhost keepalived-1.2.2]# ./configure --prefix=/
- Keepalived configuration
- ------------------------
- Keepalived version : 1.2.2
- Compiler : gcc
- Compiler flags : -g -O2 -DETHERTYPE_IPV6=0x86dd
- Extra Lib : -lpopt -lssl -lcrypto
- Use IPVS Framework : No
- IPVS sync daemon support : No
- Use VRRP Framework : Yes
- Use Debug flags : No
這里只需要啟用VRRP就可以
[root@localhost keepalived-1.2.2]# make && make install
安裝后,配置為隨機啟動服務
- chmod +x /etc/rc.d/init.d/keepalived
- chkconfig --add keepalived
- chkconfig --level 21 keepalived on
使用的配置文件是/etc/keepalived/keepalived.conf。
主控服務器10.1.1.105上的配置文件是,每兩秒鐘使用腳本檢測mfsmaster運行情況,發現運行失敗,就停止keepaled服務
- ! Configuration File for keepalived
- global_defs {
- router_id LVS_STTD
- }
- vrrp_script check_run {
- script "/Data/apps/mfs/keepalived_check_mfsmaster.sh"
- interval 2
- }
- vrrp_sync_group VG1 {
- group {
- VI_1
- }
- }
- vrrp_instance VI_1 {
- state MASTER
- interface eth1
- virtual_router_id 88
- priority 100
- advert_int 1
- nopreempt
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- track_script {
- check_run
- }
- virtual_ipaddress {
- 10.1.1.103
- }
- }
- /Data/apps/mfs/keepalived_check_mfsmaster.sh腳本,如mfsmaster未運行,則停止keepalived服務
- #!/bin/sh
- CHECK_TIME=2
- mfspath="/Data/apps/mfs/sbin/mfsmaster"
- function check_mfsmaster () {
- ps -ef | grep mfsmaster | grep "/Data/apps/mfs/sbin/mfsmaster" | grep -v "grep"
- if [ $? = 0 ] ;then
- MFS_OK=1
- else
- MFS_OK=0
- fi
- return $MFS_OK
- }
- while [ $CHECK_TIME -ne 0 ]
- do
- let "CHECK_TIME -= 1"
- check_mfsmaster
- if [ $MFS_OK = 1 ] ; then
- CHECK_TIME=0
- exit 0
- fi
- if [ $MFS_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ] ;then
- /etc/init.d/keepalived stop
- exit 1
- fi
- done
元數據日志服務器上keepalved配置
- ! Configuration File for keepalived
- global_defs {
- router_id LVS_STTD
- }
- vrrp_sync_group VG1 {
- group {
- VI_1
- }
- notify_master "/Data/apps/mfs/keepalived_notify.sh master"
- notify_backup "/Data/apps/mfs/keepalived_notify.sh backup"
- }
- vrrp_instance VI_1 {
- state BACKUP
- interface eth1
- virtual_router_id 88
- priority 80
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 10.1.1.103
- }
- }
- /Data/apps/mfs/keepalived_notify.sh腳本
- #!/bin/bash
- MFS_HOME=/Data/apps/mfs
- MFSMARSTER=${MFS_HOME}/sbin/mfsmaster
- MFSMETARESTORE=${MFS_HOME}/sbin/mfsmetarestore
- MFS_DATA_PATH=${MFS_HOME}/var/mfs
- function backup2master(){
- $MFSMETARESTORE -m ${MFS_DATA_PATH}/metadata.mfs.back -o ${MFS_DATA_PATH}/metadata.mfs $MFS_DATA_PATH/changelog_ml*.mfs
- $MFSMARSTER start
- }
- function master2backup(){
- $MFSMARSTER stop
- /Data/apps/mfs/sbin/mfsmetalogger start
- }
- function ERROR(){
- echo "USAGE: keepalived_notify.sh master|backup "
- }
- case $1 in
- master)
- backup2master
- ;;
- backup)
- master2backup
- ;;
- *)
- ERROR
- ;;
- esac
#p#
五、故障切換
在10.1.1.105上停止mfsmaster服務,查看日志
- [root@localhost init.d]# tail -f /var/log/messages
- May 2 12:18:40 localhost snmpd[28923]: Connection from UDP: [211.157.110.180]:64027->[114.113.149.105]
- May 2 12:18:40 localhost snmpd[28923]: Connection from UDP: [211.157.110.180]:64027->[114.113.149.105]
- May 2 12:18:40 localhost snmpd[28923]: Connection from UDP: [211.157.110.180]:19812->[114.113.149.105]
- May 2 12:18:40 localhost snmpd[28923]: Connection from UDP: [211.157.110.180]:19812->[114.113.149.105]
- May 2 12:18:41 localhost snmpd[28923]: Connection from UDP: [211.157.110.180]:9005->[114.113.149.105]
- May 2 12:18:41 localhost snmpd[28923]: Connection from UDP: [211.157.110.180]:9005->[114.113.149.105]
- May 2 12:18:41 localhost snmpd[28923]: Connection from UDP: [211.157.110.180]:4508->[114.113.149.105]
- May 2 12:18:41 localhost snmpd[28923]: Connection from UDP: [211.157.110.180]:36607->[114.113.149.105]
- May 2 12:18:41 localhost snmpd[28923]: Connection from UDP: [211.157.110.180]:31566->[114.113.149.105]
- May 2 12:18:41 localhost snmpd[28923]: Connection from UDP: [211.157.110.180]:12040->[114.113.149.105]
- May 2 12:19:17 localhost mfsmaster[30383]: set gid to 501
- May 2 12:19:17 localhost mfsmaster[30383]: set uid to 501
- May 2 12:19:17 localhost mfsmaster[28772]: matocu: closing *:9421
- May 2 12:19:17 localhost mfsmaster[28772]: matocs: closing *:9420
- May 2 12:19:17 localhost mfsmaster[28772]: matoml: closing *:9419
- May 2 12:19:20 localhost Keepalived: Terminating on signal
- May 2 12:19:20 localhost Keepalived: Stopping Keepalived v1.2.2 (04/23,2012)
- May 2 12:19:20 localhost Keepalived_vrrp: Terminating VRRP child process on signal
- May 2 12:19:20 localhost Keepalived_vrrp: VRRP_Instance(VI_1) removing protocol VIPs.
查看10.1.1.104的日志
- [root@localhost log]# tail -f messages
- May 2 12:19:17 localhost mfschunkserver[17620]: connection reset by Master
- May 2 12:19:17 localhost mfsmetalogger[6105]: connection was reset by Master
- May 2 12:19:20 localhost mfschunkserver[17620]: connecting ...
- May 2 12:19:20 localhost mfsmetalogger[6105]: connecting ...
- May 2 12:19:20 localhost mfschunkserver[17620]: connection failed, error: ECONNREFUSED (Connection refused)
- May 2 12:19:20 localhost mfsmetalogger[6105]: connection failed, error: ECONNREFUSED (Connection refused)
- May 2 12:19:23 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
- May 2 12:19:23 localhost Keepalived_vrrp: VRRP_Group(VG1) Syncing instances to MASTER state
- May 2 12:19:23 localhost mfsmaster[17690]: set gid to 504
- May 2 12:19:23 localhost mfsmaster[17690]: set uid to 504
- May 2 12:19:23 localhost mfsmaster[17690]: sessions have been loaded
- May 2 12:19:23 localhost mfsmaster[17690]: exports file has been loaded
- May 2 12:19:23 localhost mfsmaster[17690]: mfstopology configuration file (/Data/apps/mfs/etc/mfstopology.cfg) not found - network topology not defined
- May 2 12:19:23 localhost mfsmaster[17690]: stats file has been loaded
- May 2 12:19:23 localhost mfsmaster[17690]: master <-> metaloggers module: listen on *:9419
- May 2 12:19:23 localhost mfsmaster[17690]: master <-> chunkservers module: listen on *:9420
- May 2 12:19:23 localhost mfsmaster[17690]: main master server module: listen on *:9421
- May 2 12:19:23 localhost mfsmaster[17690]: open files limit: 5000
- May 2 12:19:23 localhost mfschunkserver[17620]: testing chunk: /Data/testshared/03/chunk_0000000000000003_00000001.mfs
- May 2 12:19:24 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
- May 2 12:19:24 localhost Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.
- May 2 12:19:24 localhost avahi-daemon[7367]: Registering new address record for 10.1.1.103 on eth1.
- May 2 12:19:24 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 10.1.1.103
- May 2 12:19:24 localhost mfschunkserver[17620]: connecting ...
- May 2 12:19:24 localhost mfsmetalogger[6105]: connecting ...
- May 2 12:19:25 localhost mfsmaster[17690]: chunkserver register begin (packet version: 5) - ip: 10.1.1.116, port: 9422
- May 2 12:19:25 localhost mfsmaster[17690]: chunkserver register end (packet version: 5) - ip: 10.1.1.116, port: 9422, usedspace: 2801012736 (2.61 GiB), totalspace: 169845575680 (158.18 GiB)
- May 2 12:19:27 localhost mfschunkserver[17620]: connected to Master
- May 2 12:19:27 localhost mfsmetalogger[6105]: connected to Master
- May 2 12:19:27 localhost mfsmaster[17690]: chunkserver register begin (packet version: 5) - ip: 10.1.1.104, port: 9422
- May 2 12:19:27 localhost mfsmaster[17690]: chunkserver register end (packet version: 5) - ip: 10.1.1.104, port: 9422, usedspace: 1069522944 (1.00 GiB), totalspace: 275084394496 (256.19 GiB)
- May 2 12:19:28 localhost mfsmetalogger[6105]: metadata downloaded 1490B/0.000284s (5.246 MB/s)
- May 2 12:19:28 localhost mfsmetalogger[6105]: changelog_0 downloaded 0B/0.000001s (0.000 MB/s)
- May 2 12:19:28 localhost mfsmetalogger[6105]: changelog_1 downloaded 0B/0.000001s (0.000 MB/s)
- May 2 12:19:28 localhost mfsmetalogger[6105]: sessions downloaded 205B/0.000096s (2.135 MB/s)
- May 2 12:19:29 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 10.1.1.103
- May 2 12:19:33 localhost mfschunkserver[17620]: testing chunk: /Data/testshared/0E/chunk_000000000000000E_00000001.mfs
- May 2 12:19:43 localhost mfschunkserver[17620]: testing chunk: /Data/testshared/0F/chunk_000000000000000F_00000001.mfs
- May 2 12:19:53 localhost mfschunkserver[17620]: testing chunk: /Data/testshared/06/chunk_0000000000000006_00000001.mfs
已經自動切換了
#p#
六、簡單性能測試
小文件
- [root@localhost f1]# dd if=/dev/zero of=1.img bs=100K count=5000
- 5000+0 records in
- 5000+0 records out
- 512000000 bytes (512 MB) copied, 6.26102 s, 81.8 MB/s
大文件
- [root@localhost f1]# dd if=/dev/zero of=1.img bs=1M count=5000
- 5000+0 records in
- 5000+0 records out
- 5242880000 bytes (5.2 GB) copied, 61.5205 s, 85.2 MB/s
- [root@localhost f1]# dd if=/dev/zero of=1.img bs=50K count=5000
- dd if=/dev/zero of=1.img bs=10K count=5000
- 5000+0 records in
- 5000+0 records out
- 256000000 bytes (256 MB) copied, 3.16866 s, 80.8 MB/s
- [root@localhost f1]# dd if=/dev/zero of=1.img bs=10K count=5000
- 5000+0 records in
- 5000+0 records out
- 51200000 bytes (51 MB) copied, 0.582408 s, 87.9 MB/s
- 創建1000X1000個小文件
- [root@localhost test]# time ./1000.sh
- real 177m8.487s
- user 6m36.276s
- sys 32m4.413s
本機測試
小文件
- [root@hadoop03 test]# dd if=/dev/zero of=1.img bs=100K count=5000
- 5000+0 records in
- 5000+0 records out
- 512000000 bytes (512 MB) copied, 0.871519 s, 587 MB/s
大文件
- [root@hadoop03 test]# dd if=/dev/zero of=1.img bs=1M count=5000
- 5000+0 records in
- 5000+0 records out
- 5242880000 bytes (5.2 GB) copied, 23.7836 s, 220 MB/s
- [root@hadoop03 test]# dd if=/dev/zero of=1.img bs=50K count=5000
- 5000+0 records in
- 5000+0 records out
- 256000000 bytes (256 MB) copied, 2.0681 s, 124 MB/s
- 1000*1000個小文件
- [root@hadoop03 test]# time ./1000.sh
- real 32m1.278s
- user 5m19.947s
- sys 28m54.985s
- 1000.sh腳本內容
- #!/bin/bash
- for ((i=0;i<1000;i++))
- do
- mkdir ${i}
- cd ${i}
- for ((j=0;j<1000;j++))
- do
- cp /Data/webapps/img.muzhiwan.com/mfs/test/1.img ${j}
- done
- cd ..
- done
#p#
七、注意
注意/etc/hosts里面mfsmaster指向虛擬ip,否則切換到從服務器時候報錯
- Apr 24 16:19:15 localhost mfschunkserver[5833]: connecting ...
- Apr 24 16:19:15 localhost mfsmetalogger[5829]: connecting ...
- Apr 24 16:19:15 localhost mfschunkserver[5833]: connection failed, error: ECONNREFUSED (Connection refused)
- Apr 24 16:19:15 localhost mfsmetalogger[5829]: connection failed, error: ECONNREFUSED (Connection refused)
對文件夾goal的設置,會影響新增加的文件,但是不會影響已有的文件;
可以使用/Data/apps/mfs/sbin/mfscgiserv啟動web gui,監控MooseFS運行情況;
也可以使用nagios監控MooseFS運行情況。
八、參考資料
http://www.moosefs.org/reference-guide.html 官方手冊
http://bbs.chinaunix.net/thread-1644309-1-1.html shinelian總結的mfs權威指南
http://sery.blog.51cto.com/10037/263515 田逸的分布式文件系統MFS(moosefs)實現存儲共享(第二版)
http://blog.csdn.net/liuyunfengheda/article/details/5260278 流云隨風的MFS總結
http://blog.csdn.net/pc620/article/details/6327956 常見問題