GlusterFS簡介:
互聯網四大開源分布式文件系統分別是:MooseFS、CEPH、Lustre、GusterFS.
GluterFS最早由Gluster公司開發,其目的是開發一個能為客戶提供全局命名空間、分布式前端及高達數百PB級別擴展性的分布式文件系統。
相比其他分布式文件系統,GlusterFS具有高擴展性、高可用性、高性能、可橫向擴展等特點,並且其沒有元數據服務器
的設計,讓整個服務沒有單點故障的隱患。
常見的分布式文件系統簡介:
1、MooseFS
MooseFS主要由管理服務器(master)、元日志服務器(Metalogger)、數據存儲服務器(chunkserver)構成。
管理服務器:主要作用是管理數據存儲服務器,文件讀寫控制、空間管理及節點間的數據拷貝等。
元日志服務器:備份管理服務器的變化日志,以便管理服務器出問題時能恢復工作。
數據存儲服務器:聽從管理服務器調度,提供存儲空間,接收或傳輸客戶數據等。
MooseFS的讀過程如圖所示:
總結:MooseFS結構簡單,適合初學者理解分布式文件系統的工作過程,但MooseFS具有單點故障隱患,一旦master無法工作,整個分布式文件系統
都將停止工作,因此需要實現master服務器的高可用(比如heartbeat+drbd實現)
2、Lustre
Lustre 是一個比較典型的高性能面向對象的文件系統,其結構相對比較復雜,如圖所示:
Lustre由元數據服務器(Metadata Servers,MDSs)、對象存儲服務器(Object Storage Servers,OSSs)和管理服務器(Management
Servers,MGSs)組成。與MooseFS類似,當客戶端讀取數據時,主要集中在MDSs和OSSs間;寫入數據時就需要MGS、MDSs及OSSs
共同參與操作。
總結:Lustre主要面對的是海量的數據存儲,支持多達10000個節點、PB級的數據存儲、100Gbit/s以上傳輸速度。在氣象、石油等領域應用十分
廣泛,是目前比較成熟的解決方案之一。
3、Ceph
請參考Ceph分布式存儲篇。
二、GluserFS概述
1、無元數據設計
元數據是用來描述一個文件或給定區塊在分布式文件系統中所在的位置,簡而言之就是文件或某個區塊存儲的位置。
主要作用就是管理文件或數據區塊之間的存儲位置關系。
GlusterFS設計沒有集中或分布式元數據,取而代之的是彈性哈希算法。集群中的任何服務器、客戶端都可利用哈希算法、路徑及文件名
進行計算,就可以對數據進行定位,並執行讀寫訪問操作。
結論:無元數據設計帶來的好處是極大地提高了擴展性,同時也提高了系統的性能和可靠性。如果需要列出文件或目錄,性能會大幅下降,因為
列出文件或目錄,需要查詢所在的節點並對節點中的信息進行聚合。但是如果給定確定的文件名,查找文件位置會非常快。
2、服務器間的部署
GlusterFS集群服務器之間是對等的,每個節點服務器都掌握了集群的配置信息。所有信息都可以在本地查詢。每個節點的信息更新都會
向其他節點通告,保證節點信息的一致性。但是集群規模較大后,信息同步效率會下降,非一致性概率會提高。
3、客戶端訪問
當客戶端訪問GlusterFS存儲時,流程如圖所示:
首先程序通過訪問掛載點的形式讀寫數據,對於用戶和程序而言,集群文件系統是透明的,用戶和程序根本感覺不到文件系統是本地
還是遠端服務器上。讀寫操作會被交給VFS(Virtual File System,虛擬文件系統) 來處理,VFS會將請求交給FUSE內核模塊,而FUSE又會
通過設備/dev/fuse將數據交給GlusterFS Client。最后經過GlusterFS Client計算,並最終通過網絡將請求或數據發送到GlusterFS Servers上。
4、可管理性
GlusterFS在提供了一套基於Web GUI的基礎上,還提供了一套基於分布式體系協同合作的命令行工具,兩者相結合就可以完成
GlusterFS的管理工作。
三、GlusterFS集群模式
GlusterFS集群模式是指數據在集群中的存放結構,類似於磁盤陣列中的級別。GlusterFS支持多種集群模式,具體如下:
四、集群部署:
GlusterFS安裝部署
1.安裝glusterfs依賴的包
yum install -y centos-release-gluster37.noarch yum --enablerepo=centos-gulster*-test install gluster-server gluster-cli gluster-geo-replication
二、GlusterFS安裝部署實踐
2.1GlusterFS安裝環境准備
#准備好4台Centos6-x86_64虛擬機 內存1G 數據盤10G 網絡選擇nat;
每台機器,關閉 selinux iptables並做每台好主機名解析:
192.168.10.101 mystorage1 192.168.10.102 mystorage2 192.168.10.103 mystorage3 192.168.10.104 mystorage4
補充說明:
#修改主機名2個位置
1. 修改 /etc/sysconfig/network 另外一個是 /etc/hosts vi /etc/sysconfig/network 里面有一行 HOSTNAME=localhost.localmain修改成localhost.localdomain作為主機名 /etc/hosts里面有一行 127.0.0.1 localhost.localdomain(主機名hostname)
2.2關閉selinux及iptables
#關閉selinux sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux或 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config #關閉iptables /etc/init.d/iptables stop #永久關閉 chkconfig iptables off
2.3安裝epel源(4台主機分別執行)
GlusterFS yum 源有部分包依賴epel源 yum -y install epel-release
2.4安裝glusterfs源(4台主機分別執行)
wget -P /etc/yum.repos.d/ https://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/RHEL/glusterfs-epel.repo
或者gluster的相關包下載到本地目錄
主要包括
glusterfs-3.7.4-2.e16.x86_64.rpm glusterfs-cli-3.7.4-2.e16.x86_64.rpm glusterfs-debuginfo-3.7.4-2.e16.x86_64.rpm glusterfs-geo-replication-3.7.4-2.e16.x86_64.rpm glusterfs-rdma-3.7.4-2.e16.x86_64.rpm glusterfs-api-3.7.4-2.e16.x86_64.rpm glusterfs-client-xlators-3.7.4-2.e16.x86_64.rpm glusterfs-fuse-3.7.4-2.e16.x86_64.rpm glusterfs-libs-3.7.4-2.e16.x86_64.rpm glusterfs-server-3.7.4-2.e16.x86_64.rpm
下載地址:
https://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/CentOS/epel-6.8/x86_64/
例如:(4台主機分別執行)
mkdir -p /opt/glusterfs
執行yum -y install glusterfs-*
一直執行完畢,沒有報錯的話,glusterfs安裝完畢;
2.5或者yum安裝(4台主機分別執行)
yum install -y centos-release-gluster37.noarch yum --enablerepo=centos-gluster*-test install glusterfs-server glusterfs-cli glusterfs-geo-replication
2.6配置Glusterfs
#查看gluster版本信息
glusterfs -V
#啟動停止服務(4台主機分別執行)
/etc/init.d/glusterd start /etc/init.d/glusterd stop
#添加開機啟動(4台主機分別執行)
chkconfig glusterd on
#查看glusterfs的運行狀態(4台主機分別執行)
/etc/init.d/glusterd status
2.7存儲主機加入信任存儲池配置(4台主機分別執行)
說明:每台主機上加入除本機以外對應的其他3台主機的存儲池配置
gluster peer probe mystorage2 gluster peer probe mystorage3 gluster peer probe mystorage4
#查看配置連接存儲池的狀態(4台主機分別執行)
gluster peer status
三、GlusterFS配置實踐
3.1 配置之前的准備工作
安裝xfs支持包(4台主機分別執行)
yum -y install xfsprogs
fdisk -l #查看磁盤塊設備,查看類似的信息
#磁盤分區(這步可以不做)
fdisk /dev/vdb n p 1(數字) 回車 w
再次執行fdisk -l查看
說明:如果格式話分區的磁盤大於4T使用 parted命令
生產環境中:磁盤的分區的分區暫時不做。直接對應格式化即可。
#分區格式化,每台機器上執行
mkfs.xfs -f /dev/sdb
#分別在4台機器上 執行
mkdir -p /storage/brick1 #建立掛在塊設備的目錄 mount /dev/sdb /storage/brick1
執行df -h查看
#開機自動掛載(4台機器中每台執行)
編輯/etc/fstab添加如下
/dev/sdb /storage/brick1 xfs defaults 0 0
或者執行命令:(4台機器中每台執行)
echo "/dev/sdb /storage/brick1 xfs defaults 0 0" >> /etc/fstab
#4台機器中機器分別執行掛載命令
mount -a
#每台機器執行查看掛載情況命令;(4台機器也都自動掛載了)
df -h
3.2創建volume及其操作
Distributed,分布卷,算法隨機分布到bricks組的卷上。 Replicated 復制試卷,類似raid1 replica數必須等於volume中brick所包含存儲服務器數,可用性高。 Striped,帶條帶的卷,類似raid0 stripe數必須等於volume中brick所包含的存儲服務器數,文件被分割數據模塊,以RoundRobin的方式存儲在bricks,並發顆粒度是數據塊,大文件性能好. Distributed Striped分布式的條帶卷,volume中的brick所包含的存儲服務器數必須是stripe的倍數(>=2倍)兼顧分布式和條帶的功能、(生產環境一般不使用,官方也不推薦) Distributed Relicated分布式的復制卷,volume中brick1所包含的存儲服務器數必須是replica的倍數(>=2倍)兼顧分布式和復制的功能。(生產環境使用較多)
情景1:
3.3創建分布卷(任意一台主機執行即可)[意義是跨主機整合磁盤]
gluster volume create gv1 mystorage1:/storage/brick1 mystorage2:/storage/brick1 force
3.4創建啟動卷(任意一台主機執行即可)
[root@ mystorage1brick1]# gluster volume start gv1
#查看配置卷的信息
[root@ mystorage1brick1]# gluster volume info
3.5掛載到目錄(任意一台主機執行即可)
mount -t glusterfs 127.0.0.1:/gv1 /mnt
3.6#查看掛載后的磁盤(任意一台主機執行即可)
df -h
3.7創建文件查看測試結果
#mystorage1s上創建文件
[root@mystorage1 mnt]# touch a b c dd ddf
#mystorage3查看創建文件
[root@mystorage3 mnt]# ls a b c dd ddf
情景2:
3.8測試NFS方式掛載及查看數據
[root@mystorage4 /]# umount /mnt/ [root@mystorage4 /]# mount -o mountproto=tcp -t nfs 192.168.56.11:/gv1 /mnt/ [root@mystorage4 /]# df -h [root@mystorage4 /]# umount /mnt/
#測試掛載另外一台機器
[root@mystorage4 /]# mount -o mountproto=tcp -t nfs 192.168.56.12:/gv1 /mnt/ [root@mystorage4 /]# df -h [root@mystorage4 /]# umount /mnt/
情景3:
3.9創建分布式復制卷(storage3和storage4)[生產場景推薦使用此種方式]
[root@mystorage1 mnt]# gluster volume create gv2 replica 2 mystorage3:/storage/brick1 mystorage4:/storage/brick1 force [root@mystorage2 ~]# gluster volume start gv2 [root@mystorage1 mnt]# df -h [root@mystorage1 mnt]# mount -t glusterfs 127.0.0.1:/gv2 /opt [root@mystorage1 mnt]# df -h [root@mystorage1 mnt]# cd /opt/ [root@mystorage1 opt]# touch sdfsd sdf
3.10測試查看分布式復制的數據(storage3和storage4)
[root@mystorage3 mnt]# cd /storage/brick1 [root@mystorage3 brick1]# ls sdfsd sdf [root@mystorage4 mnt]# cd /storage/brick1 [root@mystorage4 brick1]# ls sdfsd sdf
說明:以上兩種情況,一是創建分布卷,另外創建分布式復制卷,生產場景中一般使用1個卷(整合多個磁盤到一個卷)使用分布式復制卷場景(情景3)居多。
情景4:
3.11創建分布式條帶卷
#創建卷目錄(4台主機分別執行)
mkdir -p /storage/brick2
#添加開機啟動自動掛載(4台主機分別執行)
echo "/dev/sdc /storage/brick2 xfs defaults 0 0" >>/etc/fstab
#執行掛載(4台主機分別執行)
mount -a
#查看掛載情況(4台主機分別執行)
df -h
#創建分布式條帶卷(storage1上執行)
gluster volume create gv3 stripe 2 mystorage3:/storage/brick2 mystorage4:/storage/brick2 force
#啟動卷(storage1上執行)
gluster volume start gv3
#查看配置卷信息
gluster volume info
#創建要掛載的目錄(分別在4台機器的根上新建gv1 gv2 gv3)
mkdir /gv1 /gv2 /gv3
#執行掛載命令(storage4上執行)(4台機器也可都執行)
mount -t glusterfs 127.0.0.1:gv1 /gv1 mount -t glusterfs 127.0.0.1:gv2 /gv2 mount -t glusterfs 127.0.0.1:gv3 /gv3 df -h
#我們創建一個10M的目錄測試(storage4上)
[root@mystorage4 gv3]# ls -a . .. .trashcan [root@mystorage4 gv3]# dd if=/dev/zero bs=1024 count=10000 of=/gv3/10M.file [root@mystorage4 gv3]# dd if=/dev/zero bs=2048 count=10000 of=/gv3/20M.file [root@mystorage4 gv3]# cd /storage/brick2 [root@mystorage4 brick2]# ls -lh
#進入到storage3上看下
[root@mystorage3 gv3]# cd /storage/brick2 [root@mystorage3 brick2]# ls -lh
對比兩邊的文件你會發現兩個文件被打散分別存儲在storage3和storage4上了、
[root@mystorage3 gv3]# ls -lh #也會看到剛我們創建的兩個文件。
#我們在storage3上 gv2目錄測試
[root@mystorage3 gv2]# dd if=/dev/zero bs=1024 count=10000 of=/gv2/10M.file [root@mystorage3 gv2]# dd if=/dev/zero bs=2048 count=10000 of=/gv2/20M.file
#進入到storage3 brick1和storage4 brick1對比查看
[root@mystorage3 brick1]# ls -lh [root@mystorage4 brick1]# ls -lh
3.12 添加磁盤操作
#停止gv2 數據服務
gluster volume stop gv2
#添加新加的磁盤的到存儲池
gluster volume add-brick gv2 replica 2 mystorage1:/storage/brick2 mystorage2:/storage/brick2 force
#啟動啟動卷
gluster volume start gv2
#取消掛載gv2,重新掛載
umount /gv2 mount -t glusterfs 127.0.0.1:/gv2 /gv2
#查看掛載結果(gv2已經變成20G了)
df -h
#查看gv2卷信息
gluster volume info gv2
注意說明:
當你給分布式復制卷和分布式條帶卷中增加bricks時,你增加的bricks的數目必須是復制卷和條帶卷數目的倍數。例如:
你給一個分布式復制卷的replica為2 你在增加bricks的時候數量必須為2.4.6.8等。
3.13磁盤存儲的平衡:
注意;平衡布局是很有必要的,因為布局結構是靜態的,當新的bricks加入現有卷,新建的文件會分布在舊的brick中,所以需要平衡布局結構,使新加入的bricks生效,布局只是使新布局生效。並不會在新的布局上移動老的數據,如果想在新布局生效后,重新平衡卷中的數據,還需要對卷中的數據進行平衡。
執行命令:(可在storage1上執行)
gluster volume rebalance gv2 start
#查看執行平衡后同步的狀態
gluster volume rebalance gv2 status
3.14移除brick
注意:你可能想在線縮小卷的大小。例如:當硬件損壞或者網絡故障的時候,你可能想在卷中移除相關的bricks注意,當你移除bricks的時候,你在gluster的掛載點不能繼續訪問數據,只有配置文件中的信息移除后你才能繼續訪問bricks的數據。當移除分布式復制卷或者分布式條帶卷的時候,移除的bricks數目必須是replica或者stripe的倍數。例如:一個分布式條帶卷的stripe是2 當你移除bricks的時候必須是2、4、6、8等。
執行操作:
gluster volume stop gv2
#移除操作
gluster volume remove-brick gv2 replica 2 mystorage3:/storage/brick1 mystorage4:/storage/brick1 force
3.15刪除卷
#storege4上看下掛載情況
df -h
#卸載gv1
umount /gv1
#停止卷
gluster volume stop gv1
#刪除卷
gluster volume
#查看卷信息
gluster volume info gv1
GlusterFS在企業中應用場景
理論和實踐分析,GlusterFS目前主要使用大文件存儲場景,對於小文件尤其是海量小文件,存儲效率和訪問性能都表現不佳,海量小文件LOSF問題是工業界和學術界的人工難題,GlusterFS作為通用的分布式文件系統,並沒有對小文件額外的優化措施,性能不好也是可以理解的。
Media -文檔、圖片、音頻、視頻 *Shared storage -雲存儲、虛擬化存儲、HPC(高性能計算) *Big data -日志文件、RFID(射頻識別)數據
###########################################################################################
一、構建高性能分布式存儲基本條件和要求
1.1硬件要求:
一般選擇2U的機型,磁盤STAT盤4T,如果I/O要求比較高,可以采購SSD固態硬盤。為了充分保證系統的穩定性和性能,要求所有的Glusterfs服務器硬件配置盡量一致,尤其是硬盤數量和大小。機器的RAID卡需要帶電池,緩存越大,性能越好,一般情況下建議做RAID10,如果出於空間要求的考慮,需要做RAID5,建議最好能有1-2塊硬盤的熱備盤。
1.2系統要求和分區划分
系統要求: 建議使用Centos6.x安裝完成后升級到最新版本。 分區划分: 安裝的時候,不要選擇LV,建議/boot分區200M分區100G,swap分區和內存一樣的大小,剩余空間給gluster使用,划分單獨的硬盤空間,系統安裝軟件沒有特殊要求,建議出了開發工具和基本的管理軟件,其他軟件一律安裝。
1.3網絡環境
網絡要求全部千兆環境,gluster服務器至少有2塊網卡,1塊網卡綁定供gluster使用,另外1塊管理網絡ip用於系統管理。如果有條件購買萬兆交換機,服務器可配置萬兆網卡,存儲性能會更好,網絡方面如果安全性要求較高,可以多網卡綁定。
1.4服務器擺放分布
服務器主備要求放在不同的機櫃,連接不同的交換機,即使一個機櫃出現問題,還有一份數據能夠正常訪問。
1.5構建高性能高可用存儲
一般在企業中,采用的是分布式復制卷,因為有數據備份,數據相對安全,分布式條帶卷目前對gulsterfs來說沒有完全成熟,存儲一定的數據安全風險。
補充說明:
開啟防火牆端口
一般在企業中linux的防火牆是打開的,部署gluster服務服務器需要開通如下端口:
命令如下:
iptables -I INPUT -p tcp --dport 24007:24011 -j ACCEPT iptables -I INPUT -p tcp --dport 38465:38485 -j ACCEPT
部署安裝GlusterFS見前面文章https://www.liuliya.com/archive/733.html
二、構建高性能分布式存儲實踐優化
2.1GlusterFS文件系統優化
Auth_allow #IP訪問授權;缺省值(*.allow all);合法值:Ip地址 Cluster.min-free-disk #剩余磁盤空間閥值;缺省值(10%);合法值:百分比 Cluster.stripe-block-size #條帶大小;缺省值(128KB);合法值:字節 Network.frame-timeout #請求等待時間;缺省值(1800s);合法值:1-1800 Network.ping-timeout #客戶端等待時間;缺省值(42s);合法值:0-42 Nfs.disabled #關閉NFS服務;缺省值(Off);合法值:Off|on Performance.io-thread-count #IO線程數;缺省值(16);合法值:0-65 Performance.cache-refresh-timeout #緩存校驗時間;缺省值(1s);合法值:0-61 Performance.cache-size #讀緩存大小;缺省值(32MB);合法值:字節 Performance.quick-read: #優化讀取小文件的性能 Performance.read-ahead: #用預讀的方式提高讀取的性能,有利於應用頻繁持續性的訪問文件,當應用完成當前數據塊讀取的時候,下一個數據塊就已經准備好了。 Performance.write-behind:先寫入緩存內,在寫入硬盤,以提高寫入的性能。 Performance.io-cache:緩存已經被讀過的、
2.2優化參數調整方式
命令格式: gluster.volume set <卷><參數>
例如:
#打開預讀方式訪問存儲
[root@mystorage gv2]# gluster volume set gv2 performance.read-ahead on
#調整讀取緩存的大小
[root@mystorage gv2]# gluster volume set gv2 performance.cache-size 256M
2.3監控及日常維護
使用zabbix自帶的模板即可,CPU、內存、磁盤空間、主機運行時間、系統load。日常情況要查看服務器監控值,遇到報警要及時處理。
#看下節點有沒有在線
gluster volume status nfsp
#啟動完全修復
gluster volume heal gv2 full
#查看需要修復的文件
gluster volume heal gv2 info
#查看修復成功的文件
gluster volume heal gv2 info healed
#查看修復失敗的文件
gluster volume heal gv2 heal-failed
#查看主機的狀態
gluster peer status
#查看腦裂的文件
gluster volume heal gv2 info split-brain
#激活quota功能
gluster volume quota gv2 enable
#關閉quota功能
gulster volume quota gv2 disable
#目錄限制(卷中文件夾的大小)
gluster volume quota limit-usage /data/30MB --/gv2/data
#quota信息列表
gluster volume quota gv2 list
#限制目錄的quota信息
gluster volume quota gv2 list /data
#設置信息的超時時間
gluster volume set gv2 features.quota-timeout 5
#刪除某個目錄的quota設置
gluster volume quota gv2 remove /data
備注:
quota功能,主要是對掛載點下的某個目錄進行空間限額。如:/mnt/gulster/data目錄,而不是對組成卷組的空間進行限制。
三、Gluster日常維護及故障處理
3.1硬盤故障
因為底層做了raid配置,有硬件故障,直接更換硬盤,會自動同步數據。
如果沒有做raid處理方法:
1)正常node 執行gluster volume status 記錄故障節點uuid 2)執行getfattr -d -m '.*' /brick 3)記錄trusted.glusterfs.volume-id 及trusted.gfid
例如:
[root@mystorage1 gv2]# getfattr -d -m '.*' /storage/brick2
在機器上更換新磁盤,掛載目錄
執行如下命令:
setfattr -n trusted.glusterfs.volume-id -v 記錄值 brickpath setfattr -n trusted.gfid -v 記錄值 brickpath /etc/init.d/glusterd restart
3.2主機故障
一台節點故障的情況包括以下情況:
a)物理故障; b)同時有多快硬盤故障,造成數據丟失; c)系統損壞不可修復
解決方法:
1)找一台完全一樣的機器,至少要保證數量和大小一致,安裝系統,配置和故障機器同樣的ip安裝gluster軟件,保證配置都一樣,在其他健康的節點上執行命令gluster peer status,查看故障服務器的uuid。
2)修改新加機器的/var/lib/glusterd/glusterd.info和故障機器的一樣。
cat /var/lib/glusterd/glusterd.info UUID=2e3B51aa-45b2-4cc0-bc44-457d42210ff1
在新機器掛在目錄上執行磁盤故障的操作,在任意節點上執行
[root@mystorage1 gv2]# gluster volume heal gv1 full
就會自動開始同步,但是同步的時候會影響整個系統的性能。
3)查看狀態
[root@drbd01~]# gluster volume heal gv2 info
工作Glusterfs還有很多優化的位置點。具體細節官方文檔最詳細哈。
http://gluster.readthedocs.io/en/latest/Contributors-Guide/Guidelines-For-Maintainers/