Gluster的搭建和使用

Gluster的搭建和使用node

序言

咱們爲何要去使用分佈式存儲,在一家大型公司或者大規模的集羣中,你們可能會常常遇到一個問題,個人數據怎麼存放,放在那,數據空間不夠了怎麼辦,這些問題常常困擾着咱們。linux

筆者是在電信的一個部門工做的,咱們的環境比較複雜。環境有NAS,各類NFS,還有爲了高可用搭建的HA上面跑的共享目錄,每次咱們遇到的一個最大的問題就是,哪哪哪的空間不夠了,咱們須要遷移數據,這個已經成爲了平常工做中的一個限制,很難受,尤爲是公司目前尚未分佈式存儲。算法

在這個環境下,爲了解決繁瑣的勞動,打算研究一下。目前的話,打算考慮的就兩個方向,一個是CEPH,一個Gluster。可是在以前的調研中,CEPH手頭的資料比較少,另外多是筆者比較笨,沒有看懂,目前只更新Gluster的用法,後續會去研究CEPHcentos

時間:服務器

2018528網絡

 

搭建

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)是指文件系統管理的物理存儲資源並不直接與本地節點相連,而是分佈於計算網絡中的一個或者多個節點的計算機上。目前意義上的分佈式文件系統大多都是由多個節點計算機構成,結構上是典型的客戶機/服務器模式。流行的模式是當客戶機須要存儲數據時,服務器指引其將數據分散的存儲到多個存儲節點上,以提供更快的速度,更大的容量及更好的冗餘特性。

目前流行的分佈式文件系統有許多,如MooseFSOpenAFSGoogleFS,具體實現原理我這裏再也不介紹。

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

 

故障恢復

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=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

 

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:這裏指的是壞了的那個卷組名

replica1    這裏代指的是還剩下一個備份

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 路徑 限額大小

相關文章
相關標籤/搜索