[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

CentOS 7 上的 GlusterFS 儲存叢集

1. 引言

本文章描述在 CentOS 7 上部署一個高可用性的 ClusterFS 儲存環境的步驟。

除了基本概念,本文意提供以下資訊:

參考系統:

# hostnamectl
   Static hostname: gluster1.example.com
         Icon name: computer
           Chassis: n/a
        Machine ID: b62adea1c2ca472ab04bccafea769109
           Boot ID: c315fd81d1884de4bbf74209caf41c51
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-229.11.1.el7.x86_64
      Architecture: x86_64

GlusterFS 套件:

# rpm -qa |grep gluster
samba-vfs-glusterfs-4.1.12-23.el7_1.x86_64
glusterfs-server-3.7.3-1.el7.x86_64
glusterfs-libs-3.7.3-1.el7.x86_64
glusterfs-client-xlators-3.7.3-1.el7.x86_64
glusterfs-api-3.7.3-1.el7.x86_64
glusterfs-fuse-3.7.3-1.el7.x86_64
glusterfs-3.7.3-1.el7.x86_64
glusterfs-cli-3.7.3-1.el7.x86_64

2. 詞匯

3. 環境

基本安裝的示範將會在擁有兩個節點的儲存叢集上進行。 The basic installation will be demonstrated on two nodes act as a storage cluster.

伺服器

gluster1.example.com

gluster2.example.com

CentOS 7.1 x64

CentOS 7.1 x64

客戶端

centos7.example.com

win2k8srv.example.com

CentOS 7 x64

Windows Server 2008 x64

SELinux 已在實施模式,而防火牆亦已啟用。

# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

# firewall-cmd --state
running

兩台伺服器都有空置的碟盤連接至 /dev/vdb在此碟盤上,新的邏輯磁區群組(vg_gluster)將會被建立,供 XFS 磚塊用。

檢查可用的分割區:

# cat /proc/partitions
major minor  #blocks  name
 252        0   31457280 vda
 252        1     512000 vda1
 252        2   30944256 vda2
 252       16   31457280 vdb
... 輸出已被刪減 ...

4. 安裝 GlusterFS 伺服器

選用一個套件源:從 CentOS 儲存 SIGGluster.org 選其一

4.1. 選用 CentOS 儲存 SIG 套件

# yum search centos-release-gluster

# yum install centos-release-gluster37
# yum install glusterfs gluster-cli glusterfs-libs glusterfs-server

4.2. 選用 Gluster.org 套件

# yum update -y

gluster.org 下載最新的 glusterfs-epel 軟件庫:

# yum install wget -y

# wget -P /etc/yum.repos.d/ http://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/glusterfs-epel.repo

另外亦從 fedoraproject.org 安裝最新版的 EPEL 軟件庫,以便能滿足所有依賴性:

# yum install http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

預設兩個軟件庫為被啟用的:

# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: repo.bigstepcloud.com
 * epel: epel.check-update.co.uk
 * extras: centos.serverspace.co.uk
 * updates: mirrors.coreix.net
repo id                           repo name                                                                                status
base/7/x86_64                     CentOS-7 - Base                                                                          8,652
epel/x86_64                       Extra Packages for Enterprise Linux 7 - x86_64                                           8,476
extras/7/x86_64                   CentOS-7 - Extras                                                                          180
glusterfs-epel/7/x86_64           GlusterFS is a clustered file-system capable of scaling to several petabytes.               14
glusterfs-noarch-epel/7           GlusterFS is a clustered file-system capable of scaling to several petabytes.                2
updates/7/x86_64                  CentOS-7 - Updates                                                                       1,246
repolist: 18,570

在兩個儲存叢集節點上安裝 GlusterFS 伺服器及 Samba 套件。

# yum install glusterfs-server samba -y

4.3. XFS 磚塊

{i} 如果你的工作環境已經預備了 XFS 磚塊(分割區),你可選擇省略以下步驟。

利用 /dev/vdb 碟盤建立新的實體磁區

# pvcreate /dev/vdb
  Physical volume "/dev/vdb" successfully created

在 /dev/vdb 上建立一個磁區群組

# vgcreate vg_gluster /dev/vdb
  Volume group "vg_gluster" successfully created

在兩個叢集節點上為 XFS 磚塊建立 brick1brick2 邏輯磁區

# lvcreate -L 5G -n brick1 vg_gluster
  Logical volume "brick1" created.

# lvcreate -L 5G -n brick2 vg_gluster
  Logical volume "brick2" created.

設立 XFS 檔案系統:

# mkfs.xfs /dev/vg_gluster/brick1

# mkfs.xfs /dev/vg_gluster/brick2

建立掛載點並掛載 XFS 磚塊:

# mkdir -p /bricks/brick{1,2}

# mount /dev/vg_gluster/brick1 /bricks/brick1

# mount /dev/vg_gluster/brick2 /bricks/brick2

延伸 /etc/fstab

/dev/vg_gluster/brick1  /bricks/brick1    xfs     defaults    0 0
/dev/vg_gluster/brick2  /bricks/brick2    xfs     defaults    0 0

結果: 兩個叢集節點都擁有兩個掛載於 /bricks/brick{1,2} 目錄的 XFS 分割區。

4.4. Trusted Pool(儲存叢集)

在兩個節點啟用並起動 glusterfsd.service:

# systemctl enable glusterd.service
ln -s '/usr/lib/systemd/system/glusterd.service' '/etc/systemd/system/multi-user.target.wants/glusterd.service'

# systemctl start glusterd.service

/!\ GlusterFS 節點之間的溝通必須運用 TCP 埠 24007-24008,另外每件磚塊須要一個由 24009 起分派的 TCP 埠。

在防火牆上啟用所需的連接埠:

# firewall-cmd --zone=public --add-port=24007-24008/tcp --permanent
success

# firewall-cmd --reload
success

利用 gluster 指令連線到第二個 GlusterFS 節點並建立一個 Trusted Pool(儲存叢集)。

# gluster peer probe gluster2.example.com
peer probe: success.

檢查叢集的同輩:

# gluster peer status
Number of Peers: 1
Hostname: gluster2.example.com
Uuid: e528dc23-689c-4306-89cd-1d21a2153057
State: Peer in Cluster (Connected)

/!\ 你無須在第二個節點上執行 gluster peer probe 。

5. 高可用性 GlusterFS 磁區

GlusterFS 磁區是配合 Gluster 檔案系統使用的,它在邏輯上是一組 XFS 磚塊。

以下列表表明磁區類型與大小之間的依賴性:

可選用的 GlusterFS 碟區類型

磁區空間計算方法

分散(最多空間)

1G + 1G = 2G

複製(最高可用性)

1G + 1G = 1G

條紋(大型檔案適用)

1G + 1G = 2G

分散和複製

(1G+1G) + (1G+1G) = 2G

分散和條紋

(1G+1G) + (1G+1G) = 4G

分散、複製和條紋

[(1G+1G)+(1G+1G)] + [(1G+1G)+(1G+1G)] = 4G

在防火牆上開啟所需連接埠。

{i} 請謹記,GlusterFS 磁區內的每件磚塊須要一個由 24009 起分派的 TCP 埠:

# firewall-cmd --zone=public --add-port=24009/tcp --permanent
success

# firewall-cmd --reload
success

利用兩個節點上的 /bricks/brick1 XFS 分割區建立一個可高用性的複製磁區。首先在 /bricks/brick1 建立一個目錄作為掛載點。GlusterFS 需要它。

# mkdir /bricks/brick1/brick

建立一個被複製的 GlusterFS 磁區:

/!\ 這個指令只須在第一個節點 gluster1.example.com 上執行。

# gluster volume create glustervol1 replica 2 transport tcp gluster1.example.com:/bricks/brick1/brick \ 
gluster2.example.com:/bricks/brick1/brick
volume create: glustervol1: success: please start the volume to access data

# gluster volume start glustervol1
volume start: glustervol1: success

檢查 GlusterFS 磁區:

# gluster volume info all
Volume Name: glustervol1
Type: Replicate
Volume ID: 6953a675-f966-4ae5-b458-e210ba8ae463
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: gluster1.example.com:/bricks/brick1/brick
Brick2: gluster2.example.com:/bricks/brick1/brick
Options Reconfigured:
performance.readdir-ahead: on

6. GlusterFS 客戶端

GlusterFS 磁區可以通過 GlusterFS 原生客戶端(CentOS/RedHatOracleLinux 6.5 或更新版本)、NFS v3(其它 Linux 客戶端)、或 CIFS(Windows 客戶端)來存取。

6.1. 為 Glusterfs/NFS/CIFS 客戶端開啟防火牆

# firewall-cmd --zone=public --add-service=nfs --add-service=samba --add-service=samba-client --permanent
success

# firewall-cmd --zone=public --add-port=111/tcp --add-port=139/tcp --add-port=445/tcp --add-port=965/tcp --add-port=2049/tcp \
--add-port=38465-38469/tcp --add-port=631/tcp --add-port=111/udp --add-port=963/udp --add-port=49152-49251/tcp  --permanent
success

# firewall-cmd --reload
success

6.2. 透過 GlusterFS 原生客戶端從另一台 CentOS 7 電腦進行存取

所有需用的套件都已經由 CentOS 7 預設的 Base 軟件庫所提供。

安裝 GlusterFS 客戶端套件:

# yum install glusterfs glusterfs-fuse attr -y

在客戶端掛載 GlusterFS 磁區:

# mount -t glusterfs gluster1.example.com:/glustervol1 /mnt/

/etc/fstab 加入新一行(可選):

gluster1.example.com:/glustervol1       /mnt  glusterfs   defaults,_netdev  0  0

6.3. 透過 NFS 從其它 Linux 電腦進行存取

/!\ GlusterFS NFS 伺服器只支援第 3 版的 NFS 溝通協議。

於兩個節點上的 /etc/nfsmount.conf 檔內加入下列內容:

Defaultvers=3

{i} 我們建議重新啟動所有 glusterfs 節點後再繼續。

透過 NFS 掛載 GlusterFS 磁區:

# mount -t nfs gluster1.example.com:/glustervol1 /mnt/

/etc/fstab 內加入下列內容(可選):

gluster1.example.com:/glustervol1       /mnt  nfs   defaults,_netdev  0  0

6.4. 排除 NFS 的問題

問題:

# mount -t nfs gluster1.example.com:/glustervol1 /mnt/
mount.nfs: Connection timed out

mount 指令失敗是由於 NFS 伺服器並未運行(N/A)。

# gluster volume status
Status of volume: glustervol1
Gluster process                                   TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------------
Brick gluster1.example.com:/bricks/brick1/brick   49152     0          Y       2473
Brick gluster2.example.com:/bricks/brick1/brick   49152     0          Y       1394
NFS Server on localhost                                         N/A       N/A        N       N/A
Self-heal Daemon on localhost                                   N/A       N/A        Y       2562
NFS Server on gluster2.example.com                              2049      0          Y       2531
Self-heal Daemon on gluster2.example.com                        N/A       N/A        Y       2539

解決方法:

在 GlusterFS 伺服器上起動/啟用 rpcbind 服務。

# ps aux| grep rpcbind | grep -v grep

# /sbin/rpcbind -w

重新起動 GlusterFS 磁區:

# gluster volume start glustervol1 force
volume start: glustervol1: success

6.5. 透過 CIFS 從 Linux/Windows 電腦進行存取

在兩個叢集節點上安裝/更新所需套件:

# yum install samba samba-client samba-common samba-vfs-glusterfs selinux-policy-targeted -y

{i} 較早前已安裝了 samba 套件

起動/啟用 Samba 服務。

# systemctl start smb.service
# systemctl enable smb.service
# systemctl start nmb.service
# systemctl enable nmb.service

每當新的 GlusterFS 磁區被建立/起動時,它會自動被加進 Samba 設定檔成為 gluster-<磁區名稱> 檔案共享。

檢查 /etc/samba/smb.conf 內的 GlusterFS 檔案共享

[gluster-glustervol1]
comment = For samba share of volume glustervol1
vfs objects = glusterfs
glusterfs:volume = glustervol1
glusterfs:logfile = /var/log/samba/glusterfs-glustervol1.%M.log
glusterfs:loglevel = 7
path = /
read only = no
guest ok = yes

在 GlusterFS 的 samba 設定內新增一個參數 —— kernel share modes = No

[gluster-glustervol1]
comment = For samba share of volume glustervol1
vfs objects = glusterfs
glusterfs:volume = glustervol1
glusterfs:logfile = /var/log/samba/glusterfs-glustervol1.%M.log
glusterfs:loglevel = 7
path = /
read only = no
guest ok = yes
kernel share modes = No

針對 Samba 設置 glustervol1 GlusterFS 磁區:

# gluster volume set glustervol1 stat-prefetch off
volume set: success

# gluster volume set glustervol1 server.allow-insecure on
volume set: success

# gluster volume set glustervol1 storage.batch-fsync-delay-usec 0
volume set: success

在每個節點的 /etc/glusterfs/glusterd.vol 內加入以下內容:

option rpc-auth-allow-insecure on

重新起動 glusterfs 服務:

# systemctl restart glusterd.service

定義一個新的 samba 用戶:

# adduser sambauser

# smbpasswd -a sambauser
New SMB password:
Retype new SMB password:
Added user sambauser.

設置 SELinux 容讓 Samba 共享 GlusterFS 磁區:

# setsebool -P samba_share_fusefs on
# setsebool -P samba_load_libgfapi on

重新起動 Samba:

# systemctl restart smb.service
# systemctl restart nmb.service

透過 CIFS(Samba)在 Linux 上掛載 GlusterFS 磁區:

# yum install cifs-utils -y

# mount -t cifs \\\\gluster1.example.com\\gluster-glustervol1 /mnt/ -o user=sambauser,pass=mypassword

在 Windows 上掛載 GlusterFS 磁區:

c:\>net use Z: \\gluster1.example.com\gluster-glustervol1 /user:sambauser password
The command completed successfully.

6.6. 排除 SELinux 的問題

問題:

SELinux 在實施模式下拒絕 glusterd 進行掛載。

日誌:

# tail -f /var/log/audit/audit.log

type=AVC msg=audit(1441281548.188:421): avc:  denied  { name_bind } for  pid=2636 comm="smbd" src=65534  
 _fcksavedurl="65534" scontext=system_u:system_r:smbd_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket
...
type=SYSCALL msg=audit(1441281548.188:421): arch=c000003e syscall=49 success=no exit=-13 a0=22 a1=7f3044bd1200 a2=10 a3=6 items=0
ppid=2201 pid=2636 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="smbd" 
exe="/usr/sbin/smbd" subj=system_u:system_r:smbd_t:s0 key=(null)
...
type=AVC msg=audit(1441281548.188:422): avc:  denied  { name_connect } for  pid=2636 comm="smbd" dest=24007
 scontext=system_u:system_r:smbd_t:s0 tcontext=system_u:object_r:gluster_port_t:s0 tclass=tcp_socket
...
type=SYSCALL msg=audit(1441281548.188:422): arch=c000003e syscall=42 success=no exit=-13 a0=22 a1=7f3044bd0d08 a2=10 a3=7f3041473c8c
items=0 ppid=2201 pid=2636 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 
comm="smbd" exe="/usr/sbin/smbd" subj=system_u:system_r:smbd_t:s0 key=(null)

解決方法:

# yum install policycoreutils-python -y

# setenforce 0

# load_policy

現在再次嘗試掛載磁區。

{i} 政策將會視乎錯誤訊息而被啟用。

請執行下列指令來修正此 SELinux 問題:

# audit2allow -M glusterd_centos64 -l -i /var/log/audit/audit.log
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i glusterd_centos64.pp

# setenforce 1

# semodule -i glusterd_centos64.pp

參考: http://blog.gluster.org/category/selinux/

7. 在不停機情況下延伸 GlusterFS 磁區

延伸一個被複製或分散的條紋磁區的時候,你必須加入與複製或條紋數量成倍數的磚塊。舉個例說,要延伸一個分散和被複製 2 次的磁區,新增的磚塊數量必須是 2 的倍數。

延伸前的磁區參數:

# gluster volume info all
Volume Name: glustervol1
Type: Replicate
Volume ID: 6953a675-f966-4ae5-b458-e210ba8ae463
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: gluster1.example.com:/bricks/brick1/brick
Brick2: gluster2.example.com:/bricks/brick1/brick
... output omitted ...

{i} 每件磚塊必須另一個由 24009 數起的 TCP 埠,因此等二件磚塊將會採用 tcp/24010。

為新的磚塊開啟防火牆:

# firewall-cmd --zone=public --add-port=24010/tcp --permanent
success

# firewall-cmd --reload
success

延伸 glustervol1 磁區時,請利用餘下的兩件 XFS 磚塊 —— 它們在早前的 XFS 磚塊 部份已被建立。

# mount |grep brick2
/dev/mapper/vg_gluster-brick2 on /bricks/brick2 type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

/bricks/brick2 內建立所需的目錄。

# mkdir /bricks/brick2/brick 

在不停機情況下延伸 GlusterFS 磁區:

# gluster volume add-brick glustervol1 gluster1.example.com:/bricks/brick2/brick gluster2.example.com:/bricks/brick2/brick
volume add-brick: success

檢驗磁區:

# gluster volume info glustervol1
Volume Name: glustervol1
Type: Distributed-Replicate
Volume ID: 6953a675-f966-4ae5-b458-e210ba8ae463
Status: Started
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: gluster1.example.com:/bricks/brick1/brick
Brick2: gluster2.example.com:/bricks/brick1/brick
Brick3: gluster1.example.com:/bricks/brick2/brick
Brick4: gluster2.example.com:/bricks/brick2/brick

現在磁區已經延伸至另外兩件磚塊上,並成為 分散、複製 型。

磁區分佈不平衡:

利用 df 檢查 glusterfs 伺服器的磁碟用量:

# df -h | grep brick

{i} 請注意在新增磚塊後,磁碟的用量將會不平均。

重新平衡磁區:

{i} 請只從其中一台 glusterfs 伺服器啟動重新平衡的程序。

# gluster volume rebalance glustervol1 start

檢查重新平衡的狀況:

# gluster volume rebalance glustervol1 status

重新平衡完成後,請利用上述的 df 指令確定。

{i} 視乎 glusterfs 設置的模式,檔案應會被分佈至不同節點。

檢查磚塊上的檔案:

# ls -l /bricks/brick*/brick/

8. 排除問題

8.1. 已屬於磁區

volume create: glustervol2: failed: /bricks/brick3/brick is already part of a volume

/!\ 請小心執行!

請確定磚塊不屬於任何磁區。如果它未被採用,你可以透過 清除檔案的延伸屬性 令它適用於 gluster 磁區。

# setfattr -x trusted.glusterfs.volume-id /bricks/brick3/brick
# setfattr -x trusted.gfid /bricks/brick3/brick
# rm -rf /bricks/brick3/brick/.glusterfs

8.2. Peer in Cluster 狀況

volume create: glustervol2: failed: Staging failed on gluster3.example.com.
Error: Host gluster3.example.com is not in ' Peer in Cluster' state

請確保 /etc/hosts 或 DNS 擁有該主機(例:gluster3.example.com)的記錄。

請檢查「出問題的主機」的記錄已定義在所有 glusterfs 叢集節點(連同該主機)的 /etc/hosts 檔案內。

9. 作者

原作者:ZoltanPorkolab

貢獻者:MichaelBear

Translation of revision 13


2023-09-11 07:23