CentOS 7 上的 GlusterFS 儲存叢集
1. 引言
本文章描述在 CentOS 7 上部署一個高可用性的 ClusterFS 儲存環境的步驟。
除了基本概念,本文意提供以下資訊:
- 安裝 Gluster 架構
- 建立高可用性(複製)GlusterFS 磁區
- 從 Linux/Windows 客戶端連線
- 在不停機情況下延伸 GlusterFS 磁區
參考系統:
# 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. 詞匯
- Gluster 儲存伺服器:擁有存放數據的檔案系統的主機。
- Gluster 儲存客戶端:掛載 ClusterFS 磁區的電腦(也可能是台伺服器)。
- 磚塊:一個內存 XFS 檔案系統,並已隸屬於某 GlusterFS 磁區的分割區。
- GlusterFS 磁區:一系列的磚塊。
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 儲存 SIG 或 Gluster.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 磚塊
如果你的工作環境已經預備了 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 磚塊建立 brick1 及 brick2 邏輯磁區:
# 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 |
在防火牆上開啟所需連接埠。
請謹記,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/RedHat/OracleLinux 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
我們建議重新啟動所有 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
較早前已安裝了 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
現在再次嘗試掛載磁區。
政策將會視乎錯誤訊息而被啟用。
請執行下列指令來修正此 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 ...
每件磚塊必須另一個由 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
請注意在新增磚塊後,磁碟的用量將會不平均。
重新平衡磁區:
請只從其中一台 glusterfs 伺服器啟動重新平衡的程序。
# gluster volume rebalance glustervol1 start
檢查重新平衡的狀況:
# gluster volume rebalance glustervol1 status
重新平衡完成後,請利用上述的 df 指令確定。
視乎 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