Moosefs 分佈式存儲


                                                   Moosefs 分佈式存儲node

MFS 特性: linux

1. Free(GPL) web

2. 通用文件系統,不須要修改上層應用就可使用 瀏覽器

3. 能夠在線擴容,體系架構可伸縮性極強。 緩存

4. 部署簡單。 安全

5. 高可用,可設置任意的文件冗餘程度(提供比 raid1+0 更高的冗餘級別,而絕對不會影響讀或 服務器

寫的性能,只會加速!) 網絡

6. 可回收在指定時間內刪除的文件(「回收站」提供的是系統級別的服務,不怕誤操做了,提供類 session

oralce 的閃回等高級 dbms 的即時回滾特性!) 架構

7. 提供 netapp,emc,ibm 等商業存儲的 snapshot 特性。(能夠對整個文件甚至在正在寫入的文

件建立文件的快照)

8. google filesystem 的一個 c 實現。

9. 提供 web gui 監控接口。

10. 提升隨機讀或寫的效率。

11. 提升海量小文件的讀寫效率。

可能的瓶頸:

1. master 自己的性能瓶頸。mfs 系統 master 存在單點故障如何解決?moosefs+drbd+heartbeat

來保證 master 單點問題?不過在使用過程當中不可能徹底不關機和間歇性的網絡中斷!

2. 體系架構存儲文件總數的可碰見的上限。(mfs 把文件系統的結構緩存到 master 的內存中,

件越多,master 的內存消耗越大,8g 對應 2500w 的文件數,2 億文件就得 64GB 內存 )

master 服務器 CPU 負載取決於操做的次數,內存的使用取決於文件和文件夾的個數。

MFS 文件系統結構:

包含 4 種角色:

管理服務器 managing server (master)

元數據日誌服務器 Metalogger server(Metalogger)

數據存儲服務器 data servers (chunkservers)

客戶機掛載使用 client computers各類角色做用:

1. 管理服務器:負責各個數據存儲服務器的管理,文件讀寫調度,文件空間回收以及恢復.多節點拷

貝。

2. 元數據日誌服務器: 負責備份 master 服務器的變化日誌文件,文件類型爲

changelog_ml.*.mfs,以便於在 master server 出問題的時候接替其進行工做。

3. 數據存儲服務器:負責鏈接管理服務器,遵從管理服務器調度,提供存儲空間,併爲客戶提供數

據傳輸。

4. 客戶端: 經過 fuse 內核接口掛接遠程管理服務器上所管理的數據存儲服務器,看起來共享的文

件系統和本地 unix 文件系統使用同樣的效果。原始的讀/寫速度很明顯是主要取決於所使用的硬盤的性能、網絡的容量和拓撲結構的,使用的硬

盤和網絡的吞吐量越好,整個系統的性能也就會越好。


********************************************************************

ip分配:

管理服務器managing server (master) 172.25.28.7 (vm7)                            

數據存儲服務器1 managing server (master) :172.25.28.1(vm1)

數據存儲服務器2 managing server (master) :172.25.28.4(vm4)

客戶機掛載使用 client computers:172.25.28.42 (個人真機)

軟件下載:www.moosefs.org

生成 rpm,便於部署:

# yum install gcc make rpm-build fuse-devel zlib-devel -y

# rpmbuild -tb mfs-1.6.27.tar.gz  

# ls ~/rpmbuild/RPMS/x86_64

mfs-cgi-1.6.27-4.x86_64.rpm

mfs-cgiserv-1.6.27-4.x86_64.rpm

mfs-chunkserver-1.6.27-4.x86_64.rpm

mfs-client-1.6.27-4.x86_64.rpm

mfs-master-1.6.27-4.x86_64.rpm

mfs-metalogger-1.6.27-4.x86_64.rpm

主控服務器 Master server 安裝:

# yum localinstall -y mfs-cgiserv-1.6.27-4.x86_64.rpm  mfs-cgi-1.6.27-4.x86_64.rpm mfs-master-1.6.27-4.x86_64.rpm

cd /etc/mfs/

[root@vm7 mfs]# mv mfsexports.cfg.dist mfsexports.cfg

# vi mfsexports.cfg

192.168.0.0/24

/

rw,alldirs,maproot=0

該文件每個條目分爲三部分:

第一部分:客戶端的 ip 地址

第二部分:被掛接的目錄

第三部分:客戶端擁有的權限

地址能夠指定的幾種表現形式:

*              全部的 ip 地址

A.B.C.D                 單個 ip 地址

A.B.C.D/BITS         IP 網絡地址/位數掩碼

A.B.C.D/E.F.G.H IP 網絡地址/子網掩碼

A.B.C.D-E.F.G.H IP 地址範圍

目錄部分須要注意兩點:

/ 標識 MooseFS ;

. 表示 MFSMETA 文件系統

權限部分:

ro     只讀模式共享

rw     讀寫方式共享

alldirs   許掛載任何指定的子目錄

maproot    映射爲 root,仍是指定的用戶

password    指定驗證密碼,客戶端掛載時使用

[root@vm7 mfs]# mv mfsmaster.cfg.dist mfsmaster.cfg

mfsmaster.cfg:

此文件中凡是用#註釋掉的變量均使用其默認值,基本不須要就能夠工做:

#WORKING_USER WORKING_GROUP:是運行 master server 的用戶和組;

#SYSLOG_IDENT:master server syslog 中的標識;

#LOCK_MEMORY:是否執行 mlockall()以免 mfsmaster 進程溢出(默認爲 0);

#NICE_LEVE:運行的優先級(若是能夠默認是 -19; 注意: 進程必須是用 root 啓動);

#EXPORTS_FILENAME:被掛接目錄及其權限控制文件的存放位置

#TOPOLOGY_FILENAME : 定義 MFS 網絡拓撲結構的文件位置

#DATA_PATH:數據存放路徑,此目錄下大體有三類文件,changelog,sessions stats;

#BACK_LOGS:metadata 的改變 log 文件數目(默認是 50);

#BACK_META_KEEP_PREVIOUS:保存之前 mfs 元數據的文件數,默認值是 1;

#REPLICATIONS_DELAY_INIT:延遲複製的時間(默認是 300s);

#REPLICATIONS_DELAY_DISCONNECT:chunkserver 斷開的複製延遲(默認是 3600);

# MATOML_LISTEN_HOST:metalogger 監聽的 IP 地址(默認是*,表明任何 IP);

# MATOML_LISTEN_PORT:metalogger 監聽的端口地址(默認是 9419);

# MATOCS_LISTEN_HOST:用於 chunkserver 鏈接的 IP 地址(默認是*,表明任何 IP);

# MATOCS_LISTEN_PORT:用於 chunkserver 鏈接的端口地址(默認是 9420);

# MATOCU_LISTEN_HOST/MATOCL_LISTEN_HOST:用於客戶端掛接鏈接的 IP 地址(默認是*, 表明任何 IP);

# MATOCU_LISTEN_PORT/MATOCL_LISTEN_PORT:用於客戶端掛接鏈接的端口地址(默認 是 9421);

#CHUNKS_LOOP_CPS:chunks 的迴環每秒檢查的塊最大值,默認 100000;

# CHUNKS_LOOP_TIME :chunks 的迴環頻率(默認是:300 );

# CHUNKS_SOFT_DEL_LIMIT :一個 chunkserver 中能夠刪除 chunks 的最大數,軟限 (默認: 10)

#CHUNKS_HARD_DEL_LIMIT:一個 chunkserver 中能夠刪除 chunks 的最大數,硬限 (默認: 25)

# REPLICATIONS_DELAY_DISCONNECT:chunkserver 斷開後的複製延時(默認:3600 )

# CHUNKS_WRITE_REP_LIMIT:在一個循環裏複製到一個 chunkserver 的最大 chunk 數目(默 認是 2)

# CHUNKS_READ_REP_LIMIT :在一個循環裏從一個 chunkserver 複製的最大 chunk 數目(默 認是 10)

# REJECT_OLD_CLIENTS:彈出低於 1.6.0 的客戶端掛接(0 1,默認是 0)

# deprecated:

# CHUNKS_DEL_LIMIT - use CHUNKS_SOFT_DEL_LIMIT instead

# LOCK_FILE - lock system has been changed, and this option is used only to search for old

lockfile

[root@vm7 mfs]# mv  mfstopology.cfg.dist mfstopology.cfg

# cd /var/lib/mfs

# cp metadata.mfs.empty metadata.mfs

# chown nobody /var/lib/mfs

修改/etc/hosts 文件,增長下面的行:

172.25.28.7 mfsmaster

# mfsmaster start

啓動 master server

working directory: /var/lib/mfs

lockfile created and locked

initializing mfsmaster modules ...loading sessions ... file not found

if it is not fresh installation then you have to restart all active mounts !!!

exports file has been loaded

mfstopology configuration file (/etc/mfstopology.cfg) not found - using defaults

loading metadata ...

create new empty filesystemmetadata file has 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


此時進入/var/lib/mfs 能夠看到 moosefs 所產生的數據:

.mfsmaster.lock      文件記錄正在運行的 mfsmaster 的主進程

metadata.mfs, metadata.mfs.back MooseFS 文件系統的元數據 metadata 的鏡像

changelog.*.mfs MooseFS 文件系統元數據的改變日誌(每個小時合併到metadata.mfs 中一次)

注意:Metadata 文件的大小是取決於文件數的多少(而不是他們的大小)changelog 日誌的大小是取決 於每小時操做的數目,可是這個時間長度(默認是按小時)是可配置的。


# mfscgiserv

#啓動 CGI 監控服務

lockfile created and locked

starting simple cgi server (host: any , port: 9425 , rootpath: /usr/share/mfscgi)

# cd /usr/share/mfscgi/

# chmod +x chart.cgi mfs.cgi

在瀏覽器地址欄輸入 http://172.25.28.7:9425 便可查看 master 的運行狀況


存儲塊服務器 Chunk servers 安裝:

分別在兩臺存儲機器上面執行如下操做:

# yum localinstall -y mfs-chunkserver-1.6.26-1.x86_64.rpm

# cd /etc/

# cp mfschunkserver.cfg.dist mfschunkserver.cfg

解釋:

# WORKING_USER = nobody

# WORKING_GROUP =

# SYSLOG_IDENT = mfschunkserver

# LOCK_MEMORY = 0

# NICE_LEVEL = -19

# DATA_PATH = /var/lib/mfs

# MASTER_RECONNECTION_DELAY = 5:在失去鏈接以後延遲多少秒從新鏈接 master

# BIND_HOST = *:本地地址用於鏈接 mfsmaster(默認值是*,即默認的本地地址)

# MASTER_HOST = mfsmaster:master 服務器的主機名或是 ip 地址。

# MASTER_PORT = 9420

# MASTER_TIMEOUT = 60

# CSSERV_LISTEN_HOST = *:容許掛載的客戶端鏈接的 IP 地址(*容許所有)

# CSSERV_LISTEN_PORT = 9422:容許掛載的客戶端鏈接的端口

# HDD_CONF_FILENAME = /etc/mfshdd.cfg:分配給 MFS 使用的磁盤空間配置文件的位置

# HDD_TEST_FREQ = 10:塊的測試期(單位爲秒)

# deprecated, to be removed in MooseFS 1.7

# LOCK_FILE = /var/run/mfs/mfschunkserver.lock

# BACK_LOGS = 50

# CSSERV_TIMEOUT = 5

# cp mfshdd.cfg.dist mfshdd.cfg

# vi mfshdd.cfg

定義 mfs 共享點

/mnt/chunk1

/mnt/chunk2

# chown -R nobody:nobody /mnt/chunk1

# chown -R nobody:nobody /mnt/chunk2

修改/etc/hosts 文件,增長下面的行:

172.25.28.7 mfsmaster

mkdir /var/lib/mfs

chown nobody /var/lib/mfs

# mfschunkserver start

working directory: /var/lib/mfs

lockfile created and locked

initializing mfschunkserver modules ...

hdd space manager: path to scan: /mnt/mfschunks2/

hdd space manager: path to scan: /mnt/mfschunks1/

hdd space manager: start background hdd scanning (searching for available chunks)

main server module: listen on *:9422

no charts data file - initializing empty charts

mfschunkserver daemon initialized properly

如今再經過瀏覽器訪問 http://172.25.28.7:9425/ 應該能夠看見這個 MooseFS 系統的所有信息, 包括主控 master 和存儲服務 chunkserver


客戶端 client 安裝:

# yum localinstall -y mfs-client-1.6.26-1.x86_64.rpm

# cd /etc

# cp mfsmount.cfg.dist mfsmount.cfg

# vi mfsmount.cfg    定義客戶端默認掛載

/mnt/mfs

[root@localhostmfs]# mfsmount

mfsmaster accepted connection with parameters: read-write,restricted_ip ; root mapped to root:root

[root@localhostmfs]# df

Filesystem     1K-blocks      Used Available Use% Mounted on

mfsmaster:9421   5313664    553408   4760256  11% /mnt/mfs


MFS 測試:

MFS 掛載點下建立兩個目錄,並設置其文件存儲份數:

# cd /mnt/mfs

# mkdir dir1 dir2

# mfssetgoal -r 2 dir2/

設置在 dir2 中文件存儲份數爲兩個,默認是一個

dir2/:

inodes with goal changed:

1

inodes with goal not changed:

0

inodes with permission denied:

0

對一個目錄設定「goal」,此目錄下的新建立文件和子目錄均會繼承此目錄的設定,但不會改變已 經存在的文件及目錄的 copy 份數。但使用-r 選項能夠更改已經存在的 copy 份數。

拷貝同一個文件到兩個目錄

# cp /etc/passwd dir1# cp /etc/passwd dir2

查看文件信息

# mfsfileinfo dir1/passwd

dir1/passwd:

chunk 0: 0000000000000001_00000001 / (id:1 ver:1)

copy 1: 192.168.0.2:9422

# mfsfileinfo dir2/passwd

dir2/passwd:

chunk 0: 0000000000000002_00000001 / (id:2 ver:1)

copy 1: 192.168.0.1:9422

copy 2: 192.168.0.2:9422

關閉 mfschunkserver2 後再查看文件信息

# mfsfileinfo dir1/passwd

dir1/passwd:

chunk 0: 0000000000000001_00000001 / (id:1 ver:1)

no valid copies !!!

# mfsfileinfo dir2/passwd

dir2/passwd:

chunk 0: 0000000000000002_00000001 / (id:2 ver:1)

copy 1: 192.168.0.1:9422

啓動 mfschunkserver2 ,文件回覆正常。

恢復誤刪文件

# rm -f dir1/passwd

# mfsgettrashtime dir1/

dir1/: 86400

文件刪除後存放在「 垃圾箱」中的時間稱爲隔離時間, 這個時間能夠用 mfsgettrashtime 命令來查 看,mfssettrashtime 命令來設置,單位爲秒,默認爲 86400 秒。

# mkdir /mnt/mfsmeta

# mfsmount -m /mnt/mfsmeta/ -H mfsmaster

掛載 MFSMETA 文件系統,它包含目錄 trash (包含仍然能夠被還原的刪除文件的信息)trash/undel (用於獲取文件)。把刪除的文件,移到/ trash/undel ,就能夠恢復此文件。 # cd /mnt/mfsmeta/trash

# mv 00000004\|dir1\|passwd undel/

dir1 目錄中能夠看到 passwd 文件恢復

MFSMETA 的目錄裏,除了 trash trash/undel 兩個目錄,還有第三個目錄 reserved,該目 錄內有已經刪除的文件,但卻被其餘用戶一直打開着。在用戶關閉了這些被打開的文件後, reserved 目錄中的文件將被刪除,文件的數據也將被當即刪除。此目錄不能進行操做。


修改 linux 下最大文件描述符的限制:

在進行大量小文件寫時,可能會出現了一個嚴重錯誤,有可能和操做系統文件描述符有關。操做

系統默認文件描述符爲 1024.

1.6.26 版本默認爲 100000

建議上線時,master chunker 修改文件描述符系統級限制:它是限制全部用戶打開文件描述符的總和,能夠經過修改內核參數來更改該限制:

# vi /etc/sysctl.conf 添加

fs.file-max=102400

若是此值默認夠大能夠不用更改

# sysctl -p

命令使其生效。

用戶級限制:只是修改用戶級的最大文件描述符限制,也就是說每個用戶登陸後執行的程序佔

用文件描述符的總數不能超過這個限制。

# vi /etc/security/limits.conf

* - nofile 102400

保存退出後從新登陸,其最大文件描述符已經被永久更改了。

file-max 參數相對應的還有 file-nr,這個參數是隻讀的,能夠查看當前文件描述符的使用狀況。

# sysctl -a|grep file

fs.file-nr = 12800 0 782554

fs.file-max = 782554


快照

MooseFS 系統的另外一個特徵是利用 mfsmakesnapshot 工具給文件或者是目錄樹作快照:

# mfsmakesnapshot source ... destination

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

文件快照能夠用 mfsappendchunks,例如:

# mfsappendchunks destination-file source-file ...

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


爲了安全中止 MooseFS 集羣,建議執行以下的步驟:

# umount -l /mnt/mfs    #客戶端卸載 MooseFS 文件系統

# mfschunkserver stop  #中止 chunk server 進程

# mfsmetalogger stop   #中止 metalogger 進程

# mfsmaster stop          #中止主控 master server 進程

安全的啓動 MooseFS 集羣:

# mfsmaster start          #啓動 master 進程

# mfschunkserver start   #啓動 chunkserver 進程

# mfsmetalogger start     #啓動 metalogger 進程

# mfsmount                     #客戶端掛載 MooseFS 文件系統

實際上不管如何順序啓動或關閉,未見任何異常,master 啓動後,metaloggerchunkerclient 三個元素都能自動與 master 創建鏈接。


故障測試:

Client 客戶端斷電、斷網對 MFS 的體系不產生影響.若是客戶端誤殺 killall -9 mfsmount 進程,須要先 umount /mnt/mfs,而後再 mfsmount。不然會 提示:/mnt/mfs: Transport endpoint is not connected

chunkserver :

傳輸一個大文件,設置存儲 2 份。傳輸過程當中,關掉 chunker1,這樣絕對會出現有部分塊只存在 chunker2 ;啓動 chunker1,關閉 chunker2,這樣絕對會有部分塊只存在 chunker1 上。 把 chunker2 啓動起來。整個過程當中,客戶端一直可以正常傳輸。使用 mfsfileinfo 查看此文件,發 現有的塊分佈在 chunker1 ,有的塊分佈在 chunker2 上。使用 mfssetgoal -r 1 ,全部塊都修 改爲 1 塊了,mfssetgoal -r 2,全部塊都修改爲 2 份了。


斷網、殺掉 mfschunkserver 程序對 MFS 系統無影響。

斷電:

#無文件傳輸時,對兩個 chunker 都無影響;

#當有文件傳輸時,可是文件設置存儲一份時,對文件的存儲無影響。

#文件設置存儲兩份,數據傳輸過程當中,關掉 chunker1,等待數據傳輸完畢後,啓動

chunker1.chunker1 啓動後,會自動從 chunker2 複製數據塊。整個過程當中文件訪問不受影響。

#文件設置存儲兩份,數據傳輸過程當中,關掉 chunker1,不等待數據傳輸完畢,開機啓動

chunker1.chunker1 啓動後,client 端會向 chunker1 傳輸數據,同時 chunker1 也從 chunker2 復 制缺失的塊。 只要不是兩個 chunker 服務器同時掛掉的話,就不會影響文件的傳輸,也不會影響服務的使用。

master :

斷網、殺掉 MFS master 服務對 MFS 系統無影響。

斷電可能會出現如下的狀況:

#當沒有文件傳輸時,可在服務器重啓以後,運行 mfsmetarestore –a 進行修復,以後執行

mfsmaster start 恢復 master 服務。

# mfsmetarestore -a

loading objects (files,directories,etc.) ... ok

loading names ... ok

loading deletion timestamps ... ok

loading chunks data ... ok

checking filesystem consistency ... ok

connecting files and chunks ... ok

store metadata into file: /var/lib/mfs/metadata.mfs

# mfsmaster start

working directory: /var/lib/mfs

lockfile created and locked

initializing mfsmaster modules ...

loading sessions ... ok

sessions file has been loaded

exports file has been loaded

mfstopology configuration file (/etc/mfstopology.cfg) not found - using defaults

loading metadata ...

loading objects (files,directories,etc.) ... ok

loading names ... ok

loading deletion timestamps ... ok

loading chunks data ... ok

checking filesystem consistency ... ok

connecting files and chunks ... ok

all inodes: 5

directory inodes: 3

file inodes: 2

chunks: 2

metadata file has been loaded

stats file has been loaded

master <-> metaloggers module: listen on *:9419

master <-> chunkservers module: listen on *:9420

main master server module: listen on *:9421

mfsmaster daemon initialized properly

#當有文件傳輸時,可能會在/usr/local/mfs/sbin/mfsmetarestore –a 進行修復時可能會出現:

# mfsmetarestore -a

loading objects (files,directories,etc.) ... ok

loading names ... ok

loading deletion timestamps ... ok

loading chunks data ... ok

checking filesystem consistency ... ok

connecting files and chunks ... ok

S:115: error: 32 (Data mismatch)

此時沒法修復也沒法啓動 master 服務,有個應急的辦法是將 metadata.mfs.back 複製成

metadata.mfs,而後再啓動 master。這樣將會丟失那些正在傳輸的數據。

相關文章
相關標籤/搜索