Gluster成立於2005年,並於同年發表他們的分散式儲存系統Gluster File System (GlusterFS) ,該產品是一個免費開源的檔案系統,它可以利用scale out的方式增加檔案儲存區塊,來存放高達數PT的資料,在目前Big Data火紅的時代,愈來愈受到注目。
GlusterFS已於2011為Redhat公司以1.36億美金收購;Redhat於收購GlusterFS之後,另外推出一個以GlusterFS為基礎的商業版本Redhat Storage(RHS),但其實RHS與GlusterFS這兩種版本基本上並無太大的差異,只是RHS包含有Redhat官方售後的技術支援和服務;雖然如此,但Redhat仍持續投入人力支援GlusterFS以免費開源模式的方式運作,由下表可看到GlusterFS被收購當年與2013的情況比較:
2011
|
2013
|
約20名開發人員
|
約75名開發人員
|
支援:NFS v3 and GlusterFS client
|
支援:NFS v3, GlusterFS client, SAMBA, QEMU, Swift API, libgfapi
|
新版本週期:約一年
|
新版本週期:約4~6個月
|
無OpenStack整合
|
支援OpenStack整合
|
基本概念:
POSIX (Portable Operating System Interface)
中譯為「可移植作業系統介面」之意,由IEEE所定義規範,以驗証在UNIX 環境下應用程序的可移植性;GlusterFS是屬於POSIX-Compliant的一種分散式儲存系統,適用於任何UNIX/LINUX的系統。
scale out與scale up
我們先簡單介紹一下scale out與scale up這兩種擴增儲存空間的方式, 而這也是Glusterfs的核心概念。
Scale up: 傳統的擴增storage空間模式;當空間不夠時,便用新的、更大容量的storage來取代舊有的。
scale out: 是一種橫向擴展儲存空間的概念,和傳統的scale up方式不同,它不需要更動舊有的設備,只需加入新的storage到所謂的storage pool中。
Scale out具有擴充簡易、快速、設備不需停機、舊有的storage不需汰換、支援更大的儲存空間等特性,因此,scale out是這幾年相當流行的儲存概念。
FUSE (Filesystem in Userspace)
翻譯成中文為「使用者空間的檔案系統」,它提供了一套與Linux kernel VFS溝通的介面模組,可讓使用者自行以非特權使用者的身分設定並掛接檔案系統;最常見應用FUSE功能的如sshfs,它可以讓使用者以SSH的方式模擬並掛載檔案系統,而且還享有原有的SSH加密功能。
其中,VFS(Virtual File System Switch)是作為Kernel與真正檔案系統溝通的中間層介面;由於目前檔案系統種類眾多,如BSD、FAT32、NTFS、EXT2、EXT3、JFS、JFS2、ReiserFS 等等,因此,VFS提供了一個統一且有規範的介面,我們可以把它想像為一個中間交換層,負責將各項檔案處理的需求(掛載、讀取、寫入、複製、刪除等),交由所對應的真實檔案系統去執行。
運作方式:
Brick是由最底層、實體的storage所提供的檔案空間;如下圖左側的brick1~brick6,是由node1,node2,node3,node4等四台storage所提供,再經由GLusterFS轉換為Volume1與Volume2兩個filesystem提供外部伺服器使用。
Volume的組成:(圖示摘自Redhat官方說明)
如果我們將每一個bricks視為storage上的每一個slot,那麼,我們會在該storage上作出各種raid的格式,同樣的,GlusterFS也可以將這些bricks,組合下列三種基本的volume形式:
Distributed volume:Gluster 會在volume中的所有的Bricks隨機分散地儲存檔案;換句話說,File1可能會儲存在BBrick1,而File2可能會儲存在其它不同的Brick;此種方式可以提供最大的儲存空間,但沒有任何的安全性,若底層有一台Storage掛了,則它所屬的Bricks上面的檔案都會消失,您只能從Storage所提供的raid機制,或者利用備份來還原所需的檔案。
Distributed volume的特性:
檔案會隨機儲存在每個Brick。
GlusterFS沒有提供任何的安全性。
檔案復原機制僅由底層的實體storage所提供。
可提供最大的儲存空間
Striped volume:檔案在儲存之前會被先切割成小塊之後,再儲存到不同的Bricks;所以,當讀寫一個大型的檔案時,由於它會被切割成多個小檔案,並同時寫入到不同的Bricks,因此,讀寫的效能與速度將會增加。
Striped volume的特性:
與Distributed volume相同,GlusterFS沒有提供任何的安全性。
與Distributed volume相同,安全性更低,只要任何一個Brick損壞,會造成所有儲存在此Brick檔案的損毀。
檔案切片的數量應與Volume中的Bricks數目一致。
能提供最有效率及最快速度的讀寫。
Replicated volme:此方式能提供最佳的安全性,所有的Bricks會被分成指定數目的複本群組,檔案會同時儲存到這些群組Bricks,且個個群組的內容完全相同;因此,就算某個Brick、甚至於某台底層storage當機,也不會對檔案有任何的影響。
Replicated volume的特性:
此外,此三種基本格式還可以加以混用合組,因此,愈多的nodes(實體storage),除了能增加Glusterfs的空間之外(Distributed)、亦會讓Glusterfs讀寫的效率更高(Striped),並且資料的安全性更高(Repliacted)
Distributed Striped Volumes:Distributed striped volumes 與 striped volume很類似,額外的好處是您可以將檔案打散分佈在更多的Bricks,得到同時有大空間以及存取效率快速的好處。
Distributed Striped volume的特性:
Distributed Replicated Volumes:檔案會依次的寫入到各個Brick複本群組(而非Bricks),最常應用此方式的狀況是,當您空間需求很緊迫,但又不能喪失檔案安全性的時候。
Distributed Replicated volume的特性:
您還可以依自身的需求,組合出所需要的Volume形式;例如Striped Replicated Volumes:
Bricks的數量為每個Volume中的複本數目x檔案切片(strip)數目;Striped Replicated Volumes會先將每個Volume中的bricks依複本數分成數個複本群組,再將檔案切片後寫入;本方法適用於需要高速即時存取以及兼顧檔案安全性的情況。
另外一個較為複雜的是Distributed Striped Replicated Volumes;此種Volume會將 stripe後資料以distribute方式,放置於每個複本群組(Replicated Volume)中。
此種方式兼顧了存取效率、安全性以及檔案空間,但也需要大量的nodes來實現,所需的bricks數目為stripe數目與複本數目的乘積。
各種Volume type的實作及說明,可參考Redhat官方的文件:https://access.redhat.com/site/documentation/en-US/Red_Hat_Storage/2.1/html/Administration_Guide/chap-User_Guide-Setting_Volumes.html
實作:建立一個Replicated volume
以下,我們使用VirtualBox,並安裝三台CentOS來搭建一個GlusterFS環境;其中,CentOS1作為GlusterFS主控台,且與CentOS2則作為GlusterFS storage,即前面所稱的node,CentOS3為client端。
在每台host修改/etc/hosts :
加入
10.0.2.1 centos1
10.0.2.2 centos2
10.0.2.3 centos3
在每台host安裝XFS檔案系統支援:
Install XFS filesystem support
#yum install xfsprogs xfsdump
在centos1, centos2製作XFS storage:
Make storage with xfs filesystem on sdb1
#fdisk /dev/sdb
#mkfs.xfs -i size=512 /dev/sdb1
#mkdir -p /data/gv0/brick1
Edit /etc/fstab file, add
/dev/sdb1 /data/gv0/brick1 xfs defaults 1 2
#mount –a
#mount → You should now see sdb1 mounted at /data/gv0/brick1
在centos1, centos2安裝Glusterfs server:
# wget -P /etc/yum.repos.d http://download.gluster.org/pub/gluster/glusterfs/LATEST/EPEL.repo/glusterfs-epel.repo
# yum install glusterfs-server
Stop Selinux & Iptables:
為了保險起見,我們先將Selinux及防火牆關閉,以避免一些不必要的異常錯誤。
Disable Selinux
vi /etc/selinux/config
Change SELINUX=enforcing → SELINUX=disabled
And then reboot
Stop iptables
/etc/init.d/iptables stop
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
Start service:
# service glusterd start
Starting glusterd: [ OK ]
# service glusterd status
glusterd (pid 4471) is running...
# chkconfig glusterd on
# chkconfig glusterfsd on
Configure and start the trusted pool:
在Centos1:
[root@centos1 ~]# gluster peer probe centos2
peer probe: success
在Centos2:
[root@centos2 ~]# gluster peer probe centos1
peer probe: success
在任一台皆可,建一個replica(Replicated Volume)
# gluster volume create gv0 replica 2 centos1:/data/gv0/brick1 centos2:/data/gv0/brick1 force
volume create: gv0: success: please start the volume to access data
# gluster volume start gv0
volume start: gv0: success
# gluster volume info
Volume Name: gv0
Type: Replicate
Volume ID: f57a57a9-dc28-40b2-bc45-d1473f0018db
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: centos1:/data/gv0/brick1
Brick2: centos2:/data/gv0/brick1
測試:
在centos3
# yum install glusterfs-fuse
# mount -t glusterfs centos1:/gv0 /mnt
# mount
/dev/mapper/vg_centos1-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
centos1:/gv0 on /mnt type fuse.glusterfs (rw,default_permissions,allow_other,max_read=131072)
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_centos1-lv_root 6.7G 3.4G 3.0G 54% /
tmpfs 499M 232K 498M 1% /dev/shm
/dev/sda1 485M 35M 426M 8% /boot
centos1:/gv0 4.0G 33M 4.0G 1% /mnt
驗証:
# vi /mnt/test //write some test
You will find the same file on centos1 & centos2 in /data/gv0/brick1
Shutdown centos2, and do some test on centos3
#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_centos1-lv_root 6.7G 3.4G 3.0G 54% /
tmpfs 499M 232K 498M 1% /dev/shm
/dev/sda1 485M 35M 426M 8% /boot
centos1:/gv0 4.0G 33M 4.0G 1% /mnt
# cat /mnt/test
this is a test
上方的步驟中,我們在centos1及centos2使用另一顆HD建立了xfs檔案系統,並將它掛載到/data/gv0/brick1,再建立一個Replicated Volume將此兩個bricks放入;之後我們便可以在其它(Centos3) client,使用mount -t glusterfs centos1:/gv0 方式將其掛載使用。
由於我們建立的是Replicated Volume,因此, client端所掛載的glusterfs目錄下所產生的任何檔案,也會在centos1, centos2的brick 目錄下(/data/gv0/brick1)看到相同的檔案複本。
GlusterFS的應用與未來
Cluster(叢集)的應用主要有四種,叢集儲存(Storage Cluster)、HA(High Available高可用)、Load Balance與High Performance等,每一種都可以適用於不同的需求,在目前「雲端」這個詞彙紅火的年代,相關的技術與應用若不與「雲端」扯上關係,似乎便趕不上流行;但GlusterFS是真正適合用於雲端服務架構底層免費開源的儲存系統,它同時具有高容量、高可靠性、高擴展性,而且,它沒有一般系統常見的SPoF(Single Point Of Failure)單點失效的問題,換句話說,GlusterFS沒有主要的控制主機,環境中任何一個node失效當機,都不會造成系統的異常或資料遺失;且由於scale-out、stripe的特性,使得GlusterFS能夠即時且彈性的擴增空間,並且非常適用於非結構性資料的大量雲端資料儲存
除了雲端的應用,GlusterFS也適用於一般企業內部,例如將所有老舊的storage整合起來,可充份利用舊機器的空間、也不用擔心資料的安全性;此外,也適用於需要computing運算環境的IC設計公司,可快速且彈性的調整所需要的儲存空間、並利用stripe volume加快運算時所需的快速存取;另外,若企業內有架設虛擬主機環境,亦可作為後端的storage平台,提供虛擬主機一個良好的儲存備援,避免因storage異常而造成整體虛擬主機環境的崩潰。