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