分布式存儲系統
分布式存儲按其存儲接口分為三種:文件存儲、塊存儲和對象存儲。
文件存儲
通常支持POSIX接口(如glusterfs,但GFS、HDFS是非POSIX接口的),可以像普通文件系統(如ext4)那樣訪問,但又比普通文件系統多了并行化訪問的能力和冗余機制。主要的分布式文件存儲系統有TFS、cephfs、glusterfs和HDFS等。主要存儲非結構化數據,如普通文件、圖片、音視頻等。可以采用NFS和CIFS等協議訪問,共享方便。NAS是文件存儲類型。
塊存儲
這種接口通常以QEMU Driver或者Kernel Module的方式存在,主要通過qemu或iscsi協議訪問。主要的塊存儲系統有ceph塊存儲、sheepdog等。主要用來存儲結構化數據,如數據庫數據。數據共享不方便。DAS和SAN都是塊存儲類型。
對象存儲
對象存儲系統綜合了NAS和SAN的優點,同時具有SAN的高速直接訪問和NAS的數據共享等優勢。以對象作為基本的存儲單元,向外提供RESTful數據讀寫接口,常以網絡服務的形式提供數據訪問。主要的對象存儲系統有AWS、swift和ceph對象存儲。主要用來存儲非結構化數據
Glusterfs
Glusterfs是一個開源分布式文件系統,具有強大的橫向擴展能力,可支持數PB存儲容量和數千客戶端,通過Infiniband RDMA 或Tcp/Ip 方式將許多廉價的x86 主機,通過網絡互聯成一個并行的網絡文件系統。具有可擴展性、高性能、高可用性等特點。
GlusterFS概述
GlusterFS系統是一個可擴展的網絡文件系統,相比其他分布式文件系統,GlusterFS具有高擴展性、高可用性、高性能、可橫向擴展等特點,并且其沒有元數據服務器的設計,讓整個服務沒有單點故障的隱患。
術語:
· Brick:GFS中的存儲單元,通過是一個受信存儲池中的服務器的一個導出目錄。可以通過主機名和目錄名來標識,如‘SERVER:EXPORT‘
· Client:掛載了GFS卷的設備
· Extended Attributes:xattr是一個文件系統的特性,其支持用戶或程序關聯文件/目錄和元數據。
· FUSE:Filesystem Userspace是一個可加載的內核模塊,其支持非特權用戶創建自己的文件系統而不需要修改內核代碼。通過在用戶空間運行文件系統的代碼通過FUSE代碼與內核進行橋接。
· Geo-Replication
· GFID:GFS卷中的每個文件或目錄都有一個唯一的128位的數據相關聯,其用于模擬inode
· Namespace:每個Gluster卷都導出單個ns作為POSIX的掛載點
· Node:一個擁有若干brick的設備
· RDMA:遠程直接內存訪問,支持不通過雙方的OS進行直接內存訪問。
· RRDNS:round robin DNS是一種通過DNS輪轉返回不同的設備以進行負載均衡的方法
· Self-heal:用于后臺運行檢測復本卷中文件和目錄的不一致性并解決這些不一致。
· Split-brain:腦裂
· Translator:
· Volfile:glusterfs進程的配置文件,通常位于/var/lib/glusterd/vols/volname
· Volume:一組bricks的邏輯集合
1、無元數據設計
元數據是用來描述一個文件或給定區塊在分布式文件系統中所在的位置,簡而言之就是某個文件或某個區塊存儲的位置。傳統分布式文件系統大都會設置元數據服務器或者功能相近的管理服務器,主要作用就是用來管理文件與數據區塊之間的存儲位置關系。相較其他分布式文件系統而言,GlusterFS并沒有集中或者分布式的元數據的概念,取而代之的是彈性哈希算法。集群中的任何服務器和客戶端都可以利用哈希算法、路徑及文件名進行計算,就可以對數據進行定位,并執行讀寫訪問操作。
這種設計帶來的好處是極大的提高了擴展性,同時也提高了系統的性能和可靠性;另一顯著的特點是如果給定確定的文件名,查找文件位置會非常快。但是如果要列出文件或者目錄,性能會大幅下降,因為列出文件或者目錄時,需要查詢所在節點并對各節點中的信息進行聚合。此時有元數據服務的分布式文件系統的查詢效率反而會提高許多。
2、服務器間的部署
在之前的版本中服務器間的關系是對等的,也就是說每個節點服務器都掌握了集群的配置信息,這樣做的好處是每個節點度擁有節點的配置信息,高度自治,所有信息都可以在本地查詢。每個節點的信息更新都會向其他節點通告,保證節點間信息的一致性。但如果集群規模較大,節點眾多時,信息同步的效率就會下降,節點信息的非一致性概率就會大大提高。因此GlusterFS未來的版本有向集中式管理變化的趨勢。
3、客戶端訪問流程
當客戶端訪問GlusterFS存儲時,首先程序通過訪問掛載點的形式讀寫數據,對于用戶和程序而言,集群文件系統是透明的,用戶和程序根本感覺不到文件系統是本地還是在遠程服務器上。讀寫操作將會被交給VFS(Virtual File System)來處理,VFS會將請求交給FUSE內核模塊,而FUSE又會通過設備/dev/fuse將數據交給GlusterFS Client。最后經過GlusterFS Client的計算,并最終經過網絡將請求或數據發送到GlusterFS Server上。
三、GlusterFS集群的模式
GlusterFS 集群的模式只數據在集群中的存放結構,類似于磁盤陣列中的級別。
1、分布式卷(Distributed Volume)
又稱哈希卷,近似于RAID0,文件沒有分片,文件根據hash算法寫入各個節點的硬盤上,優點是容量大,缺點是沒冗余。
2、復制卷(Replicated Volume)
相當于raid1,復制的份數,決定集群的大小,通常與分布式卷或者條帶卷組合使用,解決前兩種存儲卷的冗余缺陷。缺點是磁盤利用率低。
復本卷在創建時可指定復本的數量,通常為2或者3,復本在存儲時會在卷的不同brick上,因此有幾個復本就必須提供至少多個brick,當其中一臺服務器失效后,可以從另一臺服務器讀取數據,因此復制GlusterFS卷提高了數據可靠性的同事,還提供了數據冗余的功能。
3、分布式復制卷(Distributed ReplicatedVolume)
分布式復制GlusterFS卷結合了分布式和復制Gluster卷的特點,看起來類似RAID10,但其實不同,RAID10其實質是條帶化,但分布式復制GlusterFS卷則沒有。
4、條帶卷(Striped Volume)
相當于raid0,文件是分片均勻寫在各個節點的硬盤上的,優點是分布式讀寫,性能整體較好。缺點是沒冗余,分片隨機讀寫可能會導致硬盤IOPS飽和。
5、分布式條帶卷(DistributedStripedVolume)
當單個文件的體型十分巨大,客戶端數量更多時,條帶卷已經無法滿足需求,此時將分布式與條帶化結合起來是一個比較好的選擇。其性能與服務器數量有關。
操作環境 :
4臺NAT模式
1 master 192.168.80.181
2 slave 192.168.80.182 192.168.80.183
1 client 192.168.80.184
用三個節點搭建一個glusterfs集群,再用一個作為客戶端使用
四臺都操作:
vi /etc/hosts
192.168.80.181 master
192.168.80.182 slave1
192.168.80.183 slave2
192.168.80.184 client
192.168.80.181(master)
ssh-keygen -t rsa
ssh-copy-id -i slave1
ssh-copy-id -i slave2
ssh-copy-id -i client
(嘗試在master用ssh上登陸其他三臺服務器)
四臺都操作:
配置yum源為阿里源(在每個節點中都執行)
wget http://mirrors.aliyun.com/repo/Centos-7.repo
執行yum源更新命令
yum clean all
yum makecache
安裝glusterfs
在master、slave1、slave2節點安裝glusterfs
yum install centos-release-gluster -y
yum install -y glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
systemctl start glusterd
systemctl enable glusterd
在master節點上配置,將兩個slave節點加入到gluster集群中。
gluster peer probe master
gluster peer probe slave1
gluster peer probe slave2
查看集群狀態:在master上查看
gluster peer status
創建數據存儲目錄(在三個節點上都運行):
mkdir -p /opt/gluster/data
查看volume 狀態:
gluster volume info
創建GlusterFS磁盤:
gluster volume create models replica 3 master:/opt/gluster/data slave1:/opt/gluster/data slave2:/opt/gluster/data force //force強制執行 volume 卷replica 3表明存儲3個備份,后面指定服務器的存儲目錄
——
GlusterFS 幾種volume 模式指令:
一、 默認模式,既DHT, 也叫分布卷: 將文件已hash算法隨機分布到一臺服務器節點中存儲。
命令:gluster volume create test-volume server1:/exp1 server2:/exp2
二、 復制模式,既AFR, 創建volume 時帶replica x 數量: 將文件復制到replica x 個節點中。
命令:gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2
三、 條帶模式,既Striped, 創建volume 時帶stripe x 數量: 將文件切割成數據塊,分別存儲到stripe x 個節點中( 類似raid 0 )。
命令:gluster volume create test-volume stripe 2 transport tcp server1:/exp1 server2:/exp2
四、 分布式條帶模式(組合型),最少需要4臺服務器才能創建。 創建volume 時stripe 2 server = 4 個節點: 是DHT 與Striped 的組合型。
命令:gluster volume create test-volume stripe 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
五、分布式復制模式(組合型), 最少需要4臺服務器才能創建。 創建volume 時replica 2 server = 4 個節點:是DHT 與AFR 的組合型。
命令:gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
六、 條帶復制卷模式(組合型), 最少需要4臺服務器才能創建。 創建volume 時stripe 2 replica 2 server = 4 個節點: 是Striped 與AFR 的組合型。
命令:gluster volume create test-volume stripe 2 replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
七、 三種模式混合, 至少需要8臺服務器才能創建。 stripe 2 replica 2 , 每4個節點組成一個組。
命令:gluster volume create test-volume stripe 2 replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4 server5:/exp5 server6:/exp6 server7:/exp7 server8:/exp8
——
再次查看volume信息
gluster volume info
啟動models
gluster volume start models
gluster 性能調優:
開啟指定volume 的配額:(models 為volume 名稱)
gluster volume quota models enable
限制models 中/ (既總目錄) 最大使用80GB 空間
gluster volume quota models limit-usage / 80GB
設置cache 大小(此處要根據實際情況,如果設置太大可能導致后面客戶端掛載失敗)
gluster volume set models performance.cache-size 512MB
開啟異步,后臺操作
gluster volume set models performance.flush-behind on
設置io 線程32
gluster volume set models performance.io-thread-count 32
設置回寫(寫數據時間,先寫入緩存內,再寫入硬盤)
gluster volume set models performance.write-behind on
調優之后的volume信息
gluster volume info
在客戶端上:
部署GlusterFS客戶端并mount GlusterFS文件系統
yum install -y glusterfs glusterfs-fuse
建立掛載點:
mkdir -p /opt/gfsmount
mount命令:
mount -t glusterfs 192.168.80.181:models /opt/gfsmount/
df 命令檢查:df -h
測試:
往該目錄寫入文件,隨后查看gluster服務器的存儲情況
time dd if=/dev/zero of=/opt/gfsmount/hello bs=100M count=1
查看phn機器上/opt/gfsmount 目錄
查看master機器上/opt/gluster/data目錄
查看slave1機器上/opt/gluster/data目錄
查看slave2機器上/opt/gluster/data目錄
可以看到gluster服務器的每個節點上都有備份,符合之前設置的3個備份的原則
其他命令
查看GlusterFS中所有的volume:
gluster volume list
刪除GlusterFS磁盤:
gluster volume stop models //停止名字為models 的磁盤
gluster volume delete models //刪除名字為models 的磁盤
注: 刪除磁盤以后,必須刪除磁盤( /opt/gluster/data ) 中的( .glusterfs/ .trashcan/ )目錄。
否則創建新volume 相同的磁盤會出現文件不分布,或者類型錯亂的問題。
卸載某個節點GlusterFS磁盤
gluster peer detach swarm-node-2
設置訪問限制,按照每個volume 來限制
gluster volume set models auth.allow 10.6.0.*,10.7.0.*
添加GlusterFS節點:
gluster peer probe swarm-node-3
gluster volume add-brick models swarm-node-3:/opt/gluster/data
配置卷
gluster volume set
縮容volume:
先將數據遷移到其它可用的Brick,遷移結束后才將該Brick移除:
gluster volume remove-brick models slave1:/opt/gluster/data slave2:/opt/gluster/data start
在執行了start之后,可以使用status命令查看移除進度:
gluster volume remove-brick models swarm-node-2:/opt/gluster/data swarm-node-3:/opt/gluster/data status
不進行數據遷移,直接刪除該Brick:
gluster volume remove-brick models swarm-node-2:/opt/gluster/data swarm-node-3:/opt/gluster/data commit
注意,如果是復制卷或者條帶卷,則每次移除的Brick數必須是replica或者stripe的整數倍。
擴容:
gluster volume add-brick models swarm-node-2:/opt/gluster/data
修復命令:
gluster volume replace-brick models swarm-node-2:/opt/gluster/data swarm-node-3:/opt/gluster/data commit -force
遷移volume:
gluster volume replace-brick models swarm-node-2:/opt/gluster/data swarm-node-3:/opt/gluster/data start
pause 為暫停遷移
gluster volume replace-brick models swarm-node-2:/opt/gluster/data swarm-node-3:/opt/gluster/data pause
abort 為終止遷移
gluster volume replace-brick models swarm-node-2:/opt/gluster/data swarm-node-3:/opt/gluster/data abort
status 查看遷移狀態
gluster volume replace-brick models swarm-node-2:/opt/gluster/data swarm-node-3:/opt/gluster/data status
遷移結束后使用commit 來生效
gluster volume replace-brick models swarm-node-2:/opt/gluster/data swarm-node-3:/opt/gluster/data commit
均衡volume:
gluster volume models lay-outstart
gluster volume models start
gluster volume models startforce
gluster volume models status
gluster volume models stop