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 11

zh/HowTos/GlusterFSonCentOS (last edited 2017-02-07 11:06:59 by TimothyLee)