一、分布式文件系統(tǒng):背景:計算機通過文件系統(tǒng)管理、存儲數(shù)據(jù),而信息爆炸時代中人們可以獲取的數(shù)據(jù)成指數(shù)倍的增長,單純通過增加硬盤個數(shù)來擴展計算機文件系統(tǒng)的存儲容量的方式,在容量大小、容量增長速度、數(shù)據(jù)備份、數(shù)據(jù)安全等方面的表現(xiàn)都差強人意。分布式文件系統(tǒng)可以有效解決數(shù)據(jù)的存儲和管理難題,人們在使用分布式文件系統(tǒng)時,無需關心數(shù)據(jù)是存儲在哪個節(jié)點上、或者是從哪個節(jié)點從獲取的,只需要像使用本地文件系統(tǒng)一樣管理和存儲文件系統(tǒng)中的數(shù)據(jù)。 概述:分布式文件系統(tǒng)(Distributed File System)是指文件系統(tǒng)管理的物理存儲資源不一定直接連接在本地節(jié)點上,而是通過計算機網(wǎng)絡與節(jié)點相連。分布式文件系統(tǒng)的設計基于客戶機/服務器模式。一個典型的網(wǎng)絡可能包括多個供多用戶訪問的服務器; 目前常見的分布式文件系統(tǒng)有很多種,比如 Hadoop、Moosefs、HDFS、FastDFS、Lustre、TFS、GFS 等等一系列;
二、MFS 分布式文件系統(tǒng): 概述:MooseFS(即 Moose File System)是一個具有容錯性的網(wǎng)絡分布式文件系統(tǒng),它將數(shù)據(jù)分散存放在多個物理服務器或單獨磁盤或分區(qū)上,確保一份數(shù)據(jù)有多個備份副本,對于訪問 MFS 的客戶端或者用戶來說,整個分布式網(wǎng)絡文件系統(tǒng)集群看起來就像一個資源一樣,也就是說呈現(xiàn)給用戶的是一個統(tǒng)一的資源。 MFS 支持 FUSE(用戶空間文件系統(tǒng) Filesystem in Userspace),客戶端掛載后可以作為一個普通的 Unix 文件系統(tǒng)使用 MooseFS;優(yōu)勢: 1.部署簡單,輕量、易配置、易維護; 2.易于擴展,支持在線擴容,不影響業(yè)務,體系架構可伸縮性極強; 3.通用文件系統(tǒng),不需要修改上層應用就可以使用; 4.可設置文件備份的副本數(shù)量,一般建議 3 份,未來硬盤容量也要是存儲單份的容量的三倍;劣勢: 1.master 目前是單點(雖然會把數(shù)據(jù)信息同步到備份服務器,但是恢復需要時間,因此,會影響上線,針對這個問題;可以通過 DRBD+Keeaplived 方案或者 DRBD+Inotify 方案解決); 2.master 服務器對主機的內(nèi)存要求略高; 3.默認 metalogger 復制元數(shù)據(jù)時間較長; 三、MFS 分布式文件系統(tǒng)存儲架構:角色:
MFS 存取數(shù)據(jù)的過程:
--------------------------------------------------MFS 存取數(shù)據(jù)詳解------------------------------------------------------ ?MFS 讀取數(shù)據(jù)步驟: 1)客戶端向元數(shù)據(jù)服務器發(fā)出請求; 2)元數(shù)據(jù)服務器把所需數(shù)據(jù)存放的位置(Chunk Server 的 IP 地址及 Chunk 編號)告知客戶端; 3)客戶端向已知 Chunk Server 請求發(fā)送數(shù)據(jù); 4)客戶端向 chunk server 請求取得所需數(shù)據(jù); ?MFS 寫入數(shù)據(jù)步驟: 1)客戶端向元數(shù)據(jù)服務器發(fā)送寫入請求; 2)元數(shù)據(jù)服務器與 Chunk Server 進行交互如下; 1)元數(shù)據(jù)服務器指示在某些 Chunk Server 創(chuàng)建分塊 Chunks; 2)Chunk Server 告知元數(shù)據(jù)服務器,步驟(1)的操作成功; 3)元數(shù)據(jù)服務器告知客戶端,你可以在哪個 Chunk Server 的哪個 Chunks 寫入數(shù)據(jù); 4)向指定的 Chunk Server 寫入數(shù)據(jù); 5)與其他 Chunk Server 進行數(shù)據(jù)同步,同步的服務器依據(jù)設定的副本數(shù)而定,副本為 2,則需同步一個 ChunkServer; 6)Chunk Sever 之間同步成功; 7)Chunk Server 告知客戶端數(shù)據(jù)寫入成功; 8)客戶端告知元數(shù)據(jù)服務器本次寫入完畢; 9)元數(shù)據(jù)服務器將數(shù)據(jù)存放記錄寫入到本地日志; 10)元數(shù)據(jù)服務器將本地日志拷貝到 logger 服務器; ?MFS 的刪除文件過程: 1)客戶端有刪除操作時,首先向 Master 發(fā)送刪除信息; 2)Master 定位到相應元數(shù)據(jù)信息進行刪除,并將 chunk server 上塊的刪除操作加入隊列異步清理; 3)響應客戶端刪除成功的信號; ?MFS 修改文件內(nèi)容的過程: 1)客戶端有修改文件內(nèi)容時,首先向 Master 發(fā)送操作信息; 2)Master 申請新的塊給.swp 文件; 3)客戶端關閉文件后,會向 Master 發(fā)送關閉信息; 4)Master 會檢測內(nèi)容是否有更新,若有,則申請新的塊存放更改后的文件,刪除原有塊和.swp 文件塊; 5)若無,則直接刪除.swp 文件塊; ?MFS 重命名文件的過程: 1)客戶端重命名文件時,會向 Master 發(fā)送操作信息; 2)Master 直接修改元數(shù)據(jù)信息中的文件名;返回重命名完成信息; ?MFS 遍歷文件的過程: 1)遍歷文件不需要訪問 chunk server,當有客戶端遍歷請求時,向 Master 發(fā)送操作信息; 2)Master 返回相應元數(shù)據(jù)信息; 3)客戶端接收到信息后顯示; ?總結注意: 1)Master 記錄著管理信息,比如:文件路徑|大小|存儲的位置(ip,port,chunkid)|份數(shù)|時間等,元數(shù)據(jù)信息存在于內(nèi)存中,會定期寫入 metadata.mfs.back 文件中,定期同步到 metalogger,操作實時寫入 changelog.*.mfs,實時同步到 metalogger 中。master 啟動將 metadata.mfs 載入內(nèi)存,重命名為 metadata.mfs.back 文件。 2)文件以 chunk 大小存儲,每 chunk 最大為 64M,小于 64M 的,該 chunk 的大小即為該文件大?。炞C實際 chunk 文件略大于實際文件),超過 64M 的文件將被切分,以每一份(chunk)的大小不超過 64M 為原則;塊的生成遵循規(guī)則:目錄循環(huán)寫入(00-FF 256 個目錄循環(huán),step 為 2)、chunk 文件遞增生成、大文件切分目錄連續(xù)。 3)Chunkserver 上的剩余存儲空間要大于 1GB(Reference Guide 有提到),新的數(shù)據(jù)才會被允許寫入,否則,你會看到 No space left on device 的提示,實際中,測試發(fā)現(xiàn)當磁盤使用率達到 95%左右的時候,就已經(jīng)不可以寫入了,當時可用空間為 1.9GB。 4)文件可以有多份 copy,當 goal 為 1 時,文件會被隨機存到一臺 chunkserver 上,當 goal 的數(shù)大于 1 時,copy 會由 master 調(diào)度保存到不同的 chunkserver 上,goal 的大小不要超過 chunkserver 的數(shù)量,否則多出的 copy,不會有 chunkserver 去存。 四、案例:搭建 MFS 分布式存儲:案例拓撲:
案例步驟: ?安裝并配置 master 元數(shù)據(jù)服務器; ?安裝并配置 log 日志服務器; ?安裝并配置 chunk 節(jié)點存儲服務器(在此三臺 chunk 節(jié)點服務器配置相同,只列舉 chunk1 節(jié)點的配置); ?安裝并配置客戶端節(jié)點; ?配置 master 節(jié)點開啟 MFS 監(jiān)控; ?客戶端測試訪問監(jiān)控頁面; ?客戶端測試寫入數(shù)據(jù); ?驗證 chunk 節(jié)點數(shù)據(jù)分配情況及 web 監(jiān)控頁面; ?配置 master 節(jié)點修改數(shù)據(jù)的復制份數(shù); ?客戶端再次寫入數(shù)據(jù)測試; ?驗證 chunk 節(jié)點數(shù)據(jù)分配情況及 web 監(jiān)控頁面; ?安裝并配置 master 元數(shù)據(jù)服務器; [root@master ~]# yum -y install zlib-devel [root@master ~]# useradd -s /sbin/nologin mfs [root@master ~]# ls mfs-1.6.27-5.tar.gz mfs-1.6.27-5.tar.gz [root@master ~]# tar zxf mfs-1.6.27-5.tar.gz -C /usr/src [root@master ~]# cd /usr/src/mfs-1.6.27 [root@master mfs-1.6.27 ]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount [root@master mfs-1.6.27 ]# make &&make install [root@master mfs-1.6.27 ]# cd [root@master ~]# cd /usr/local/mfs/etc/mfs/ [root@master mfs]# ls mfsexports.cfg.dist mfsmaster.cfg.dist mfsmetalogger.cfg.dist mfstopology.cfg.dist
[root@master mfs]# netstat -utpln |grep mfs tcp 0 0 0.0.0.0:9419 0.0.0.0:* LISTEN 5769/mfsmaster tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 5769/mfsmaster tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 5769/mfsmaster [root@master mfs]# cd ? 安裝并配置 log 日志服務器; [root@log ~]# yum -y install zlib-devel [root@log ~]# useradd -s /sbin/nologin mfs [root@log ~]# ls mfs-1.6.27-5.tar.gz mfs-1.6.27-5.tar.gz [root@log ~]# tar zxf mfs-1.6.27-5.tar.gz -C /usr/src/ [root@log ~]# cd /usr/src/mfs-1.6.27 [root@log mfs-1.6.27]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount [root@log mfs-1.6.27]# make &&make install [root@log mfs-1.6.27]# cd [root@log ~]# cd /usr/local/mfs/etc/mfs/ [root@log mfs]# cp mfsmetalogger.cfg.dist mfsmetalogger.cfg ##復制日志配置文件 [root@log mfs]# sed -i '/mfsmaster/a MASTER_HOST = 192.168.100.101' mfsmetalogger.cfg [root@log mfs]# /usr/local/mfs/sbin/mfsmetalogger start [root@log mfs]# ps aux |grep mfs |grep -v grep mfs 5766 0.1 0.1 11824 832 ? S< 05:42 0:00 /usr/local/mfs/sbin/mfsmetalogger start [root@log mfs]# cd ? 安裝并配置 chunk 節(jié)點存儲服務器(在此三臺 chunk 節(jié)點服務器配置相同,只列舉 chunk1 節(jié)點的配置); [root@chunk1 ~]# yum -y install zlib-devel [root@chunk1 ~]# useradd -s /sbin/nologin mfs [root@chunk1 ~]# ls mfs-1.6.27-5.tar.gz mfs-1.6.27-5.tar.gz [root@chunk1 ~]# tar zxf mfs-1.6.27-5.tar.gz -C /usr/src/ [root@chunk1 ~]# cd /usr/src/mfs-1.6.27 [root@chunk1 mfs-1.6.27]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount [root@chunk1 mfs-1.6.27]# make &&make install [root@chunk1 mfs-1.6.27]# cd /usr/local/mfs/etc/mfs/ [root@chunk1 mfs]# cp mfschunkserver.cfg.dist mfschunkserver.cfg ##復制主配置文件 [root@chunk1 mfs]# cp mfshdd.cfg.dist mfshdd.cfg ##復制掛載信息的配置文件 [root@chunk1 mfs]# sed -i '/BIND_HOST/a MASTER_HOST = 192.168.100.101' mfschunkserver.cfg [root@chunk1 mfs]# echo "/data" >>mfshdd.cfg [root@chunk1 mfs]# mkdir /data [root@chunk1 mfs]# chown -R mfs:mfs /data/ [root@chunk1 mfs]# /usr/local/mfs/sbin/mfschunkserver start [root@chunk1 mfs]# ps aux |grep mfs |grep -v grep mfs 5528 0.3 0.5 171640 2560 ? S<l </l05:44 0:00 /usr/local/mfs/sbin/mfschunkserver start [root@chunk1 mfs]# cd ? 安裝并配置客戶端節(jié)點; [root@client ~]# yum -y install zlib-devel [root@client ~]# ls fuse-2.9.2.tar.gz mfs-1.6.27-5.tar.gz [root@client ~]# tar zxvf fuse-2.9.2.tar.gz -C /usr/src ##編譯安裝 fuse 文件系統(tǒng) [root@client ~]# cd /usr/src/fuse-2.9.2/ [root@client fuse-2.9.2]# ./configure &&make &&make install [root@client fuse-2.9.2]# cd [root@client ~]# echo "export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH" >>/etc/profile [root@client ~]# source /etc/profile [root@client ~]# useradd -s /sbin/nologin mfs [root@client ~]# tar zxvf mfs-1.6.27-5.tar.gz -C /usr/src/ [root@client ~]# cd /usr/src/mfs-1.6.27/ [root@client mfs-1.6.27]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver --enable-mfsmount [root@client mfs-1.6.27]# make &&make install [root@client mfs-1.6.27]# cd [root@client ~]# echo "export PATH=/usr/local/mfs/bin:$PATH" >>/etc/profile [root@client ~]# source /etc/profile [root@client ~]# modprobe fuse [root@client ~]# lsmod |grep fuse fuse 91874 1 [root@client ~]# mkdir /mnt/mfs [root@client ~]# mfsmount /mnt/mfs -H 192.168.100.101 mfsmaster accepted connection with parameters: read-write,restricted_ip ; root mapped to root:root [root@client ~]# df -hT |grep mfs 192.168.100.101:9421 fuse.mfs 50G 0 50G 0% /mnt/mfs ?配置 master 節(jié)點開啟 MFS 監(jiān)控; [root@master ~]# /usr/local/mfs/sbin/mfscgiserv ##啟動 mfscgiserv 是用 python 編寫的 web 服務,監(jiān)聽端口 9425: lockfile created and locked starting simple cgi server (host: any , port: 9425 , rootpath: /usr/local/mfs/share/mfscgi) [root@master ~]# netstat -utpln |grep 9425 tcp 0 0 0.0.0.0:9425 0.0.0.0:* LISTEN 5779/python ?客戶端測試訪問監(jiān)控頁面; http://192.168.100.101:9425
?客戶端測試寫入數(shù)據(jù); [root@client ~]# df -hT |grep mfs 192.168.100.101:9421 fuse.mfs 50G 0 50G 0% /mnt/mfs [root@client ~]# dd if=/dev/zero of=/mnt/mfs/1.file bs=1G count=1 記錄了 1+0 的讀入記錄了 1+0 的寫出 1073741824 字節(jié)(1.1 GB)已復制,20.7523 秒,51.7 MB/秒 [root@client ~]# du -sh /mnt/mfs/1.file 1.0G /mnt/mfs/1.file [root@client ~]# df -hT |grep mfs 192.168.100.101:9421 fuse.mfs 49G 1.1G 48G 3% /mnt/mfs ?驗證 chunk 節(jié)點數(shù)據(jù)分配情況及 web 監(jiān)控頁面; ?配置 master 節(jié)點修改數(shù)據(jù)的復制份數(shù); a.默認每個 chunk server 中會占用一定的空間: b.MFS 默認存放文件的份數(shù)為 1,如若存放 1G 的文件,三個 chunk 節(jié)點會將 1G 的文件分割存儲(分布式存儲); c.如若在后續(xù)將默認的 1 份改成了 2 份,那么包括以前存在的文件和改后存放的文件,都會被 chunk 節(jié)點所同步成兩份,并且將兩份文件的大小,分布存儲在多個 chunk 節(jié)點中;
?客戶端再次寫入數(shù)據(jù)測試;
?驗證 chunk 節(jié)點數(shù)據(jù)分配情況及 web 監(jiān)控頁面; 注:MFS 集群的啟動與停止: MFS 的啟動順序:master 元數(shù)據(jù)服務器-->chunkserver 存儲服務器-->metalogger 元數(shù)據(jù)日志服務器-->client 客戶端 MFS 停止的順序:client(umount)客戶端-->chunkserver(-s)存儲服務器-->metalogger(-s)元數(shù)據(jù)日志服務器 -->master(-s)元數(shù)據(jù)服務器 |
|