Gluster的搭建和使用node
咱們爲何要去使用分佈式存儲,在一家大型公司或者大規模的集羣中,你們可能會常常遇到一個問題,個人數據怎麼存放,放在那,數據空間不夠了怎麼辦,這些問題常常困擾着咱們。linux
筆者是在電信的一個部門工做的,咱們的環境比較複雜。環境有NAS,各類NFS,還有爲了高可用搭建的HA上面跑的共享目錄,每次咱們遇到的一個最大的問題就是,哪哪哪的空間不夠了,咱們須要遷移數據,這個已經成爲了平常工做中的一個限制,很難受,尤爲是公司目前尚未分佈式存儲。算法
在這個環境下,爲了解決繁瑣的勞動,打算研究一下。目前的話,打算考慮的就兩個方向,一個是CEPH,一個Gluster。可是在以前的調研中,CEPH手頭的資料比較少,另外多是筆者比較笨,沒有看懂,目前只更新Gluster的用法,後續會去研究CEPH。centos
時間:服務器
2018年5月28日網絡
1,環境搭建:負載均衡
最少兩臺Centos7的機器,也能夠選擇其餘機器。若是搭建分佈條帶複製卷的話,最好是4臺機器爲基礎(注意:擴容的時候必須以搭建的基數來擴建)tcp
服務器分佈式 |
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
1、分佈式文件系統
分佈式文件系統(Distributed File System)是指文件系統管理的物理存儲資源並不直接與本地節點相連,而是分佈於計算網絡中的一個或者多個節點的計算機上。目前意義上的分佈式文件系統大多都是由多個節點計算機構成,結構上是典型的客戶機/服務器模式。流行的模式是當客戶機須要存儲數據時,服務器指引其將數據分散的存儲到多個存儲節點上,以提供更快的速度,更大的容量及更好的冗餘特性。
目前流行的分佈式文件系統有許多,如MooseFS、OpenAFS、GoogleFS,具體實現原理我這裏再也不介紹。
2、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上。
3、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
若是底層作了 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=0sAAAAAQAAAAAAAAAAf////g==
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 0sAAAAAQAAAAAAAAAAf////g== /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
一臺節點故障的狀況包含如下狀況:
解決方法:
找一臺徹底同樣的機器,至少要保證硬盤數量和大小一致,安裝系統,配置和故障機一樣的 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
上面兩種辦法是在網上借鑑的,可是在實際的恢復過程當中,第一種恢復硬盤的方式是不成功的,因此就利用了另一種方法:
模擬的是一塊盤壞了新換了一塊盤上去:
替換步驟:
先把壞了那個那個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 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 路徑 限額大小