分佈式存儲之GlusterFS

【背景需求】當前項目內部使用的文件系統有GlusterFS,FastDFS和NFS等,由於文件系統在海量小文件(大量散文件碎片化文件)和高併發之下性能急劇下降,性能遭遇瓶頸,因此打算建設分佈式對象存儲平臺。

分佈式文件存儲的來源

在這個數據爆炸的時代,產生的數據量不斷地在攀升,從GB,TB,PB,ZB.挖掘其中數據的價值也是企業在不斷地追求的終極目標。但是要想對海量的數據進行挖掘,首先要考慮的就是海量數據的存儲問題,比如Tb量級的數據。

談到數據的存儲,則不得不說的是磁盤的數據讀寫速度問題。早在上個世紀90年代初期,普通硬盤的可以存儲的容量大概是1G左右,硬盤的讀取速度大概爲4.4MB/s.讀取一張硬盤大概需要5分鐘時間,但是如今硬盤的容量都在1TB左右了,相比擴展了近千倍。但是硬盤的讀取速度大概是100MB/s。讀完一個硬盤所需要的時間大概是2.5個小時。所以如果是基於TB級別的數據進行分析的話,光硬盤讀取完數據都要好幾天了,更談不上計算分析了。那麼該如何處理大數據的存儲,計算分析呢?

分佈式存儲系統概念

分佈式存儲系統,是將數據分散存儲在多臺獨立的設備上。傳統的網絡存儲系統採用集中的存儲服務器存放所有數據,存儲服務器成爲系統性能的瓶頸(尤其是硬件故障這個定時炸彈),也是可靠性和安全性的焦點,不能滿足大規模存儲應用的需要。分佈式網絡存儲系統採用可擴展的系統結構,利用多臺存儲服務器分擔存儲負荷,利用位置服務器定位存儲信息,它不但提高了系統的可靠性、可用性和存取效率,還易於擴展。(即使900臺的集羣有100臺掛了絲毫也不影響正常使用尤其適合雲計算企業服務場景)

目前比較熱門的分佈式文件系統有如下幾種:Ceph、GlusterFS、Sheepdog、Lustre、Swift、Cinder、TFS、HDFS、MooseFS、FastDFS、MogileFS和KFS等(bat雲有oss、bos和CFS等公有云存儲產品)

用的較多的分佈式存儲系統是:Ceph(經濟實惠雲廠商用的多)、GlusterFS(Red Hat旗下)、GFS()谷歌的東西)、TFS(Taobao FileSystem)、HDFS(Hadoop Distributed File System)、NFS和FastDFS(阿里開源產品)

(簡單對比)Ceph用C++編寫而Swift用Python編寫,性能上應當是Ceph佔優。但是與Ceph不同,Swift專注於對象存儲,作爲OpenStack組件之一經過大量生產實踐的驗證,與OpenStack結合很好,目前不少人使用Ceph爲OpenStack提供塊存儲,但仍舊使用Swift提供對象存儲。Ceph對比HDFS優勢在於易擴展,無單點。HDFS是專門爲Hadoop這樣的雲計算而生,在離線批量處理大數據上有先天的優勢,而Ceph是一個通用的實時存儲系統。雖然Hadoop可以利用Ceph作爲存儲後端(根據Ceph官方的教程死活整合不了,自己寫了個簡潔的步驟: http://www.kai-zhang.com/cloud-computing/Running-Hadoop-on-CEPH/), 但執行計算任務上性能還是略遜於HDFS(時間上慢30%左右 Haceph: Scalable Meta- data Management for Hadoop using Ceph)。TFS(Taobao File System)是由淘寶開發的一個分佈式文件系統,其內部經過特殊的優化處理,適用於海量的小文件存儲,目前已經對外開源;TFS採用自有的文件系統格式存儲,因此需要專用的API接口去訪問,目前官方提供的客戶端版本有:C++/JAVA/PHP/GO。FastDFS是國人開發的一款分佈式文件系統,目前社區比較活躍。如上圖所示系統中存在三種節點:Client、Tracker、Storage,在底層存儲上通過邏輯的分組概念,使得通過在同組內配置多個Storage,從而實現軟RAID10,提升併發IO的性能、簡單負載均衡及數據的冗餘備份;同時通過線性的添加新的邏輯存儲組,從容實現存儲容量的線性擴容。文件下載上,除了支持通過API方式,目前還提供了apache和nginx的插件支持,同時也可以不使用對應的插件,直接以Web靜態資源方式對外提供下載。MooseFS是一個高可用的故障容錯分佈式文件系統,它支持通過FUSE方式將文件掛載操作,同時其提供的web管理界面非常方便查看當前的文件存儲狀態。GlusterFS是Red Hat旗下的一款開源分佈式文件系統,它具備高擴展、高可用及高性能等特性,由於其無元數據服務器的設計,使其真正實現了線性的擴展能力,使存儲總容量可 輕鬆達到PB級別,支持數千客戶端併發訪問;對跨集羣,其強大的Geo-Replication可以實現集羣間數據鏡像,而且是支持鏈式複製,這非常適用 於垮集羣的應用場景。

Google學術論文(谷歌還是devops/sre發起者),這是衆多分佈式文件系統的起源,HDFS和TFS都是參考Google的GFS設計出來的。

【上述系統有一個共同的特點:各自適用於不同的領域。它們都不是系統級的分佈式文件系統,而是應用級的分佈式文件存儲服務(符合當今軟件即服務的新商業模式)。】

開源協議說明
GPL:不允許修改後和衍生的代碼做爲閉源的商業軟件發佈和銷售,修改後該軟件產品必須也採用GPL協議;
GPL V2:修改文本的整體就必須按照GPL流通,不僅該修改文本的源碼必須向社會公開,而且對於這種修改文本的流通不准許附加修改者自己作出的限制;
GPL V3:要求用戶公佈修改的源代碼,還要求公佈相關硬件;
LGPL:更寬鬆的GPL



存儲系統 Ceph GlusterFS Sheepdog Lustre Swift Cinder TFS HDFS MooseFS FastDFS MogileFS
開發語言 C++ C C C Python Python C++ Java C C Perl
開源協議 LGPL GPL V3 GPLv2 GPL Apache Apache GPL V2 Apache GPL V3 GPL V3 GPL
數據存儲方式 對象/文件/塊 文件/塊 對象 對象 文件 文件 文件/塊 文件
集羣節點通信協議 私有協議(TCP) 私有協議(TCP)/ RDAM(遠程直接訪問內存) totem協議 私有協議(TCP)/ RDAM(遠程直接訪問內存) TCP 未知 TCP TCP TCP TCP HTTP
專用元數據存儲點 佔用MDS 雙MDS 未知 佔用NS 佔用MDS 佔用MFS 佔用DB
在線擴容 支持 支持 支持 支持 支持 未知 支持 支持 支持 支持 支持
冗餘備份 支持 支持 支持 支持 未知 支持 支持 支持 支持 不支持
單點故障 不存在 不存在 不存在 存在 不存在 未知 存在 存在 存在 不存在 存在
跨集羣同步 不支持 支持 未知 未知 未知 未知 支持 不支持 不支持 部分支持 不支持
易用性 安裝簡單,官方文檔專業化 安裝簡單,官方文檔專業化 未知 複雜。而且Lustre嚴重依賴內核,需要重新編譯內核 未知 目前來說框架不算成熟存在一些問題 安裝複雜,官方文檔少 安裝簡單,官方文檔專業化 安裝簡單,官方文檔多 安裝簡單,社區相對活躍 未知
適用場景 單集羣的大中小文件 跨集羣雲存儲 彈性塊存儲虛擬機 大文件讀寫 openstack對象存儲 openstack塊存儲 跨集羣的小文件 Mapreduce使用的文件存儲 單集羣的大中文件 單集羣的中小文件 未知
FUSE掛載 支持 支持 支持 支持 支持 未知 未知 支持 支持 不支持 不支持
訪問接口 POSIX POSIX 未知 POSIX/MPI POSIX 未知 不支持POSIX 不支持POSIX POSIX 不支持POSIX 不支持POSIX

開源選型時一定要考慮技術的熱門程度,否則招聘不到人,也找不到一起會弄的夥伴也就無從二次開發和改造。

分佈式存儲系統選型考慮的因素

一致性

分佈式存儲系統需要使用多臺服務器共同存儲數據,而隨着服務器數量的增加,服務器出現故障的概率也在不斷增加。爲了保證在有服務器出現故障的情況下系統仍然可用。一般做法是把一個數據分成多份存儲在不同的服務器中。但是由於故障和並行存儲等情況的存在,同一個數據的多個副本之間可能存在不一致的情況。這裏稱保證多個副本的數據完全一致的性質爲一致性。

可用性

分佈式存儲系統需要多臺服務器同時工作。當服務器數量增多時,其中的一些服務器出現故障是在所難免的。我們希望這樣的情況不會對整個系統造成太大的影響。在系統中的一部分節點出現故障之後,系統的整體不影響客戶端的讀/寫請求稱爲可用性。

分區容錯性

分佈式存儲系統中的多臺服務器通過網絡進行連接。但是我們無法保證網絡是一直通暢的,分佈式系統需要具有一定的容錯性來處理網絡故障帶來的問題。一個令人滿意的情況是,當一個網絡因爲故障而分解爲多個部分的時候,分佈式存儲系統仍然能夠工作。

除了上述三種特性考慮的,還需要考慮到大規模數據集、簡單的一致性模型、異構軟硬件平臺間的可移植性、Namenode 和 Datanode(命名空間)。

言歸正傳我們今天介紹GlusterFS

圖片

1.glusterfs概述

GlusterFS系統是一個可擴展的網絡文件系統,相比其他分佈式文件系統,GlusterFS具有高擴展性、高可用性、高性能、可橫向擴展等特點,並且其沒有元數據服務器的設計,讓整個服務沒有單點故障的隱患。

圖片

當客戶端訪問GlusterFS存儲時,首先程序通過訪問掛載點的形式讀寫數據,對於用戶和程序而言,集羣文件系統是透明的,用戶和程序根本感覺不到文件系統是本地還是在遠程服務器上。讀寫操作將會被交給VFS(Virtual File System)來處理,VFS會將請求交給FUSE內核模塊,而FUSE又會通過設備/dev/fuse將數據交給GlusterFS Client。最後經過GlusterFS Client的計算,並最終經過網絡將請求或數據發送到GlusterFS Server上。

2.glusterfs常用分佈式簡介

圖片

分佈式卷也成爲哈希卷,多個文件以文件爲單位在多個brick上,使用哈希算法隨機存儲。

應用場景:大量小文件

優點:讀/寫性能好

缺點:如果存儲或服務器故障,該brick上的數據將丟失

不指定卷類型,默認是分佈式卷

brick數量沒有限制

創建分佈式卷命令:

gluster volume create volume_name node1:/data/br1 node2:/data/br1

圖片

複製卷是將多個文件在多個brick上覆制多份,brick的數目要與需要複製的份數相等,建議brick分佈在不同的服務器上。

應用場景:對可靠性高和讀寫性能要求高的場景

優點:讀寫性能好

缺點:寫性能差

replica = brick

創建複製卷:

gluster volume create volume_name replica 2 node1:/data/br1 node2:/data/br1

replica:文件保存的份數

圖片

條帶卷是將文件分成條帶,存放在多個brick上,默認條帶大小128k

應用場景:大文件

優點:適用於大文件存儲

缺點:可靠性低,brick故障會導致數據全部丟失

stripe = birck

創建條帶卷:

gluster volume create volume_name stripe 2 node1:/data/br1 node2:/data/br1

stripe:條帶個數

分佈式條帶卷是將多個文件在多個節點哈希存儲,每個文件再多分條帶在多個brick上存儲

應用場景:讀/寫性能高的大量大文件場景

優點:高併發支持

缺點:沒有冗餘,可靠性差

brick數是stripe的倍數

創建分佈式條帶卷:

gluster volume create volume_name stripe 2 node1:/data/br1 node2:/data/br1 node3:/data/br1 node4:/data/br1

圖片

分佈式複製卷是將多個文件在多個節點上哈希存儲,在多個brick複製多份存儲。

應用場景:大量文件讀和可靠性要求高的場景

優點:高可靠,讀性能高

缺點:犧牲存儲空間,寫性能差

brick數量是replica的倍數

gluster volume create volume_name replica 2 node1:/data/br1 node2:/data/br1 node3:/data/br1 node4:/data/br1

圖片

條帶式複製卷是將一個大文件存儲的時候劃分條帶,並且保存多份

應用場景:超大文件,並且對可靠性要求高

優點:大文件存儲,可靠性高

缺點:犧牲空間寫性能差

brick數量是stripe、replica的乘積

gluster volume create volume_name stripe 2 replica 2 node1:/data/br1 node2:/data/br1 node3:/data/br1 node4:/data/br1

3.glusterfs環境

圖片

日誌存儲集羣採用的是分佈式複製卷,將多個文件在多個節點上哈希存儲,在多個brick複製多份存儲。共有五臺服務器,磁盤空間共有90T,那麼採用這種分佈式複製卷的方式,只有45T磁盤空間可用。並且需要採用分佈式複製卷方式需要要有雙數的brick,所以現採用一臺服務器上創建兩個brick,如上圖所示,10.102.23.4:/data_01/node和10.102.23.44:/data_01/node是備份關係,其他節點均是如此,10.102.23.44作爲日誌存儲集羣的管理節點,nfs-ganesha服務只需要安裝在控制節點,客戶端則可以通過nfs方式掛載。

# sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/sysconfig/selinux #關閉selinux

# iptables -F #清除防火牆規則

安裝glusterfs(01-05)

圖片

# yum install userspace-rcu-*

# yum install python2-gluster-3.13.2-2.el7.x86_64.rpm

# yum install tcmu-runner-* libtcmu-*

# yum install gluster*

# yum install nfs-ganesha-*

#這個nfs只要需要對外掛載的哪臺服務器需要安裝(10.102.23.44)

# systemctl start glusterd.service #所有服務器啓動glusterd

# systemctl start rpcbind

# systemctl enable glusterd.service

# systemctl enable rpcbind

# ss -lnt #查詢端口是否有爲24007,如果有則服務正常運行

創建集羣(在10.102.23.44節點上執行一下操作,向集羣中添加節點):

[root@admin-node ~]# gluster peer probe 10.102.23.44

peer probe: success. [root@admin-node ~]# gluster peer probe 10.102.23.45

peer probe: success.

[root@admin-node ~]# gluster peer probe 10.102.23.46

peer probe: success.

[root@admin-node ~]# gluster peer probe 10.102.23.47

peer probe: success.

[root@admin-node ~]# gluster peer probe 10.102.23.4

peer probe: success.

查看虛擬機信任狀態添加結果

[root@admin-node ~]# gluster peer status

Number of Peers: 4

Hostname: 10.102.23.46

Uuid: 31b5ecd4-c49c-4fa7-8757-c01604ffcc7e

State: Peer in Cluster (Connected)

  

Hostname: 10.102.23.47

Uuid: 38a7fda9-ad4a-441a-b28f-a396b09606af

State: Peer in Cluster (Connected)

  

Hostname: 10.102.23.45

Uuid: 9e3cfb56-1ed4-4daf-9d20-ad4bf2cefb37

State: Peer in Cluster (Connected)

  

Hostname: 10.102.23.4

Uuid: 1836ae9a-eca5-444f-bb9c-20f032247bcb

State: Peer in Cluster (Connected)

在所有節點進行以下磁盤操作:

[root@admin-node ~]# fdisk /dev/sdb

創建卷組:

[root@admin-node ~]# vgcreate vg_data01 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1

[root@admin-node ~]# vgcreate vg_data02 /dev/sdg1 /dev/sdh1 /dev/sdi1 /dev/sdj1 /dev/sdk1

查看卷組:

[root@admin-node ~]# vgdisplay

創建邏輯卷:

[root@admin-node ~]# lvcreate -n lv_data01 -L 9TB vg_data01

[root@admin-node ~]# lvcreate -n lv_data02 -L 9TB vg_data02

查看邏輯卷:

[root@admin-node ~]# lvdisplay

格式化邏輯卷:

[root@admin-node ~]# mkfs.xfs /dev/vg_data01/lv_data01

[root@admin-node ~]# mkfs.xfs /dev/vg_data02/lv_data02

掛載邏輯卷:

[root@admin-node ~]# mkdir -p /data_01/node /data_02/node

[root@admin-node ~]# vim /etc/fstab

/dev/vg_data01/lv_data01 /data_01 xfs defaults 0 0

/dev/vg_data02/lv_data02 /data_02 xfs defaults 0 0

[root@admin-node ~]# mount /data_01

[root@admin-node ~]# mount /data_02

分佈式複製模式(組合型), 最少需要4臺服務器才能創建。

創建卷:

[root@admin-node ~]# gluster volume create data-volume replica 2   10.102.23.4:/data_01/node  10.102.23.44:/data_01/node  10.102.23.44:/data_02/node 10.102.23.45:/data_02/node  10.102.23.45:/data_01/node  10.102.23.4:/data_02/node 10.102.23.46:/data_01/node  10.102.23.47:/data_01/node  10.102.23.46:/data_02/node  10.102.23.47:/data_02/node force

啓動創建的卷:

[root@admin-node ~]# gluster volume start data-volume

volume start: data-volume: success所有機器都可以查看:

[root@admin-node ~]# gluster volume info

圖片

查看分佈式卷的狀態:

[root@admin-node ~]# gluster volume status

圖片

基於以上glusterfs部署,glusterfs分佈式複製卷已經完成

4.nfs-ganesha環境搭建

glusterfs服務本身也是支持nfs掛載,由於現有生產環境存在多個網段,並且有些網段與glusterfs存儲服務器網段是不通,所以需要通過nginx代理nfs來實現nfs掛載。Glusterfs服務只是支持nfs3版本的掛載,在通過nginx代理方面也不是那麼方便,端口繁多,所以glusterfs與NFSs-Ganesha是完美組合。NFSs-Ganesha 通過FSAL(文件系統抽象層)將一個後端存儲抽象成一個統一的API,提供給Ganesha服務端,然後通過NFS協議將其掛載到客戶端。在客戶端上對掛出來的空間進行操作。並且NFSs-Ganesha 可以指定nfs的版本。

在管理節點10.102.23.44上安裝nfs-ganesha,在一開始部署glusterfs已在管理節點上安裝,這裏就不重複說明了,直接簡要說明配置文件

[root@admin-node ~]# vim /etc/ganesha/ganesha.conf

.....................................

EXPORT

{

## Export Id (mandatory, each EXPORT must have a unique Export_Id)

#Export_Id = 12345;

Export_Id = 10;

  

## Exported path (mandatory)

#Path = /nonexistant;

Path = /data01;

  

## Pseudo Path (required for NFSv4 or if mount_path_pseudo = true)

#Pseudo = /nonexistant;

Pseudo = /data01; #客戶端通過nfs掛載的根目錄

  

## Restrict the protocols that may use this export. This cannot allow

## access that is denied in NFS_CORE_PARAM.

#Protocols = 3,4;

Protocols = 4; #客戶端nfs掛載的版本

  

## Access type for clients. Default is None, so some access must be

## given. It can be here, in the EXPORT_DEFAULTS, or in a CLIENT block

#Access_Type = RW;

Access_Type = RW; #權限問題

  

## Whether to squash various users.

#Squash = root_squash;

Squash = No_root_squash; #root降級

  

## Allowed security types for this export

#Sectype = sys,krb5,krb5i,krb5p;

Sectype = sys; #類型

  

## Exporting FSAL

#FSAL {

#Name = VFS;

#}

FSAL {

Name = GLUSTER;

hostname = "10.102.23.44"; #glusterfs管理節點IP

volume = "data-volume"; #glusterfs卷名

}

}

...................

[root@admin-node ~]# systemctl restart nfs-ganesha

[root@admin-node ~]# systemctl enable nfs-ganesha

[root@admin-node ~]# showmount -e 10.102.23.44

Export list for 10.102.23.44: #nfs-ganesha搭建成功

5.客戶端掛載

以glusterfs方式掛載:

[root@admin-node ~]# mkdir /logs

[root@admin-node ~]# mount -t glusterfs 10.102.23.44:data-volume /logs/

圖片

以NFS方式進行掛載:

在客戶端(10.1.99段):

[root@moban-00 ~]#yum -y install nfs-utils rpcbind

[root@moban-00 ~]# systemctl start rpcbind

[root@moban-00 ~]# systemctl enable rpcbind

[root@moban-00 ~]# mkdir /home/dwweiyinwen/logs/

[root@moban-00 ~]# mount -t nfs -o vers=4,proto=tcp,port=2049 10.102.23.44:/data01 /home/dwweiyinwen/logs/

圖片

分佈式存儲的未來

隨着現代社會從工業時代過渡到信息時代,信息技術的發展以及人類生活的智能化帶來數據的爆炸性增長,數據正成爲世界上最有價值的資源(數據無價,且操作且珍惜)。

根據物理存儲形態,數據存儲可分爲集中式存儲與分佈式存儲兩種。集中式存儲以傳統存儲陣列(傳統存儲)爲主,分佈式存儲(雲存儲)以軟件定義存儲爲主。

傳統存儲一向以可靠性高、穩定性好,功能豐富而著稱,但與此同時,傳統存儲也暴露出橫向擴展性差、價格昂貴、數據連通困難等不足,容易形成數據孤島,導致數據中心管理和維護成本居高不下。

分佈式存儲:將數據分散存儲在網絡上的多臺獨立設備上,一般採用標準x86服務器和網絡互聯,並在其上運行相關存儲軟件,系統對外作爲一個整體提供存儲服務。。

總之,分佈式文件存儲,不僅提高了存儲空間的利用率,還實現了彈性擴展,降低了運營成本,避免了資源浪費,更適合未來的數據爆炸時代場景。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章