Gluster的搭建和使用
Gluster的搭建和使用
序言
我們為什么要去使用分布式存儲,在一家大型公司或者大規模的集群中,大家可能會經常遇到一個問題,我的數據怎么存放,放在那,數據空間不夠了怎么辦,這些問題經常困擾著我們。
筆者是在電信的一個部門工作的,我們的環境比較復雜。環境有NAS,各種NFS,還有為了高可用搭建的HA上面跑的共享目錄,每次我們遇到的一個最大的問題就是,哪哪哪的空間不夠了,我們需要遷移數據,這個已經成為了日常工作中的一個限制,很難受,尤其是公司目前還沒有分布式存儲。
在這個環境下,為了解決繁瑣的勞動,打算研究一下。目前的話,打算考慮的就兩個方向,一個是CEPH,一個Gluster。但是在之前的調研中,CEPH手頭的資料比較少,另外可能是筆者比較笨,沒有看懂,目前只更新Gluster的用法,后續會去研究CEPH。
時間:
2018年5月28日
?
搭建
1,環境搭建:
最少兩臺Centos7的機器,也可以選擇其他機器。如果搭建分布條帶復制卷的話,最好是4臺機器為基礎(注意:擴容的時候必須以搭建的基數來擴建)
| 服務器 | IP | 主機名 | 系統 |
| 1 | 10.251.26.193 | gluster_test1 | Centos7.3 |
| 2 | 10.251.26.194 | gluster_test2 | Centos7.3 |
| 3 | 10.251.26.195 | gluster_test3 | Centos7.3 |
?
2,主機名設置
(因為Gluster可以根據主機名來訪問,這里最好設置一下。如果是根據IP來訪問,那這就沒有必要了),設置環境需要相同
vi ?/etc/hosts
10.251.26.193 ?gluster_test1
10.251.26.194 ?gluster_test2
10.251.26.195 ?gluster_test3
3,時鐘同步
搭建的時候時間必須要同步好,時間有誤差,集群的通信也可能會有問題。
ntpdate ???時鐘服務器
?
4,安裝Gluster倉庫
yum?install?centos-release-gluster?-y
5,格式化和掛載Brick
Brick:GFS中的存儲單元,通過是一個受信存儲池中的服務器的一個導出目錄。可以通過主機名和目錄名來標識,如'SERVER:EXPORT'
mkfs.xfs ???-i ??size=512 ??/dev/sdb
mkdir ??-p ??/gluster/test1
在/etc/fstab中添加如下
/dev/sdb ??????/gluster/test1 ?????xfs ????defaults ???????0 0
然后進行掛載
mount ??-a
6,安裝GlusterFS
yum --enablerepo=centos-gluster*-test install glusterfs-server
7,添加開機啟動并啟動服務
systemctl enable glusterd
systemctl start glusterd
配置
安裝完成后GlusterFS之后,需要配置,配置之前最好ping下自己的主機名。
1,配置trusted ?pool
Gluster ??peer ??probe ??主機IP
對于一臺服務器來說,只需要添加其他的server就好了。
2,查看集群的狀態
gluster ????peer ???status
3,配置glusterFS卷
比如說你要創建一個fbtdfz共享卷
(mkdir ??/gluster/test1/fbtdfz,前面的是咱們已經建立好的,后面的是輸出目錄,但是我在實際環境中可以直接創建一條命令)
?gluster volume create fbtdfz ?stripe 2 replica 2 10.251.26.193:/gluster/test4/fbtdfz ?10.251.26.194:/gluster/test3/fbtdfz 10.251.26.193:/gluster/test5/fbtdfz 10.251.26.194:/gluster/test4/fbtdfz
4,啟動共享卷
gluster ????volume ??start ????fbtdfz
5,查看共享卷狀態
gluster ????volume ????info ????
6,掛載卷
注意,掛載卷的時候需要安裝gluster客戶端
mount ??-t ?glusterfs ??IP:/共享目錄 ?????/mnt
?
原理
一、分布式文件系統
分布式文件系統(Distributed File System)是指文件系統管理的物理存儲資源并不直接與本地節點相連,而是分布于計算網絡中的一個或者多個節點的計算機上。目前意義上的分布式文件系統大多都是由多個節點計算機構成,結構上是典型的客戶機/服務器模式。流行的模式是當客戶機需要存儲數據時,服務器指引其將數據分散的存儲到多個存儲節點上,以提供更快的速度,更大的容量及更好的冗余特性。
目前流行的分布式文件系統有許多,如MooseFS、OpenAFS、GoogleFS,具體實現原理我這里不再介紹。
二、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算法寫入各個節點的硬盤上,優點是容量大,缺點是沒冗余。
?
Gluster?volume?create?test-volume?server1:/exp1?server2:/exp2?server3:/exp3?server4:/exp4
2、復制卷(Replicated Volume)
相當于raid1,復制的份數,決定集群的大小,通常與分布式卷或者條帶卷組合使用,解決前兩種存儲卷的冗余缺陷。缺點是磁盤利用率低。
復本卷在創建時可指定復本的數量,通常為2或者3,復本在存儲時會在卷的不同brick上,因此有幾個復本就必須提供至少多個brick,當其中一臺服務器失效后,可以從另一臺服務器讀取數據,因此復制GlusterFS卷提高了數據可靠性的同事,還提供了數據冗余的功能。
?
Gluster?volume?create?test-volume?replica?2?transport?tcp?server1:/exp1?server2:/exp2
3、分布式復制卷(Distributed Replicated?Volume)
分布式復制GlusterFS卷結合了分布式和復制Gluster卷的特點,看起來類似RAID10,但其實不同,RAID10其實質是條帶化,但分布式復制GlusterFS卷則沒有。
?
gluster?volume?create?test-volume?replica?2?transport?tcp?server1:/exp1?server2:/exp2?server3:/exp3?server4:/exp4
4、條帶卷(Striped Volume)
相當于raid0,文件是分片均勻寫在各個節點的硬盤上的,優點是分布式讀寫,性能整體較好。缺點是沒冗余,分片隨機讀寫可能會導致硬盤IOPS飽和。
?
gluster?volume?create?test-volume?stripe?2?transport?tcp?server1:/exp1?server2:/exp2
5、分布式條帶卷(Distributed?Striped?Volume)
當單個文件的體型十分巨大,客戶端數量更多時,條帶卷已經無法滿足需求,此時將分布式與條帶化結合起來是一個比較好的選擇。其性能與服務器數量有關。
?
gluster?volume?create?test-volume?stripe?4?transport?tcp?server1:/exp1?server2:/exp2?server3:/exp3?server4:/exp4?server5:/exp5?server6:/exp6?server7:/exp7?server8:/exp8
?
故障恢復
4.1 硬盤故障
如果底層做了 RAID 配置,有硬件故障,直接更換硬盤,會自動同步數據。
如果沒有做 RAID,處理方法如下:
正常節點上執行?gluster volume status,記錄故障節點 uuid
執行:getfattr -d -m ‘.*’ /brick 記錄 trusted.gluster.volume-id 及 trusted.gfid
以下為故障模擬及修復過程:
在 VMware Workstation 上移除 mystorage1 主機的第三塊硬盤(對應 sdc /storage/brick2),相當于硬盤故障
?
# 系統提示如下:
Message from syslogd@linux-node01 at Jul 30 08:41:46 ...
?storage-brick2[5893]: [2016-07-30 00:41:46.729896] M [MSGID: 113075] [posix-helpers.c:1844:posix_health_check_thread_proc] 0-gv2-posix: health-check failed, going down
?
Message from syslogd@linux-node01 at Jul 30 08:42:16 ...
?storage-brick2[5893]: [2016-07-30 00:42:16.730518] M [MSGID: 113075] [posix-helpers.c:1850:posix_health_check_thread_proc] 0-gv2-posix: still alive! -> SIGTERM
?
?# 查看卷狀態,mystorage1:/storage/brick2 不在線了,不過這是分布式復制卷,還可以訪問另外 brick 上的數據
[root@mystorage1 ~]# gluster volume status gv2
Status of volume: gv2
Gluster process ????????????????????????????TCP Port ?RDMA Port ?Online ?Pid
------------------------------------------------------------------------------
Brick mystorage1:/storage/brick2 ???????????N/A ??????N/A ???????N ??????N/A
?
?
?
?
在 VMware Workstation 上新增 mystorage1 一塊硬盤,相當于更換了新硬盤,下面先格式掛載新硬盤:
?
?
?
?
# mkfs.xfs -f /dev/sdc
# mkdir -p /storage/brick2
# mount -a
# df -h
?
# 新硬盤掛載后目錄為空
[root@mystorage1 ~]# ll /storage/brick2
total 0
?
?
開始手動配置新增硬盤的 gluster 參數
?
?
# 在 mystorage2 是獲取 glusterfs 相關參數:
[root@mystorage2 tmp]# getfattr -d -m '.*' ?/storage/brick2
getfattr: Removing leading '/' from absolute path names
# file: storage/brick2
trusted.gfid=0sAAAAAAAAAAAAAAAAAAAAAQ==
trusted.glusterfs.dht=0sAAAAAQAAAAAAAAAAfg==
trusted.glusterfs.dht.commithash="3168624641"
trusted.glusterfs.quota.dirty=0sMAA=
trusted.glusterfs.quota.size.1=0sAAAAAATiAAAAAAAAAAAAAwAAAAAAAAAE
trusted.glusterfs.volume-id=0sEZKGliY6THqhVVEVrykiHw==
?
# 在 mystorage1 上執行配置 glusterfs 參數和上述一樣
?
setfattr -n trusted.gfid -v 0sAAAAAAAAAAAAAAAAAAAAAQ== /storage/brick2
setfattr -n trusted.glusterfs.dht -v 0sAAAAAQAAAAAAAAAAfg== /storage/brick2
setfattr -n trusted.glusterfs.dht.commithash -v "3168624641" /storage/brick2
setfattr -n trusted.glusterfs.quota.dirty -v 0sMAA= /storage/brick2
setfattr -n trusted.glusterfs.quota.size.1 -v 0sAAAAAATiAAAAAAAAAAAAAwAAAAAAAAAE /storage/brick2
setfattr -n trusted.glusterfs.volume-id -v 0sEZKGliY6THqhVVEVrykiHw== /storage/brick2
?
[root@mystorage1 ~]# /etc/init.d/glusterd restart
Starting glusterd: ????????????????????????????????????????[ ?OK ?]
?
?
[root@mystorage1 ~]# gluster volume heal gv2 info
Brick mystorage1:/storage/brick2
Status: Connected
Number of entries: 0
?
Brick mystorage2:/storage/brick2
/data
Status: Connected
Number of entries: 1 ???????# 顯示一個條目在修復,自動修復完成后會為 0
?
Brick mystorage3:/storage/brick1
Status: Connected
Number of entries: 0
?
Brick mystorage4:/storage/brick1
Status: Connected
Number of entries: 0
?
# 自動修復同步完成后,查看新硬盤的數據同步過來了
[root@mystorage1 ~]# ll /storage/brick2
total 40012
-rw-r--r-- 2 root root 20480000 Jul 30 02:41 20M.file
-rw-r--r-- 2 root root 20480000 Jul 30 03:13 20M.file1
drwxr-xr-x 2 root root ??????21 Jul 30 09:14 data
?
4.2 一臺主機故障
一臺節點故障的情況包含以下情況:
- 物理故障
- 同時有多塊硬盤故障,造成數據丟失
- 系統損壞不可修復
解決方法:
找一臺完全一樣的機器,至少要保證硬盤數量和大小一致,安裝系統,配置和故障機同樣的 IP,安裝 gluster 軟件,
保證配置一樣,在其他健康節點上執行命令?gluster peer status,查看故障服務器的 uuid
[root@mystorage2 ~]# gluster peer status
Number of Peers: 3
Hostname: mystorage3
Uuid: 36e4c45c-466f-47b0-b829-dcd4a69ca2e7
State: Peer in?Cluster (Connected)
Hostname: mystorage4
Uuid: c607f6c2-bdcb-4768-bc82-4bc2243b1b7a
State: Peer in?Cluster (Connected)
Hostname: mystorage1
Uuid: 6e6a84af-ac7a-44eb-85c9-50f1f46acef1
State: Peer in?Cluster (Disconnected)
?
修改新加機器的 /var/lib/glusterd/glusterd.info 和 故障機器一樣
?
[root@mystorage1 ~]# cat /var/lib/glusterd/glusterd.info
UUID=6e6a84af-ac7a-44eb-85c9-50f1f46acef1
operating-version=30712
?
在信任存儲池中任意節點執行
?
# gluster volume heal gv2 full
?
就會自動開始同步,但在同步的時候會影響整個系統的性能。
可以查看狀態
?
# gluster volume heal gv2 info
?
4.3?部分硬盤故障
上面兩種辦法是在網上借鑒的,但是在實際的恢復過程中,第一種恢復硬盤的方式是不成功的,所以就利用了另外一種方法:
模擬的是一塊盤壞了新換了一塊盤上去:
替換步驟:
先把壞了那個那個brick移除掉
gluster volume remove-brick fuzhi replica 1 server1:/data/fuzhi_b1??force
fuzhi:這里指的是壞了的那個卷組名
replica:1 ???這里代指的是還剩下一個備份
server1:/data/fuzhi????這是壞了的那個卷組
force ??:暫時不清楚含義
?
?
然后再把新得brick加進去
?gluster volume add-brickfuzhi?replica 2?server3:/data/fuzhi_b3force
注意現在這個replica后面跟的數量一定是大于1的
?
?
?
最后執行節點健康數據檢查,恢復數據:
gluster volume heal fuzhi
Fuzhi:這里是要恢復的名字
?
?
?
Gluster常用命令
gluster peer?
幫助 gluster volume create help
本次把sdb1掛在到了/date/下
卷的類型
哈希卷 gluster volume create haxi server1:/data/haxi_b1 server2:/data/haxi_b2 force
復制卷? gluster volume create fuzhi replica 2 server1:/data/fuzhi_b1 server2:/data/fuzhi_b2
條帶卷 gluster volume create tiaodai stripe 2 server1:/data/tiaodai_b1 server2:/data/tiaodai_b2
哈希條帶復制卷 ?gluster volume create hxfz server1:/data/hxfz_b1 server2:/data/hxfz_b1 server1:/data/hxfz_b2 server2:/data/hxfz_b2 force
增加節點
gluster peer probe ip/主機名
刪除節點
gluster peer detach ip/主機名
查看節點狀態
gluster peer status
為哈希卷擴容
gluste volume add-brick ?卷的名字 ? servername:/brick的位置
為哈希卷縮小空間
gluster volume remove-brick 卷的名字 servername:/brik的位置 start
gluster volume remove-brick 卷的名字 servername:/brick的位置 commit -->此時會丟失數據
為復制卷擴容
gluster volume add=brick 卷的名字 replica 2 servername:/brick的位置 ?servername:/brick的位置 start
為復制卷縮小空間
gluster volume remove-brick 卷的名字 replica 2 servername:/brick的位置 servername:/brick的位置 start
gluster volume remove-brick 卷的名字 servername:/brick的位置 ?servername:/brick的位置 commit
?
負載均衡
命令格式
volume rebalance 卷的名字 fix-layout start
數據監控檢測以及修復
gluster volume heal 卷的名稱
磁盤配額
gluster volume quota 卷的名字 limit-usage 路徑 限額大小
?
轉載于:https://www.cnblogs.com/sexiaoshuai/p/9100968.html
總結
以上是生活随笔為你收集整理的Gluster的搭建和使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于Orangpi Zero和Linux
- 下一篇: SQLMAP使用笔记