分佈式文件存儲--MFS

分佈式文件存儲--MFS

今天給大家講的是目前最比較流行的分佈式文件存儲--MFS。MooseFS呢是一個具有容錯性的網絡分佈式文件系統。它把數據分散存放在多個物理服務器上,而呈現給用戶的則是一個統一的資源。

它有好多比較好的特點比如:

1、高可靠(數據的多個拷貝被存儲在不同的計算機上)
2、通過附加新的計算機或者硬盤可以實現容量的動態擴展
3、刪除的文件可以根據一個可配置的時間週期進行保留(一個文件系統級別的回收站)
4、不受訪問和寫入影響的文件連貫快照

下面給大家介紹下mfs的體系結構和工作原理:

1、管理服務器(master server)
一臺管理整個文件系統的獨立主機,存儲着每個文件的元數據(文件的大小、屬性、位置信息,包括所有非常規文件的所有信息,例如目錄、套接字、管道以及設備文件)
2、數據服務器羣(chunk servers)
任意數目的商用服務器,用來存儲文件數據並在彼此之間同步(如果某個文件有超過一個備份的話)
3、元數據備份服務器(metalogger server)
任意數量的服務器,用來存儲元數據變化日誌並週期性下載主要元數據文件,以便用於管理服務器意外停止時好接替其位置。
4、訪問mfs的客戶端

任意數量的主機,可以通過mfsmount進程與管理服務器(接收和更改元數據)和數據服務器(改變實際文件數據)進行交流。

2012050411333297.jpg

                       (官方網絡示意圖)

2012050411295697.jpg2012050411305542.jpg

                       (讀寫原理圖)

MFS的讀數據過程

   1.client當需要一個數據時,首先向master server發起查詢請求;

   2.管理服務器檢索自己的數據,獲取到數據所在的可用數據服務器位置ip|port|chunkid;

   3.管理服務器將數據服務器的地址發送給客戶端;

   4.客戶端向具體的數據服務器發起數據獲取請求;

   5.數據服務器將數據發送給客戶端;

MFS的寫數據過程

   1.當客戶端有數據寫需求時,首先向管理服務器提供文件元數據信息請求存儲地址(元數據信息如:文件名|大小|份數等);

   2.管理服務器根據寫文件的元數據信息,到數據服務器創建新的數據塊;

   3.數據服務器返回創建成功的消息;

   4.管理服務器將數據服務器的地址返回給客戶端(chunkIP|port|chunkid);

   5.客戶端向數據服務器寫數據;

   6.數據服務器返回給客戶端寫成功的消息;

   7.客戶端將此次寫完成結束信號和一些信息發送到管理服務器來更新文件的長度和最後修改時間

MFS的刪除文件過程

   1.客戶端有刪除操作時,首先向Master發送刪除信息;

   2.Master定位到相應元數據信息進行刪除,並將chunk server上塊的刪除操作加入隊列異步清理;

   3.響應客戶端刪除成功的信號

MFS修改文件內容的過程

   1.客戶端有修改文件內容時,首先向Master發送操作信息;

   2.Master申請新的塊給.swp文件,

   3.客戶端關閉文件後,會向Master發送關閉信息;

   4.Master會檢測內容是否有更新,若有,則申請新的塊存放更改後的文件,刪除原有塊和.swp文件塊;

   5.若無,則直接刪除.swp文件塊。

MFS重命名文件的過程

   1.客戶端重命名文件時,會向Master發送操作信息;

   2.Master直接修改元數據信息中的文件名;返回重命名完成信息;

MFS遍歷文件的過程


   1.遍歷文件不需要訪問chunk server,當有客戶端遍歷請求時,向Master發送操作信息;

   2.Master返回相應元數據信息;

   3.客戶端接收到信息後顯示

好了上面已經介紹的差不多了,下面咱們開始安裝部署mfs。

一、環境介紹

192.168.1.10  master、metalogger

192.168.1.11  chunk server、client server

我這裏爲了方便我把master和metalogger放到了一塊、但是實際生產環境中不要這樣因爲master本來就是單點,還有chunk server和client server也不應該放到一塊。

二、安裝步驟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
master server 搭建
[root@localhost Desktop]#  useradd mfs -s /sbin/nologin
[root@localhost Desktop]# mv mfs-1.6.20-2.tar.gz /tmp
[root@localhost Desktop]# cd /tmp/
[root@localhost tmp]#  tar xf mfs-1.6.20-2.tar.gz
[root@localhost tmp]# cd mfs-1.6.20-2
[root@localhost mfs-1.6.20-2]#  ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
[root@localhost mfs-1.6.20-2]# cd /usr/local/mfs/etc/
[root@localhost etc]# ls
mfsexports.cfg.dist  mfsmaster.cfg.dist  mfsmetalogger.cfg.dist
[root@localhost etc]# cp mfsmaster.cfg.dist mfsmaster.cfg
[root@localhost etc]# cp mfsexports.cfg.dist mfsexports.cfg
[root@localhost etc]# cp /usr/local/mfs/var/mfs/metadata.mfs.empty /usr/local/mfs/var/mfs/metadata.mfs
[root@localhost etc]# /usr/local/mfs/sbin/mfsmaster start
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmaster modules ...
loading sessions ... filenot found
ifit is not fresh installation thenyou have to restart all active mounts !!!
exports filehas been loaded
loading metadata ...
create new empty filesystemmetadata filehas been loaded
no charts data file- initializing empty charts
master <-> metaloggers module: listen on *:9419
master <-> chunkservers module: listen on *:9420
main master server module: listen on *:9421
mfsmaster daemon initialized properly
[root@localhost etc]#  /usr/local/mfs/sbin/mfscgiserv
starting simple cgi server (host: any , port: 9425 , rootpath:
/usr/local/mfs/share/mfscgi)
chunk server 搭建
[root@localhost]# useradd mfs -s /sbin/nologin
[root@localhost ]# cd /tmp/
[root@localhost tmp]# tar xf mfs-1.6.20-2.tar.gz
[root@localhost tmp]# cd mfs-1.6.20-2
[root@localhost mfs-1.6.20-2]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount
[root@localhost mfs-1.6.20-2]# make
[root@localhost mfs-1.6.20-2]# make install
[root@localhost mfs-1.6.20-2]# cd /usr/local/mfs/etc/
[root@localhost etc]# cp mfschunkserver.cfg.dist mfschunkserver.cfg
mfs使用空間配置
[root@localhost etc]# cp mfshdd.cfg.dist mfshdd.cfg
[root@localhost etc]# vim /usr/local/mfs/etc/mfschunkserver.cfg
MASTER_HOST = 192.168.1.10
[root@localhost etc]# mkdir /data
[root@localhost etc]# mount /dev/hda1 /data
[root@localhost etc]# chown -R mfs:mfs /data
[root@localhost etc]# vim mfshdd.cfg
/data
[root@localhost etc]# /usr/local/mfs/sbin/mfschunkserver start
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfschunkserver modules ...
hdd space manager: scanning folder /data/...
hdd space manager: scanning complete
hdd space manager: /data/: 0 chunks found
hdd space manager: scanning complete
main server module: listen on *:9422
no charts data file- initializing empty charts
mfschunkserver daemon initialized properly
metalogger server 搭建
[root@localhost ~]# useradd mfs -s /sbin/nologin
[root@localhost ~]# cd /tmp/
[root@localhost tmp]# tar xf mfs-1.6.20-2.tar.gz
[root@localhost tmp]# cd mfs-1.6.20-2
[root@localhost mfs-1.6.20-2]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
[root@localhost mfs-1.6.20-2]# make
[root@localhost mfs-1.6.20-2]# make install
[root@localhost mfs-1.6.20-2]# cd /usr/local/mfs/etc/
[root@localhost etc]# cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
[root@localhost etc]# vim mfsmetalogger.cfg
MASTER_HOST = 192.168.1.10
[root@localhost etc]# /usr/local/mfs/sbin/mfsmetalogger start
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmetalogger modules ...
mfsmetalogger daemon initialized properly
client server搭建
[root@localhost ~]# yum install fuse fuse-libs fuse-devel
[root@localhost ~]# useradd mfs -s /sbin/nologin
[root@localhost ~]# cd /tmp/
[root@localhost tmp]# tar xf mfs-1.6.20-2.tar.gz
[root@localhost tmp]# cd mfs-1.6.20-2
[root@localhost mfs-1.6.20-2]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver
[root@localhost mfs-1.6.20-2]# make
[root@localhost mfs-1.6.20-2]# make install
[root@localhost mfs-1.6.20-2]# /usr/local/mfs/bin/mfsmount /mnt/mfs -H 192.168.1.10
mfsmaster accepted connection with parameters: read-write,restricted_ip ; root mapped to root:root
[root@localhost mfs-1.6.20-2]# /usr/local/mfs/bin/mfsmount -m /mnt/mfsmeta -H 192.168.1.10
mfsmaster accepted connection with parameters: read-write,restricted_ip
[root@localhost mfs-1.6.20-2]# df -h
Filesystem                              Size    Used    Avail   Use%    Mounted on
/dev/mapper/VolGroup00-LogVol008.6G    2.6G    5.6G    32%     /
/dev/vda199M     12M     82M     13%     /boot
tmpfs                                   252M        0       252M    0%      /dev/shm
mfs#192.168.1.10:9421           22G         0           22G     0%      /mnt/mfs

wKiom1MMIjTT8JnbAAUIws68Bgc811.jpg

三、MFS的高級特性

1.冗餘goal設置
目標(goal),是指文件被拷貝的份數,設定了拷貝的份數後是可以通過mfsgetgoal 命令來證實的,也可以通過mfsrsetgoal 來改變設定。

/usr/local/mfs/bin/mfssetgoal 3 /mnt/mfs/test1
/usr/local/mfs/bin/mfsgetgoal /mnt/mfs/test1
   /mnt/mfs/test1: 3

用mfsgetgoal –r 和mfssetgoal –r 同樣的操作可以對整個樹形目錄遞歸操作,其等效於mfsrsetgoal命令。實際的拷貝份數可以通過mfscheckfile 和mfsfile info 命令來證實。

注意以下幾種特殊情況:
一個不包含數據的零長度的文件,儘管沒有設置爲非零的目標(the non-zero “goal”),但用mfscheckfile 命令查詢將返回一個空的結果;將文件填充內容後,其會根據設置的goal創建副本;這時再將文件清空,其副本依然作爲空文件存在。
假如改變一個已經存在的文件的拷貝個數,那麼文件的拷貝份數將會被擴大或者被刪除,這個過程會有延時。可以通過mfscheckfile 命令來證實。
對一個目錄設定“目標”,此目錄下的新創建文件和子目錄均會繼承此目錄的設定,但不會改變已經存在的文件及目錄的拷貝份數。
可以通過mfsdirinfo來查看整個目錄樹的信息摘要。

2.垃圾回收站

一個刪除文件能夠存放在一個“ 垃圾箱”的時間就是一個隔離時間, 這個時間可以用mfsgettrashtime 命令來驗證,也可以用mfssettrashtime 命令來設置。如:
/usr/local/mfs/bin/mfssettrashtime 64800 /mnt/mfs/test1
/usr/local/mfs/bin/mfsgettrashtime /mnt/mfs/test1
   /mnt/mfs/test1: 64800

時間的單位是秒(有用的值有:1 小時是3600 秒,24 – 86400 秒,1天 – 604800 秒)。就像文件被存儲的份數一樣, 爲一個目錄設定存放時間是要被新創建的文件和目錄所繼承的。數字0 意味着一個文件被刪除後, 將立即被徹底刪除,在想回收是不可能的。

刪除文件可以通過一個單獨安裝MFSMETA 文件系統。特別是它包含目錄/ trash (包含任然可以被還原的被刪除文件的信息)和/ trash/undel (用於獲取文件)。只有管理員有權限訪問MFSMETA(用戶的uid 0,通常是root)。

/usr/local/mfs/bin/mfsmount -m /mnt/mfsmeta -H 192.168.0.1

被刪文件的文件名在“垃圾箱”目錄裏還可見,文件名由一個八位十六進制的數i-node 和被刪文件的文件名組成,在文件名和i-node 之間不是用“/”,而是用了“|”替代。如果一個文件名的長度超過操作系統的限制(通常是255 個字符),那麼部分將被刪除。通過從掛載點起全路徑的文件名被刪除的文件任然可以被讀寫。

移動這個文件到trash/undel 子目錄下,將會使原始的文件恢復到正確的MooseFS 文件系統上路徑下(如果路徑沒有改變)。如果在同一路徑下有個新的同名文件,那麼恢復不會成功。

從“垃圾箱”中刪除文件結果是釋放之前被它站用的空間(刪除有延遲,數據被異步刪除)。

在MFSMETA中還有另一個目錄reserved,該目錄內的是被刪除但依然打開的文件。在用戶關閉了這些被打開的文件後,reserved 目錄中的文件將被刪除,文件的數據也將被立即刪除。在reserved 目錄中文件的命名方法同trash 目錄中的一樣,但是不能有其他功能的操作。

3.快照snapshot

MooseFS 系統的另一個特徵是利用mfsmakesnapshot 工具給文件或者是目錄樹做快照。
/usr/local/mfs/bin/mfsmakesnapshot source ... destination

Mfsmakesnapshot 是在一次執行中整合了一個或是一組文件的拷貝,而且任何修改這些文件的源文件都不會影響到源文件的快照, 就是說任何對源文件的操作,例如寫入源文件,將不會修改副本(或反之亦然)。

也可以使用mfsappendchunks:
/usr/local/mfs/bin/mfsappendchunks destination-file source-file ...

當有多個源文件時,它們的快照被加入到同一個目標文件中(每個chunk 的最大量是chunk)。

本文出自 “windy丶寒” 博客,請務必保留此出處http://sangh.blog.51cto.com/6892345/1363253


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章