MFS分佈式文件部署

MFS分佈式文件部署

1.環境

VMware Workstation

centos7(master server),IP地址:192.168.73.100,安裝軟件:moosefs-3.0

centos7(metalogger server),IP地址:192.168.73.101,安裝軟件:moosefs-3.0

centos7(chunk server1),IP地址:192.168.73.102,安裝軟件:moosefs-3.0

centos7(chunk server2),IP地址:192.168.73.103,安裝軟件:moosefs-3.0

centos7(chunk server3),IP地址:192.168.73.104,安裝軟件:moosefs-3.0

centos7(client),IP地址:192.168.73.105,安裝軟件:moosefs-3.0

2.遇到的問題和解決辦法

  • 問題:
    • 1.業務功能上能夠滿足要求
    • 2.在性能和容量上無法滿足更高的要求
    • 3.NFS服務器不堪重負,出現超時的問題
    • 4.NFS存在着單點故障的問題
  • 採用MFS解決上述問題
    • 1.採用分佈式文件系統
    • 2.服務器之間的數據訪問不再是一對多的關係,而是多對多的關係
    • 3.可以使性能得到大幅提升

3.拓撲圖

在這裏插入圖片描述

4.實驗過程

  • 6臺服務器上關閉防火牆、安全防護、主機名、host文件配置
[root@localhost ~]# hostnamectl set-hostname client	'//修改主機名'
[root@localhost ~]# su
[root@client ~]# systemctl stop firewalld	'//關閉防火牆'
[root@client ~]# systemctl disable firewalld	'//取消開機自啓動'
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@client ~]# setenforce 0	'//關閉核心防護'
[root@client ~]# vi /etc/sysconfig/selinux 
SELINUX=disabled	'//取消開啓自啓動'
[root@client ~]# vi /etc/hosts	'//修改本地主機映射文件'
192.168.73.100	master
192.168.73.101	metalogger
192.168.73.102	chunk01
192.168.73.103	chunk02
192.168.73.104	chunk03
192.168.73.105 client
[root@client ~]# yum -y install gcc gcc-c++ zlib-devel	'//安裝編譯器'
  • 搭建MFSmaster
  • 創建用戶並編譯安裝源碼包
[root@master ~]# useradd -s /sbin/nologin -M mfs	'//創建用戶'
[root@master ~]# mount.cifs //192.168.11.1/ccc /mnt	'//掛載宿主機目錄'
Password for root@//192.168.11.1/ccc:  
[root@master ~]# cd /mnt/mfs
[root@master mfs]# tar zxvf moosefs-3.0.100-1.tar.gz -C /opt	'//解壓源碼包到/opt目錄下'
[root@master mfs]# cd /opt/moosefs-3.0.100/
[root@master moosefs-3.0.100]# ./configure \	'//進行配置'
> --prefix=/usr/local/mfs \	'//指定安裝目錄'
> --with-default-user=mfs \	'//指定運行用戶'
> --with-default-group=mfs \	'//指定運行組'
> --disable-mfschunkserver \	'//禁用chunk功能'
> --disable-mfsmount	'//禁用mfsmount功能'
[root@master moosefs-3.0.100]# make && make install	'//編譯安裝'
  • 複製master配置文件
[root@master opt]# cd /usr/local/mfs/etc/mfs/	'//進入mfs目錄'
[root@master mfs]# ls
mfsexports.cfg.sample  mfsmaster.cfg.sample  mfsmetalogger.cfg.sample  mfstopology.cfg.sample
    '//將幾個配置文件的模板複製一下'
[root@master mfs]# cp mfsmaster.cfg.sample mfsmaster.cfg
[root@master mfs]# cp mfsexports.cfg.sample mfsexports.cfg
[root@master mfs]# cp mfstopology.cfg.sample mfstopology.cfg
[root@master mfs]# cd /usr/local/mfs/var/mfs/
[root@master mfs]# cp metadata.mfs.empty metadata.mfs
[root@master mfs]# chown mfs:mfs /usr/local/mfs/var/mfs	'//設置目錄的屬主屬組'
[root@master mfs]# /usr/local/mfs/sbin/mfsmaster start	'//開啓master server'
[root@master mfs]# netstat -anpt | grep mfs	'//檢測mfs是否開啓'
tcp        0      0 0.0.0.0:9419            0.0.0.0:*               LISTEN      41396/mfsmaster     
tcp        0      0 0.0.0.0:9420            0.0.0.0:*               LISTEN      41396/mfsmaster     
tcp        0      0 0.0.0.0:9421            0.0.0.0:*               LISTEN      41396/mfsmaster   
    '//停止 Master Server 的命令是/usr/local/mfs/sbin/mfsmaster stop'
  • 搭建MFS日誌服務器
  • 相同的方法編譯安裝源碼包,創建用戶
  • 複製metalogger主配置文件並編輯
[root@metalogger moosefs-3.0.100]# cd /usr/local/mfs/etc/mfs
[root@metalogger mfs]# ls
mfsexports.cfg.sample  mfsmaster.cfg.sample  mfsmetalogger.cfg.sample  mfstopology.cfg.sample
[root@metalogger mfs]# cp mfsmetalogger.cfg.sample mfsmetalogger.cfg
[root@metalogger mfs]# vim mfsmetalogger.cfg	'//編輯日誌配置文件'
 MASTER_HOST = 192.168.73.100	'//取消註釋,指定master服務器地址'
  • 啓動mfs服務
[root@metalogger mfs]# /usr/local/mfs/sbin/mfsmetalogger start
open files limit has been set to: 4096
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmetalogger modules ...
mfsmetalogger daemon initialized properly
[root@metalogger mfs]# netstat -anpt | grep mfs
tcp        0      0 192.168.73.101:37252   192.168.73.100:9419    ESTABLISHED 51991/mfsmetalogger 
  • 搭建chunk存儲端
  • 相同方法編譯安裝源碼包,並創建用戶
  • 三臺節點的操作都一樣
  • 複製mfschunk主配置文件並編輯
[root@chunk01 moosefs-3.0.100]# cd /usr/local/mfs/etc/mfs/
[root@chunk01 mfs]# ls
mfschunkserver.cfg.sample  mfshdd.cfg.sample  mfsmetalogger.cfg.sample
[root@chunk01 mfs]# cp mfschunkserver.cfg.sample mfschunkserver.cfg
[root@chunk01 mfs]# cp mfshdd.cfg.sample mfshdd.cfg
[root@chunk01 mfs]# vi mfschunkserver.cfg	'//編輯存儲節點配置文件'
MASTER_HOST = 192.168.73.100	'//指向master服務器地址'
[root@chunk01 mfs]# vim mfshdd.cfg
/data	'//添加一個掛載點目錄'
[root@chunk01 mfs]# mkdir /data	'//創建掛載點'
[root@chunk01 mfs]# chown -R mfs:mfs /data	'//給掛載點屬主屬組'
  • 啓動mfs服務
[root@chunk01 mfs]# /usr/local/mfs/sbin/mfschunkserver start
[root@chunk01 mfs]# netstat -anpt | grep mfs
tcp        0      0 0.0.0.0:9422            0.0.0.0:*               LISTEN      103672/mfschunkserv 
tcp        0      0 192.168.73.102:49394   192.168.73.100:9420    ESTABLISHED 103672/mfschunkserv 
  • 安裝mfs掛到客戶端
  • 安裝fuse
[root@master ~]# useradd -s /sbin/nologin -M mfs
[root@master ~]# mount.cifs //192.168.11.1/ccc /mnt
Password for root@//192.168.11.1/ccc:  
[root@master ~]# cd /mnt/mfs
[root@master mfs]# tar zxvf moosefs-3.0.100-1.tar.gz -C /opt
[root@master mfs]# tar xzvf fuse-2.9.2.tar.gz -C /opt
[root@master mfs]# cd /opt/fuse-2.9.2
[root@client fuse-2.9.2]# ./configure
[root@client fuse-2.9.2]# make && make install
    '//設置環境變量'
[root@client fuse-2.9.2]# echo "export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH" >> /etc/profile
[root@client fuse-2.9.2]# source /etc/profile	'//使之不重啓即可生效'
  • 安裝mfs客戶端
[root@client fuse-2.9.2]# cd ../moosefs-3.0.100/
[root@client moosefs-3.0.100]# ./configure \
> --prefix=/usr/local/mfs \
> --with-default-user=mfs \
> --with-default-group=mfs \
> --disable-mfsmaster \
> --disable-mfschunkserver \
> --enable-mfsmount
[root@client moosefs-3.0.100]# make && make install
  • 掛載mfs文件系統
[root@client moosefs-3.0.100]# cd
[root@client ~]# mkdir /opt/mfs	'//創建掛載點'
[root@client ~]# modprobe fuse	'//加載fuse模塊到內核'
[root@client ~]# /usr/local/mfs/bin/mfsmount /opt/mfs -H 192.168.73.100	'//指向master服務器地址'
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
[root@client ~]# df -hT
文件系統                類型      容量  已用  可用 已用% 掛載點
。。。省略內容
192.168.73.100:9421    fuse.mfs   60G   13G   48G   21% /opt/mfs	'//掛載成功'
  • mfs優化操作
'//MFS 在客戶端安裝完畢後, 會生成/usr/local/mfs/bin/目錄, 在這個目錄下有很多命令是用戶所需要的。 爲了方便使用這些命令,將/usr/local/mfs/bin 加入到環境變量中'
[root@client ~]# echo "export PATH=/usr/local/mfs/bin:$PATH" >> /etc/profile
[root@client ~]# source /etc/profile
'//mfsgetgoal 命令用來查詢文件被複制的份數, 利用-r 命令可以對整個目錄進行遞歸,goal 是指文件被複制的份數'
[root@client ~]# mfsgetgoal -r /opt/mfs
/opt/mfs:
 directories with goal          2 :          1

'//命令 mfsgetgoal 用來設置文件被複制的份數, 生產環境 Chunk Server 節點數量應至少大於 2, 文件副本數小於等於 Chunk Server 服務器的數量'
[root@client ~]# mfssetgoal -r 3 /opt/mfs/
/opt/mfs/:
 inodes with goal changed:                       1
 inodes with goal not changed:                   0
 inodes with permission denied:                  0

'//創建文件測試一下'
[root@client ~]# cd /opt/mfs
[root@client mfs]# touch aaa.txt
[root@client mfs]# mfsgetgoal aaa.txt
aaa.txt: 3
  • 創建MFS監控
  • master服務器啓動監控程序
[root@master ~]# /usr/local/mfs/sbin/mfscgiserv
mfscgiserv是用python編寫的一個web服務器,其監聽端口是9425,可以在masster server 上通過 /usr/local/mfs/sbin/mfscgiserv來啓動,用戶利用瀏覽器就可以完全監控所有客戶掛接、Chunk server、Master server等。
  • 訪問測試
  • 在宿主機瀏覽器中打開http:192.168.73.100:9425

在這裏插入圖片描述

  • 宿主機瀏覽器打開http://192.168.73.100:9425/mfs.cgi?masterhost=master

在這裏插入圖片描述

  • 其中各部分含義如下:
    • Info 部分: 顯示了 MFS 的基本信息。
    • Servers 部分: 列出現有 Chunk Server。
    • Disks 部分: 列出現有 Chunk Server 硬盤信息。
    • Exports 部分: 列出可被掛載的目錄。
    • Mounts 部分: 列出被掛載的目錄。
    • Operations 部分: 顯示正在執行的操作。
    • Resources 部分: 列出當前存儲信息。
    • Quitas 部分: 列出當前配額信息。
    • Master charts 部分: 顯示 Master Server 的操作情況, 讀、 寫、 刪除等操作。
    • Server charts 部分: 顯示 Chunk Server 的操作情況、 數據傳輸率及系統狀態。

5.學習mfs維護及災備

  • mfs集羣的啓動順序

    • (1) 啓動 mfsmaster 進程。
    • (2)啓動所有的 mfschunkserver 進程。
    • (3) 啓動 mfsmetalogger 進程(如果配置了mfsmetalogger)。
    • (4) 在所有的客戶端掛載 MFS 文件系統。
  • mfs集羣的停止順序

    • (1) 在所有的客戶端卸載 MFS 文件系統。
    • (2) 用 mfschunkserver stop 命令停止 chunkserver 進程。
    • (3) 用 mfsmetalogger stop 命令停止 metalogger 進程。
    • (4) 用 mfsmaster stop 命令停止 master 進程
  • mfs災備恢復

    • 整個 MFS 體系中, 直接斷電只有 Master 有可能無法啓動, 可以在 master 上使用命令 /usr/local/mfs/sbin/mfsmaster -a修復
    • MFS 元數據通常有兩部分的數據, 分別如下:
    • 1、主要元數據文件 metadata.mfs, 當 mfsmaster 運行時會被命名爲 metadata.mfs.back。
    • 2、元數據改變日誌 changelog.*.mfs, 存儲了過去的 N 小時的文件改變(N 的數值是由
      BACK_LOGS 參數設置的, 參數的設置在 mfschunkserver.cfg 配置文件中)。
    • 3、在 Master 發生故障時, 可以從 MetaLogger 中恢復 Master, 步驟如下
    • 4、安裝一臺 mfsmaster, 利用同樣的配置來配置這臺 mfsmaster。
    • 5、將 metalogger 上 /usr/local/mfs/var/mfs/目錄下的文件複製到 master 相應的目錄中
      [root@master ~]#scp [email protected]:/usr/local/mfs/var/mfs/* /usr/local/mfs/var/mfs/
    • 利用 mfsmetarestore 命令合併元數據changelogs
    • [root@master ~]#/usr/local/mfs/sbin/mfsmaster -a
    • 如果是全新安裝的 Master, 恢復數據後, 要更改 metalogger 和 chunkserver 配置MASTER_HOST 的 IP, 客戶端也需要重新掛載

6.災難測試,恢復測試及其他測試

  • ​ client服務器怎麼操作都不會影響master
- 客戶端強制kill -9殺掉mfsmount進程,需要先umount,然後再mount。否則會提示:
- fuse: bad mount point `/usr/mfstest/': Transport endpoint is not connected
- see: /usr/local/mfs/bin/mfsmount -h for help
  • matser、metalogger、chunker、client端,服務器關機(init0)和重啓(init6)時,程序都是正常關閉,無需修復。
   - 正常啓動順序:matser---chunker---metalogger---client
         關閉順序:client---chunker---metalogger---master
   - 但實際中無論如何順序啓動或關閉,未見任何異常。
  • 整個mfs體系中,直接斷電只有master有可能無法啓動。
-使用mfsmetarestore -a修復才能啓動,如果無法修復,使用metalogger上的備份日誌進行恢復。(幾次測試發現:如果mfsmetarestore -a無法修復,則使用metalogger也無法修復)。

-強制使用metadata.mfs.back創建metadata.mfs,可以啓動master,但應該會丟失1小時的數據。

-mfs開發小組針對此問題回信:明確表示會丟失故障點到上一個整點之間的數據。和之前我猜測的一致。因爲對mfs的操作日誌都記錄到changelog.0.mfs裏面。changelog.0.mfs每小時合併一次到metadata.mfs中,如果突然斷電,則changelog.0.mfs裏面的信息就沒有合併到metadata中,強制使用metadata.mfs.back創建metadata.mfs,就會導致丟失changelog.0.mfs裏的數據。

-直接斷電測試過程,使用mfsmetarestore –a無法修復,使用metalogger也無法修復的情況較少發生。5次只有一次無法修復。
  • chunker的維持:chunker的塊(chunks)能夠自動複製或刪除
-對一個目錄設定“goal”,此目錄下的新創建文件和子目錄均會繼承此目錄的設定,但不會改變已經存在的文件及目錄的copy份數。但使用-r選項可以更改已經存在的copy份數。
 
-goal設置爲2,只要兩個chunker有一個能夠正常運行,數據就能保證完整性。
假如每個文件的goal(保存份數)都不小於2,並且沒有under-goal文件(可以用mfsgetgoal –r和mfsdirinfo命令來檢查),那麼一個單一的chunkserver在任何時刻都可能做停止或者是重新啓動。以後每當需要做停止或者是重新啓動另一個chunkserver的時候,要確定之前的chunkserver被連接,而且要沒有under-goal chunks。
 
-實際測試時,傳輸一個大文件,設置存儲2份。傳輸過程中,關掉chunker1,這樣絕對會出現有部分塊只存在chunker2上;啓動chunker1,關閉chuner2,這樣絕對會有部分塊只存在chuner1上。
把chunker2啓動起來。整個過程中,客戶端一直能夠正常傳輸。

-在客戶端查看,一段時間內,無法查看;稍後一段時間後,就可以訪問了。文件正常,使用mfsfileinfo 查看此文件,發現有的塊分佈在chunker1上,有的塊分佈在chuner2上。
使用mfssetgoal 2和mfssetgoal -r 2均不能改變此文件的目前塊的現狀。
但使用mfssetgoal -r 1後,所有塊都修改成1塊了,再mfssetgoal -r 2,所有塊都修改成2份了。
 
 
-測試chunker端,直接斷電情況下,chunker會不會出問題:
a、數據傳輸過程中,關掉chunker1,等待數據傳輸完畢後,開機啓動chunker1.
chunker1啓動後,會自動從chunker2複製數據塊。整個過程中文件訪問不受影響。
b、數據傳輸過程中,關掉chunker1,不等待數據傳輸完畢,開機啓動chunker1.
chunker1啓動後,client端會向chunker1傳輸數據,同時chunker1也從chunker2複製缺失的塊。
 
-如果有三臺chunker,設置goal=2,則隨機挑選2個chunker存儲。
-如果有一個chunker不能提供服務,則剩餘的2個chunker上肯定有部分chunks保存的是一份。則在參數(REPLICATIONS_DELAY_DISCONNECT = 3600)後,只有一份的chunks會自動複製一份,即保存兩份。
保存兩份後,如果此時壞掉的chunker能夠提供服務後,此時肯定有部分chunks存儲了三份,mfs會自動刪除一份。
 
-當我增加第三個服務器做爲額外的chunkserver時,雖然goal設置爲2,但看起來第三個chunkserver從另外兩個chunkserver上覆制數據。
-硬盤空間平衡器是獨立地使用chunks的,因此一個文件的chunks會被重新分配到所有的chunkserver上。
  • chunks修復 :mfsfilerepair
-mfsfilerepair用來處理壞文件(如讀操作引起的I/O錯誤),使文件能夠部分可讀。在丟失塊的情況下使用0對丟失部分進行填充;在塊的版本號(version)不匹配時設置塊的版本號爲master上已知的能在chunkerservers找到的最高版本號;注意:因爲在第二種情況下,可能存在塊的版本號一樣,但內容不匹配,因此建議在文件修復後,對文件進行拷貝(不是快照!),並刪除原始文件。
 
Client端大文件傳輸過程中,強制拔下master主機電源,造成master非法關閉,使用mfsmetarestore -a修復後,master日誌報告有壞塊:
Jan 19 17:22:17 ngmaster mfsmaster[3250]: chunkserver has nonexistent chunk (000000000002139F_00000001), so create it for future deletion
Jan 19 17:22:18 ngmaster mfsmaster[3250]: (192.168.5.232:9422) chunk: 000000000002139F creation status: 20
Jan 19 17:25:18 ngmaster mfsmaster[3250]: chunk 000000000002139F has only invalid copies (1) - please repair it manually 
Jan 19 17:25:18 ngmaster mfsmaster[3250]: chunk 000000000002139F_00000001 - invalid copy on (192.168.5.232 - ver:00000000)
Jan 19 17:26:43 ngmaster mfsmaster[3250]: currently unavailable chunk 000000000002139F (inode: 135845 ; index: 23)
Jan 19 17:26:43 ngmaster mfsmaster[3250]: * currently unavailable file 135845: blog.xxx.cn-access_log200904.tar.gz
Client端使用mfsfilerepair修復
[root@localhost mfstest]# /usr/local/mfs/bin/mfsfilerepair blog.xxx.cn-access_log200904.tar.gz 
blog.xxt.cn-access_log200904.tar.gz:
chunks not changed: 23
chunks erased: 1
chunks repaired: 0
查看master日誌,發現:
Jan 19 17:30:17 ngmaster mfsmaster[3250]: chunk hasn't been deleted since previous loop - retry
Jan 19 17:30:17 ngmaster mfsmaster[3250]: (192.168.5.232:9422) chunk: 000000000002139F deletion status: 13
Jan 19 17:35:16 ngmaster mfsmaster[3250]: chunk hasn't been deleted since previous loop - retry
Jan 19 17:35:16 ngmaster mfsmaster[3250]: (192.168.5.232:9422) chunk: 000000000002139F deletion status: 13
Client端執行以下操作後,master不再報告相關信息:
mv blog.xxt.cn-access_log200904.tar.gz blog.xxt.cn-access_log200905.tar.gz
  • chunker的空間
-每一個chunkserver的磁盤都要爲增長中的chunks保留些磁盤空間,從而達到創建新的chunk。只有磁盤都超過256M並且chunkservers報告自由空間超過1GB總量纔可以被新的數據訪問。最小的配置,應該從幾個G 字節的存儲。

-每個chunkerserver每次以256M的磁盤空間進行申請,客戶端查看得到的磁盤總使用情況的是每個chunkerserver使用量的總和。例如:如果你有3個chunkerserver,7個分區磁盤,每次你的硬盤使用會增加3*7*256MB (大約5GB)。假如你有150T的硬盤空間,磁盤空間就不用過多考慮了。

-另外,如果你的chunkservers使用專用的磁盤,df將顯示正確的磁盤使用情況。但是如果你有其他的數據在你的MooseFS磁盤上,df將會計算你所有的文件。

-如果你想看你的MooseFS文件的使用情況,請使用'mfsdirinfo'命令。
  • 快照snapshot
-可以快照任何一個文件或目錄,語法:mfsmakesnapshot src dst
-但是src和dst必須都屬於mfs體系,即不能mfs體系中的文件快照到其他文件系統。
Mfsappendchunks:追加chunks到一個文件
 
snapshot測試:
a、對一個文件做snapshot後,查看兩個文件的塊,是同一個塊。把原文件刪除,原文件刪除後(回收站中最初可以看到,但一段時間後,回收站中就徹底刪除了),snapshot文件仍然存在,並且可以訪問。使用mfsfileinfo查看,發現仍然是原來的塊。
b、對一個文件做snapshot後,查看兩個文件的塊,是同一個塊。把原文件修改後,發現原文件使用的塊名變了,即使用的是一個新塊。而snapshot文件仍然使用原來的塊。
  • 回收站trash bin
-設置文件或目錄的刪除時間。一個刪除的文件能夠存放在“ 垃圾箱”中的時間稱爲隔離時間, 這個時間可以用mfsgettrashtime 命令來查看,用mfssettrashtime 命令來設置。單位爲秒。
-單獨安裝或掛載MFSMETA 文件系統(mfsmount -m mountpoint),它包含目錄/ trash (包含仍然可以被還原的刪除文件的信息)和/ trash/undel (用於獲取文件)。
-把刪除的文件,移到/ trash/undel下,就可以恢復此文件。
-在MFSMETA 的目錄裏,除了trash 和trash/undel 兩個目錄,還有第三個目錄reserved,該目錄內有已經刪除的文件,但卻被其他用戶一直打開着。在用戶關閉了這些被打開的文件後,reserved 目錄中的文件將被刪除,文件的數據也將被立即刪除。此目錄不能進行操作。
  • 文件描述符
-1.5.12版本,進行大量小文件寫時,出現了一個嚴重錯誤,有可能和操作系統文件描述符有關。操作系統默認文件描述符爲1024.
-1.6.11版本默認爲100000
-建議上線時,master和chunker修改文件描述符,即修改/etc/security/limits.conf添加
* - nofile 65535
  • mfscgiserv
-Mfscgiserv 是一個python 腳本, 它的監聽端口是9425 ,使用/usr/local/mfs/sbin/mfscgiserv 來直接啓動,使用瀏覽器就可全面監控所有客戶掛接, chunkserver 及master server,客戶端的各種操作等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章