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 啓動後,metalogger、chunker、client 三個元素都能自動與 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。這樣將會丟失那些正在傳輸的數據。