一、分布式文件系統(tǒng):背景:計(jì)算機(jī)通過(guò)文件系統(tǒng)管理、存儲(chǔ)數(shù)據(jù),而信息爆炸時(shí)代中人們可以獲取的數(shù)據(jù)成指數(shù)倍的增長(zhǎng),單純通過(guò)增加硬盤個(gè)數(shù)來(lái)擴(kuò)展計(jì)算機(jī)文件系統(tǒng)的存儲(chǔ)容量的方式,在容量大小、容量增長(zhǎng)速度、數(shù)據(jù)備份、數(shù)據(jù)安全等方面的表現(xiàn)都差強(qiáng)人意。分布式文件系統(tǒng)可以有效解決數(shù)據(jù)的存儲(chǔ)和管理難題,人們?cè)谑褂梅植际轿募到y(tǒng)時(shí),無(wú)需關(guān)心數(shù)據(jù)是存儲(chǔ)在哪個(gè)節(jié)點(diǎn)上、或者是從哪個(gè)節(jié)點(diǎn)從獲取的,只需要像使用本地文件系統(tǒng)一樣管理和存儲(chǔ)文件系統(tǒng)中的數(shù)據(jù)。 概述:分布式文件系統(tǒng)(Distributed File System)是指文件系統(tǒng)管理的物理存儲(chǔ)資源不一定直接連接在本地節(jié)點(diǎn)上,而是通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)與節(jié)點(diǎn)相連。分布式文件系統(tǒng)的設(shè)計(jì)基于客戶機(jī)/服務(wù)器模式。一個(gè)典型的網(wǎng)絡(luò)可能包括多個(gè)供多用戶訪問的服務(wù)器; 目前常見的分布式文件系統(tǒng)有很多種,比如 Hadoop、Moosefs、HDFS、FastDFS、Lustre、TFS、GFS 等等一系列;
二、MFS 分布式文件系統(tǒng): 概述:MooseFS(即 Moose File System)是一個(gè)具有容錯(cuò)性的網(wǎng)絡(luò)分布式文件系統(tǒng),它將數(shù)據(jù)分散存放在多個(gè)物理服務(wù)器或單獨(dú)磁盤或分區(qū)上,確保一份數(shù)據(jù)有多個(gè)備份副本,對(duì)于訪問 MFS 的客戶端或者用戶來(lái)說(shuō),整個(gè)分布式網(wǎng)絡(luò)文件系統(tǒng)集群看起來(lái)就像一個(gè)資源一樣,也就是說(shuō)呈現(xiàn)給用戶的是一個(gè)統(tǒng)一的資源。 MFS 支持 FUSE(用戶空間文件系統(tǒng) Filesystem in Userspace),客戶端掛載后可以作為一個(gè)普通的 Unix 文件系統(tǒng)使用 MooseFS;優(yōu)勢(shì): 1.部署簡(jiǎn)單,輕量、易配置、易維護(hù); 2.易于擴(kuò)展,支持在線擴(kuò)容,不影響業(yè)務(wù),體系架構(gòu)可伸縮性極強(qiáng); 3.通用文件系統(tǒng),不需要修改上層應(yīng)用就可以使用; 4.可設(shè)置文件備份的副本數(shù)量,一般建議 3 份,未來(lái)硬盤容量也要是存儲(chǔ)單份的容量的三倍;劣勢(shì): 1.master 目前是單點(diǎn)(雖然會(huì)把數(shù)據(jù)信息同步到備份服務(wù)器,但是恢復(fù)需要時(shí)間,因此,會(huì)影響上線,針對(duì)這個(gè)問題;可以通過(guò) DRBD+Keeaplived 方案或者 DRBD+Inotify 方案解決); 2.master 服務(wù)器對(duì)主機(jī)的內(nèi)存要求略高; 3.默認(rèn) metalogger 復(fù)制元數(shù)據(jù)時(shí)間較長(zhǎng); 三、MFS 分布式文件系統(tǒng)存儲(chǔ)架構(gòu):角色:
MFS 存取數(shù)據(jù)的過(guò)程:
--------------------------------------------------MFS 存取數(shù)據(jù)詳解------------------------------------------------------ ?MFS 讀取數(shù)據(jù)步驟: 1)客戶端向元數(shù)據(jù)服務(wù)器發(fā)出請(qǐng)求; 2)元數(shù)據(jù)服務(wù)器把所需數(shù)據(jù)存放的位置(Chunk Server 的 IP 地址及 Chunk 編號(hào))告知客戶端; 3)客戶端向已知 Chunk Server 請(qǐng)求發(fā)送數(shù)據(jù); 4)客戶端向 chunk server 請(qǐng)求取得所需數(shù)據(jù); ?MFS 寫入數(shù)據(jù)步驟: 1)客戶端向元數(shù)據(jù)服務(wù)器發(fā)送寫入請(qǐng)求; 2)元數(shù)據(jù)服務(wù)器與 Chunk Server 進(jìn)行交互如下; 1)元數(shù)據(jù)服務(wù)器指示在某些 Chunk Server 創(chuàng)建分塊 Chunks; 2)Chunk Server 告知元數(shù)據(jù)服務(wù)器,步驟(1)的操作成功; 3)元數(shù)據(jù)服務(wù)器告知客戶端,你可以在哪個(gè) Chunk Server 的哪個(gè) Chunks 寫入數(shù)據(jù); 4)向指定的 Chunk Server 寫入數(shù)據(jù); 5)與其他 Chunk Server 進(jìn)行數(shù)據(jù)同步,同步的服務(wù)器依據(jù)設(shè)定的副本數(shù)而定,副本為 2,則需同步一個(gè) ChunkServer; 6)Chunk Sever 之間同步成功; 7)Chunk Server 告知客戶端數(shù)據(jù)寫入成功; 8)客戶端告知元數(shù)據(jù)服務(wù)器本次寫入完畢; 9)元數(shù)據(jù)服務(wù)器將數(shù)據(jù)存放記錄寫入到本地日志; 10)元數(shù)據(jù)服務(wù)器將本地日志拷貝到 logger 服務(wù)器; ?MFS 的刪除文件過(guò)程: 1)客戶端有刪除操作時(shí),首先向 Master 發(fā)送刪除信息; 2)Master 定位到相應(yīng)元數(shù)據(jù)信息進(jìn)行刪除,并將 chunk server 上塊的刪除操作加入隊(duì)列異步清理; 3)響應(yīng)客戶端刪除成功的信號(hào); ?MFS 修改文件內(nèi)容的過(guò)程: 1)客戶端有修改文件內(nèi)容時(shí),首先向 Master 發(fā)送操作信息; 2)Master 申請(qǐng)新的塊給.swp 文件; 3)客戶端關(guān)閉文件后,會(huì)向 Master 發(fā)送關(guān)閉信息; 4)Master 會(huì)檢測(cè)內(nèi)容是否有更新,若有,則申請(qǐng)新的塊存放更改后的文件,刪除原有塊和.swp 文件塊; 5)若無(wú),則直接刪除.swp 文件塊; ?MFS 重命名文件的過(guò)程: 1)客戶端重命名文件時(shí),會(huì)向 Master 發(fā)送操作信息; 2)Master 直接修改元數(shù)據(jù)信息中的文件名;返回重命名完成信息; ?MFS 遍歷文件的過(guò)程: 1)遍歷文件不需要訪問 chunk server,當(dāng)有客戶端遍歷請(qǐng)求時(shí),向 Master 發(fā)送操作信息; 2)Master 返回相應(yīng)元數(shù)據(jù)信息; 3)客戶端接收到信息后顯示; ?總結(jié)注意: 1)Master 記錄著管理信息,比如:文件路徑|大小|存儲(chǔ)的位置(ip,port,chunkid)|份數(shù)|時(shí)間等,元數(shù)據(jù)信息存在于內(nèi)存中,會(huì)定期寫入 metadata.mfs.back 文件中,定期同步到 metalogger,操作實(shí)時(shí)寫入 changelog.*.mfs,實(shí)時(shí)同步到 metalogger 中。master 啟動(dòng)將 metadata.mfs 載入內(nèi)存,重命名為 metadata.mfs.back 文件。 2)文件以 chunk 大小存儲(chǔ),每 chunk 最大為 64M,小于 64M 的,該 chunk 的大小即為該文件大?。?yàn)證實(shí)際 chunk 文件略大于實(shí)際文件),超過(guò) 64M 的文件將被切分,以每一份(chunk)的大小不超過(guò) 64M 為原則;塊的生成遵循規(guī)則:目錄循環(huán)寫入(00-FF 256 個(gè)目錄循環(huán),step 為 2)、chunk 文件遞增生成、大文件切分目錄連續(xù)。 3)Chunkserver 上的剩余存儲(chǔ)空間要大于 1GB(Reference Guide 有提到),新的數(shù)據(jù)才會(huì)被允許寫入,否則,你會(huì)看到 No space left on device 的提示,實(shí)際中,測(cè)試發(fā)現(xiàn)當(dāng)磁盤使用率達(dá)到 95%左右的時(shí)候,就已經(jīng)不可以寫入了,當(dāng)時(shí)可用空間為 1.9GB。 4)文件可以有多份 copy,當(dāng) goal 為 1 時(shí),文件會(huì)被隨機(jī)存到一臺(tái) chunkserver 上,當(dāng) goal 的數(shù)大于 1 時(shí),copy 會(huì)由 master 調(diào)度保存到不同的 chunkserver 上,goal 的大小不要超過(guò) chunkserver 的數(shù)量,否則多出的 copy,不會(huì)有 chunkserver 去存。 四、案例:搭建 MFS 分布式存儲(chǔ):案例拓?fù)洌?/span>
案例步驟: ?安裝并配置 master 元數(shù)據(jù)服務(wù)器; ?安裝并配置 log 日志服務(wù)器; ?安裝并配置 chunk 節(jié)點(diǎn)存儲(chǔ)服務(wù)器(在此三臺(tái) chunk 節(jié)點(diǎn)服務(wù)器配置相同,只列舉 chunk1 節(jié)點(diǎn)的配置); ?安裝并配置客戶端節(jié)點(diǎn); ?配置 master 節(jié)點(diǎn)開啟 MFS 監(jiān)控; ?客戶端測(cè)試訪問監(jiān)控頁(yè)面; ?客戶端測(cè)試寫入數(shù)據(jù); ?驗(yàn)證 chunk 節(jié)點(diǎn)數(shù)據(jù)分配情況及 web 監(jiān)控頁(yè)面; ?配置 master 節(jié)點(diǎn)修改數(shù)據(jù)的復(fù)制份數(shù); ?客戶端再次寫入數(shù)據(jù)測(cè)試; ?驗(yàn)證 chunk 節(jié)點(diǎn)數(shù)據(jù)分配情況及 web 監(jiān)控頁(yè)面; ?安裝并配置 master 元數(shù)據(jù)服務(wù)器; [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 日志服務(wù)器; [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 ##復(fù)制日志配置文件 [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é)點(diǎn)存儲(chǔ)服務(wù)器(在此三臺(tái) chunk 節(jié)點(diǎn)服務(wù)器配置相同,只列舉 chunk1 節(jié)點(diǎn)的配置); [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 ##復(fù)制主配置文件 [root@chunk1 mfs]# cp mfshdd.cfg.dist mfshdd.cfg ##復(fù)制掛載信息的配置文件 [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é)點(diǎn); [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é)點(diǎn)開啟 MFS 監(jiān)控; [root@master ~]# /usr/local/mfs/sbin/mfscgiserv ##啟動(dòng) mfscgiserv 是用 python 編寫的 web 服務(wù),監(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 ?客戶端測(cè)試訪問監(jiān)控頁(yè)面; http://192.168.100.101:9425
?客戶端測(cè)試寫入數(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)已復(fù)制,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 ?驗(yàn)證 chunk 節(jié)點(diǎn)數(shù)據(jù)分配情況及 web 監(jiān)控頁(yè)面; ?配置 master 節(jié)點(diǎn)修改數(shù)據(jù)的復(fù)制份數(shù); a.默認(rèn)每個(gè) chunk server 中會(huì)占用一定的空間: b.MFS 默認(rèn)存放文件的份數(shù)為 1,如若存放 1G 的文件,三個(gè) chunk 節(jié)點(diǎn)會(huì)將 1G 的文件分割存儲(chǔ)(分布式存儲(chǔ)); c.如若在后續(xù)將默認(rèn)的 1 份改成了 2 份,那么包括以前存在的文件和改后存放的文件,都會(huì)被 chunk 節(jié)點(diǎn)所同步成兩份,并且將兩份文件的大小,分布存儲(chǔ)在多個(gè) chunk 節(jié)點(diǎn)中;
?客戶端再次寫入數(shù)據(jù)測(cè)試;
?驗(yàn)證 chunk 節(jié)點(diǎn)數(shù)據(jù)分配情況及 web 監(jiān)控頁(yè)面; 注:MFS 集群的啟動(dòng)與停止: MFS 的啟動(dòng)順序:master 元數(shù)據(jù)服務(wù)器-->chunkserver 存儲(chǔ)服務(wù)器-->metalogger 元數(shù)據(jù)日志服務(wù)器-->client 客戶端 MFS 停止的順序:client(umount)客戶端-->chunkserver(-s)存儲(chǔ)服務(wù)器-->metalogger(-s)元數(shù)據(jù)日志服務(wù)器 -->master(-s)元數(shù)據(jù)服務(wù)器 |
|