GFS分散式檔案系統(理論+實驗)

2021-03-09 12:01:18

一、GlusterFS

1.1 GlusterFS的概念

GlusterFS:開源的分散式檔案系統

  • 組成:
    • 儲存伺服器
    • 使用者端
    • NFS/Samba 儲存閘道器
  • 無後設資料伺服器
    • 資料分散儲存
    • 可避免出現單點故障

1.2 GlusterFS的特點

擴充套件性和高效能

GlusterFS利用雙重特性來提供高容量儲存解決方案。

  • Scale-Out架構允許通過簡單地增加儲存節點的方式來提高儲存容量和效能(磁碟、計算和I/O資源都可以獨立增加),支援10GbE和 InfiniBand等高速網路互聯。
  • Gluster彈性雜湊(ElasticHash)解決了GlusterFS對後設資料伺服器的依賴,改善了單點故障和效能瓶頸,真正實現了並行化資料存取。GlusterFS採用彈性雜湊演演算法在儲存池中可以智慧地定位任意資料分片(將資料分片儲存在不同節點上),不需要檢視索引或者向後設資料伺服器查詢。

高可用性

GlusterFS可以對檔案進行自動複製,如映象或多次複製,從而確保資料總是可以存取,甚至是在硬體故障的情況下也能正常存取。
當資料出現不一致時,自我修復功能能夠把資料恢復到正確的狀態,資料的修復是以增量的方式在後臺執行,幾乎不會產生效能負載。
GlusterFS可以支援所有的儲存,因為它沒有設計自己的私有資料檔案格式,而是採用作業系統中主流標準的磁碟檔案系統(如EXT3、XFS等)來儲存檔案,因此資料可以使用傳統存取磁碟的方式被存取。

全域性統一名稱空間

分散式儲存中,將所有節點的名稱空間整合為統一名稱空間,將整個系統的所有節點的儲存容量組成一個大的虛擬儲存池,供前端主機存取這些節點完成資料讀寫操作。

彈性卷管理

GlusterFS通過將資料儲存在邏輯卷中,邏輯卷從邏輯儲存池進行獨立邏輯劃分而得到。
邏輯儲存池可以線上進行增加和移除,不會導致業務中斷。邏輯卷可以根據需求線上增長和縮減,並可以在多個節點中實現負載均衡。
檔案系統設定也可以實時線上進行更改並應用,從而可以適應工作負載條件變化或線上效能調優。

基於標準協定

Gluster 儲存服務支援 NFS、CIFS、HTTP、FTP、SMB 及 Gluster原生協定,完全與 POSIX 標準相容。
現有應用程式不需要做任何修改就可以對Gluster 中的資料進行存取,也可以使用專用 API 進行存取

1.3 GlusterFS術語

  • Brick(塊儲存):由主機提供的用於物理儲存的專用分割區,是GlusterFS中的基本儲存單元,同時也是可信儲存池中伺服器上對外提供的儲存目錄。
  • Volume(邏輯卷):一個邏輯卷是一組 Brick 的集合。卷是資料儲存的邏輯裝置,類似於 LVM 中的邏輯卷。大部分 Gluster 管理操作是在捲上進行的。
  • FUSE:使用者空間的檔案系統(類別EXT4),」這是一個偽檔案系統「,使用者端的交換模組
  • VFS(虛擬埠):核心態的虛擬檔案系統,使用者是提交請求給VFS 然後VFS交給FUSH,再交給GFS使用者端,最後由使用者端交給遠端的儲存
  • Glusterd(服務):是執行再儲存節點的程序(使用者端執行的是gluster client)GFS使用過程中整個GFS之間的交換由Gluster client 和glusterd完成

1.4 GlusterFS的工作流程

在這裡插入圖片描述

  • 外來一個請求,例:使用者端申請建立一個檔案,使用者端或應用程式通過GFS的掛載點存取資料
  • linux系統內容通過VFSAPI收到請求並處理
  • VFS將資料遞交給FUSE核心檔案系統,fuse檔案系統則是將資料通過/dev/fuse裝置檔案遞交給了GlusterFS client端
  • GlusterFS client端收到資料後,會根據組態檔的設定對資料進行處理
  • 再通過網路,將資料傳送給遠端的ClusterFS server,並將資料寫入到伺服器儲存裝置上
  • server再將資料轉交給VFS偽檔案系統,再由VFS進行轉存處理,最後交給EXT3

1.5 後端儲存如何定位檔案

使用彈性HASH演演算法
為了解決分散式檔案資料索引、定位的複雜程度,而使用彈性HASH演演算法來解決資料定位、索引、定址的功能

先通過HASH演演算法對資料可以得到一個值:

  • 該值有2的32次方個組合
    • 每個資料對應了0-2的32次方的一個值
    • 通常情況下,不同資料得到的值是不同的
  • 彈性 HASH 演演算法的優點:
    • 保證資料平均分佈在每一個 Brick 中。
    • 解決了對後設資料伺服器的依賴,進而解決了單點故障以及存取瓶頸。

1.6 GFS支援的七種卷

分散式卷(預設)

檔案通過HASH演演算法分佈到所有Brick Server上,這種卷是GFS的基礎;檔案沒有被分片,直接根據HASH演演算法雜湊到不同的Brick,其實只是擴大了磁碟空間,並不具備容錯能力,屬於檔案級RAID 0

分散式卷的特點:

  • 檔案分佈在不同的伺服器,不具備冗餘性
  • 更容易和廉價地擴充套件卷的大小
  • 單點故障會造成資料丟失
  • 依賴底層的資料保護

條帶卷(預設)

類似RAID 0,檔案被分成資料庫並以輪詢的方式分佈到多個Brick Server上,檔案儲存以資料塊為單位,支援大檔案儲存,檔案越大,讀取效率越高

條帶卷特點:

  • 資料被分割成更小塊分佈到塊伺服器群中的不同條帶區
  • 分佈減少了負載且更小的檔案加速了存取的速度
  • 沒有資料冗餘

複製卷(Replica volume)

將檔案同步到多個Brick上,使其具備多個檔案副本,屬於檔案級RAID 1,具有容錯能力。因為資料分散在多個Brick中,所以讀效能得到很大提升,但寫效能下降

複製卷特點:

  • 卷中所有的伺服器均儲存一個完整的副本
  • 卷的副本數量可由客戶建立的時候決定
  • 至少由兩個塊伺服器或更多伺服器
  • 具備冗餘性

分散式條帶卷(Distribute Stripe volume)

Brick Server數量是條帶數(資料塊分佈的Brick數量)的倍數

兼具分散式卷和條帶的特點

分散式複製卷(Distribute Replica volume)

Brick Server數量是映象數(資料副本 數量)的倍數

兼具分散式卷和複製卷的特點

條帶複製卷(Stripe Replca volume)

類似RAID 10,同時具有條帶卷和複製卷的特點

分散式條帶複製卷(Distribute Stripe Replicavolume)

三種基本卷的複合卷通常用於類Map Reduce應用

二、模擬實驗——部署 GlusterFS 群集

Node1節點:node1/192.168.153.10		  磁碟:/dev/sdb1			掛載點:/data/sdb1
											/dev/sdc1					/data/sdc1
											/dev/sdd1					/data/sdd1
											/dev/sde1					/data/sde1

Node2節點:node2/192.168.153.20		  磁碟:/dev/sdb1			掛載點:/data/sdb1
											/dev/sdc1					/data/sdc1
											/dev/sdd1					/data/sdd1
											/dev/sde1					/data/sde1

Node3節點:node3/192.168.153.30	      磁碟:/dev/sdb1			掛載點:/data/sdb1
											/dev/sdc1					/data/sdc1
											/dev/sdd1					/data/sdd1
											/dev/sde1					/data/sde1

Node4節點:node4/192.168.153.40		  磁碟:/dev/sdb1			掛載點:/data/sdb1
											/dev/sdc1					/data/sdc1
											/dev/sdd1					/data/sdd1
											/dev/sde1					/data/sde1

使用者端節點:192.168.153.50

每個節點先建立四塊新硬碟
在這裡插入圖片描述

2.1 環境準備

①關閉防火牆及安全機制

systemctl stop firewalld
setenforce 0

②設定/etc/hosts檔案

echo "192.168.153.10 node1" >> /etc/hosts
echo "192.168.153.20 node2" >> /etc/hosts
echo "192.168.153.30 node3" >> /etc/hosts
echo "192.168.153.40 node4" >> /etc/hosts

③建立磁碟分割區並掛載
為節約時間,採用指令碼來進行磁碟分割區和掛載

vim /opt/fdisk.sh

#!/bin/bash
NEWDEV=`ls /dev/sd* | grep -o 'sd[b-z]' | uniq`
for VAR in $NEWDEV
do
   echo -e "n\np\n\n\n\nw\n" | fdisk /dev/$VAR &> /dev/null
   mkfs.xfs /dev/${VAR}"1" &> /dev/null
   mkdir -p /data/${VAR}"1" &> /dev/null
   echo "/dev/${VAR}"1" /data/${VAR}"1" xfs defaults 0 0" >> /etc/fstab
done
mount -a &> /dev/null

. /opt.fdisk.sh     #執行指令碼

在這裡插入圖片描述

2.2 安裝、啟動GlusterFS(所有node節點)

cd /opt      #拉入軟體包
unzip gfsrepo.zip

cd /etc/yum.repos.d/
mkdir repo.bak
mv *.repo repo.bak

vim glfs.repo
[glfs]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1

yum clean all && yum makecache

yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma

systemctl start glusterd.service 
systemctl enable glusterd.service
systemctl status glusterd.service

在這裡插入圖片描述
在這裡插入圖片描述

2.3 新增節點到儲存信任池中( node1 節點)

#只要在一臺Node節點上新增其它節點即可
gluster peer probe node1
gluster peer probe node2
gluster peer probe node3
gluster peer probe node4

gluster peer status            #在每個Node節點上檢視群集狀態

在這裡插入圖片描述

2.4 根據規劃建立卷

卷名稱卷型別Brick
dis-volume分散式卷node1(/data/sdb1)、node2(/data/sdb1)
stripe-volume條帶卷node1(/data/sdc1)、node2(/data/sdc1)
rep-volume複製卷node3(/data/sdb1)、node4(/data/sdb1)
dis-stripe分散式條帶卷node1(/data/sdd1)、node2(/data/sdd1)、node3(/data/sdd1)、node4(/data/sdd1)
dis-rep分散式複製卷node1(/data/sde1)、node2(/data/sde1)、node3(/data/sde1)、node4(/data/sde1)

分散式卷

#建立分散式卷,沒有指定型別,預設建立的是分散式卷
gluster volume create dis-volume node1:/data/sdb1 node2:/data/sdb1 force	

gluster volume list                  #檢視卷列表

gluster volume start dis-volume      #啟動新建分散式卷

gluster volume info dis-volume       #檢視建立分散式卷資訊

在這裡插入圖片描述

條帶卷

#指定型別為 stripe,數值為 2,且後面跟了 2  Brick Server,所以建立的是條帶卷
gluster volume create stripe-volume stripe 2 node1:/data/sdc1 node2:/data/sdc1 force

gluster volume start stripe-volume

gluster volume info stripe-volume

在這裡插入圖片描述

複製卷

#指定型別為 replica,數值為 2,且後面跟了 2  Brick Server,所以建立的是複製卷
gluster volume create rep-volume replica 2 node3:/data/sdb1 node4:/data/sdb1 force
gluster volume start rep-volume
gluster volume info rep-volume

在這裡插入圖片描述

分散式條帶卷

#指定型別為 stripe,數值為 2,而且後面跟了 4  Brick Server,是 2 的兩倍,所以建立的是分散式條帶卷
gluster volume create dis-stripe stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
gluster volume start dis-stripe
gluster volume info dis-stripe

在這裡插入圖片描述

分散式複製卷

指定型別為 replica,數值為 2,而且後面跟了 4  Brick Server,是 2 的兩倍,所以建立的是分散式複製卷
gluster volume create dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force
gluster volume start dis-rep
gluster volume info dis-rep	
gluster volume list

在這裡插入圖片描述
在這裡插入圖片描述

三、 使用者端設定

3.1 安裝使用者端軟體

cd /opt      #拉入軟體包
unzip gfsrepo.zip 

cd /etc/yum.repos.d/
mkdir repo.bak
mv *.repo repo.bak

vim glfs.repo
[glfs]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1

yum clean all && yum makecache

yum -y install glusterfs glusterfs-fuse

在這裡插入圖片描述

2.2 設定 /etc/hosts 檔案

echo "192.168.153.10 node1" >> /etc/hosts
echo "192.168.153.20 node2" >> /etc/hosts
echo "192.168.153.30 node3" >> /etc/hosts
echo "192.168.153.40 node4" >> /etc/hosts

在這裡插入圖片描述

2.3 建立掛載目錄

mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}
ls /test

在這裡插入圖片描述

2.4 掛載 Gluster 檔案系統

臨時掛載

mount.glusterfs node1:dis-volume /test/dis
mount.glusterfs node1:stripe-volume /test/stripe
mount.glusterfs node1:rep-volume /test/rep
mount.glusterfs node1:dis-stripe /test/dis_stripe
mount.glusterfs node1:dis-rep /test/dis_rep

df -Th

在這裡插入圖片描述
永久掛載

vim /etc/fstab

node1:dis-volume			/test/dis				glusterfs		defaults,_netdev		0 0
node1:stripe-volume		/test/stripe			glusterfs		defaults,_netdev		0 0
node1:rep-volume			/test/rep				glusterfs		defaults,_netdev		0 0
node1:dis-stripe			/test/dis_stripe			glusterfs		defaults,_netdev		0 0
node1:dis-rep			/test/dis_rep			glusterfs		defaults,_netdev		0 0

四、 測試 Gluster 檔案系統

4.1 卷中寫入檔案,使用者端操作

cd /opt
dd if=/dev/zero of=/opt/TEST1.log bs=1M count=40
dd if=/dev/zero of=/opt/TEST2.log bs=1M count=40
dd if=/dev/zero of=/opt/TEST3.log bs=1M count=40
dd if=/dev/zero of=/opt/TEST4.log bs=1M count=40
dd if=/dev/zero of=/opt/TEST5.log bs=1M count=40

ls -lh

cp TEST* /test/dis
cp TEST* /test/stripe/
cp TEST* /test/rep/
cp TEST* /test/dis_stripe/
cp TEST* /test/dis_rep/

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

4.2檢視檔案分佈

檢視卷對應的磁碟分割區中的檔案資料,驗證結果

分散式檔案分佈

node1:/dev/sdb1
在這裡插入圖片描述

node2:/dev/sdb1
在這裡插入圖片描述

結論:分散式只會將demo檔案分開儲存(5個檔案不在同一磁碟分割區上),不會將資料分片和備份

條帶卷檔案分佈

node1:/dev/sdc1
在這裡插入圖片描述

node1:/dev/sdc1
在這裡插入圖片描述

結論:帶卷會將每個demo檔案中的資料分片儲存(兩個分割區各有20M的檔案),沒有備份

複製卷檔案分佈

node3:/dev/sdb1
在這裡插入圖片描述

node4:/dev/sdb1
在這裡插入圖片描述

結論:複製卷會將每個檔案放入卷中的磁碟分割區中(兩分割區的檔案一樣)

分散式條帶卷分佈

node1:/dev/sdd1
在這裡插入圖片描述

node2:/dev/sdd1
在這裡插入圖片描述

node3:/dev/sdd1
在這裡插入圖片描述

node4:/dev/sdd1
在這裡插入圖片描述
結論:分散式條帶卷中,帶有分散式和條帶卷的特點,即將資料分片,又將檔案分開儲存,沒有備份

分散式複製卷分佈

node1:/dev/sde1
在這裡插入圖片描述

node2:/dev/sde1
在這裡插入圖片描述

node3:/dev/sde1
在這裡插入圖片描述

node4:/dev/sde1
在這裡插入圖片描述
結論:分散式複製卷中,帶有分散式和複製卷的特點,即將檔案分開儲存,又複製一遍檔案(備份)

4.3冗餘測試

通過掛起 node2 節點伺服器或者關閉glusterd服務來模擬故障
在這裡插入圖片描述

條帶卷

在這裡插入圖片描述
結論:檔案中沒有資料,說明資料全部丟失,所以條帶卷不具備冗餘

分散式卷

在這裡插入圖片描述
結論:資料檢視,缺少四個檔案,而這四個檔案是儲存在node2上的,所以分散式卷不具備冗餘

分散式條帶卷

在這裡插入圖片描述

儲存在node1和node2上的TEST3不見了(資料是分片儲存的),所以分散式條帶卷不具備冗餘

分散式複製卷

在這裡插入圖片描述

結論:檔案和資料都在,所以分散式複製卷具有冗餘

複製卷

掛起node3和node4中任意一個節點進行測試
在這裡插入圖片描述
結論:檔案和資料都在,所以複製卷具有冗餘

五、其他的維護命令

1.檢視GlusterFS卷
gluster volume list 

2.檢視所有卷的資訊
gluster volume info

3.檢視所有卷的狀態
gluster volume status

4.停止一個卷
gluster volume stop dis-stripe

5.刪除一個卷,注意:刪除卷時,需要先停止卷,且信任池中不能有主機處於宕機狀態,否則刪除不成功
gluster volume delete dis-stripe

6.設定卷的存取控制
#僅拒絕
gluster volume set dis-rep auth.allow 192.168.153.100

#僅允許
gluster volume set dis-rep auth.allow 192.168.153.*	  #設定192.168.153.0網段的所有IP地址都能存取dis-rep卷(分散式複製卷)

總結

分散式卷:相當於RAID0,不具備容錯能力,若有一塊磁碟損壞,則會造成資料丟失
條帶卷:類似RAID0,檔案將被分成資料塊並以輪詢方式分佈到Brick server上
複製卷:將檔案同步到多個Brick上,相當於檔案級RAID1,資料分數在多個Brick中
分散式條帶卷:兼具分散式卷和條帶卷的特定
分散式複製卷:兼具分散式卷和複製卷的特點
條帶複製卷:類似RAID10,同時具有條帶卷和複製卷的特點
分散式條帶複製卷:三種基本卷特性的結合