【背景需求】當前項目內部使用的文件系統有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服務器和網絡互聯,並在其上運行相關存儲軟件,系統對外作爲一個整體提供存儲服務。。
總之,分佈式文件存儲,不僅提高了存儲空間的利用率,還實現了彈性擴展,降低了運營成本,避免了資源浪費,更適合未來的數據爆炸時代場景。