如何在Linux(RHEL/CentOS 7)上使用群集设置GFS2
在开始在Red Hat或者CentOS集群上安装GFS2文件系统之前,我们必须熟悉:
什么是集群,它的体系结构和类型是什么?
什么是群集资源和约束?
如何设置Red Hat或者CentOS 7集群?
如果集群中只有两个节点,则需要执行一些添加步骤来设置两个节点集群。
如果要求是共享基于ext4或者xfs的文件系统,则还可以在没有GFS2文件系统的群集之间共享LVM。
GFS2文件系统需要共享存储,因此如果不可用,则必须在RHEL或者CentOS Linux计算机上使用iscsi目标(targetcli)手动创建共享存储。
我将使用安装在Linux服务器上的Oracle VirtualBox进行本文的演示,并在Windows 10便携式计算机上运行。
在本文中,我们将创建多个集群资源,并使用约束条件对资源启动顺序进行排序。
因为这些资源以预定义的顺序启动非常重要,否则它们将无法启动。
因此,让我们从在Red Hat或者CentOS 7 Cluster上配置GFS2文件系统的步骤开始。
为什么我们需要集群文件系统?
在某些情况下,使用支持群集的文件系统是有意义的。
支持群集的文件系统的目的是允许多个节点同时写入文件系统。
SUSE Linux Enterprise Server上默认的支持群集的文件系统是OCFS2,在Red Hat上,它是全局文件系统(GFS)2.
文件系统通过在具有立即运行的文件系统资源的节点之间同步缓存来完成此操作,这意味着每个节点始终具有与文件系统上正在发生的事情完全相同的实际状态。
通常,在活动/活动方案中需要它们,在该方案中,同一资源的多个实例在多个节点上运行并且都处于活动状态。
如果我们只想同时运行一个资源实例,则不必创建集群文件系统。
使用集群文件系统有什么缺点吗?
除了优点之外,使用群集文件系统也有缺点。
最重要的缺点是必须在所有涉及的节点之间同步缓存。
在许多情况下,尤其是那些涉及大量元数据操作的情况,这会使群集文件系统比独立文件系统慢。
由于它们还提供了节点之间的更强耦合,因此群集很难防止故障扩散。
通常认为,与本地节点文件系统相比,群集文件系统在故障转移时间上具有优势,因为它已经安装了。
但是,这是不正确的。
文件系统仍会暂停,直到对发生故障的节点执行隔离/STONITH和日志恢复为止。
这将冻结所有节点上的集群文件系统。
它实际上是一组独立的本地文件系统,可提供更高的可用性!群集文件系统应在需要时使用,但必须经过仔细计划。
设置GFS2文件系统的准备工作
在开始使用GFS2文件系统之前,以下是对群集的强制性要求
CLVM
(集群逻辑卷管理器)DLM
(分布式锁管理器)
重要的是,群集设置必须配置有fencing/STONITH。
我们在集群上的此处启用了防护。
我们可以使用pcs属性集stonith-enabled = true启用它
[root@node1 ~]# pcs property show Cluster Properties: cluster-infrastructure: corosync cluster-name: mycluster dc-version: 1.1.18-11.el7_5.3-2b07d5c5a9 have-watchdog: false last-lrm-refresh: 1546059766 no-quorum-policy: freeze stonith-enabled: true
在下面我们可以看到群集状态,这里我配置了三个防护设备
[root@node1 ~]# pcs status Cluster name: mycluster Stack: corosync Current DC: node1.example.com (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum Last updated: Sat Dec 29 10:33:16 2016 Last change: Sat Dec 29 10:33:01 2016 by root via cibadmin on node1.example.com 3 nodes configured 3 resources configured Online: [ node1.example.com node2.example.com node3.example.com ] Full list of resources: fence-vm1 (stonith:fence_xvm): Started node2.example.com fence-vm2 (stonith:fence_xvm): Started node1.example.com fence-vm3 (stonith:fence_xvm): Started node3.example.com Daemon Status: corosync: active/enabled pacemaker: active/enabled pcsd: active/enabled
[root@node1 ~]# pcs stonith show fence-vm1 (stonith:fence_xvm): Started node2.example.com fence-vm2 (stonith:fence_xvm): Started node2.example.com fence-vm3 (stonith:fence_xvm): Started node2.example.com
如果尚未安装gfs2-utils,lvm2-cluster,dlm,请在所有群集节点上安装
说明:
在RHEL系统上,我们必须具有RHN的有效订阅,或者我们可以配置本地脱机存储库,通过该本地脱机存储库,yum
软件包管理器可以安装提供的rpm及其依赖项。
# yum -y install gfs2-utils lvm2-cluster dlm
将pcs属性更改为no-quorum-policy冻结。
此属性是必需的,因为它意味着群集节点在失去仲裁后将不执行任何操作,而这对于GFS2是必需的
# pcs property set no-quorum-policy=freeze
如果我们将默认设置保留为stop,则已挂载的GFS2文件系统将无法使用群集正确停止,这将导致整个群集被隔离。
配置DLM资源
"分布式块管理器"(也称为"受控")是集群的必需部分。
如果启动后它在监视器测试中失败,则需要对失败的节点进行防护,以保持群集的清洁。
这对于确保不会发生与设置为"冻结"的no-quorum
政策相关的坏事情是必要的。
注意:与GFS2文件系统本身一样,必须在所有需要访问文件系统的节点上启动这些资源。
Pacemaker为此提供了克隆资源。
克隆手段可以应用于必须同时在多个节点上激活的任何资源。
[root@node1 ~]# pcs resource create dlm ocf:pacemaker:controld op monitor interval=30s on-fail=fence clone interleave=true ordered=true
检查电脑集群状态
[root@node1 ~]# pcs status Cluster name: mycluster Stack: corosync Current DC: node1.example.com (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum Last updated: Sat Dec 29 10:57:58 2016 Last change: Sat Dec 29 10:57:52 2016 by root via cibadmin on node1.example.com 3 nodes configured 6 resources configured Online: [ node1.example.com node2.example.com node3.example.com ] Full list of resources: Clone Set: dlm-clone [dlm] Started: [ node1.example.com node2.example.com node3.example.com ] fence-vm1 (stonith:fence_xvm): Started node2.example.com fence-vm2 (stonith:fence_xvm): Started node2.example.com fence-vm3 (stonith:fence_xvm): Started node2.example.com Daemon Status: corosync: active/enabled pacemaker: active/enabled pcsd: active/enabled
因此,我们的dlm
和dlm-clone
资源已在所有集群节点上正确启动。
配置CLVMD资源
如果群集的多个节点需要同时对活动/活动系统中的LVM卷进行读/写访问,则必须使用CLVMD。
CLVMD提供了一个用于同时跨集群节点协调LVM卷的激活和更改的系统。
当群集的各个节点与卷交互并更改其布局时,CLVMD的群集锁定服务可为LVM元数据提供保护。
要启用集群锁,请在" lvm.conf"中设置" locking_type = 3"。
[root@node1 ~]# grep locking_type /etc/lvm/lvm.conf | egrep -v '#' locking_type = 3
重要提示:这就是halvm
和clvm
不兼容的原因,因为HALVM要求locking_type
为1
,而CLVMD要求
locking_type
为3
我们可以使用以下命令动态更改此设置
# lvmconf --enable-cluster
禁用并停止lvm2-lvmetad
服务
# systemctl disable lvm2-lvmetad --now
接下来创建clvmd
资源
[root@node1 ~]# pcs resource create clvmd ocf:heartbeat:clvm op monitor interval=30s on-fail=fence clone interleave=true ordered=true
验证资源状态
[root@node1 ~]# pcs status Cluster name: mycluster Stack: corosync Current DC: node1.example.com (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum Last updated: Sat Dec 29 10:57:58 2016 Last change: Sat Dec 29 10:57:52 2016 by root via cibadmin on node1.example.com 3 nodes configured 9 resources configured Online: [ node1.example.com node2.example.com node3.example.com ] Full list of resources: Clone Set: dlm-clone [dlm] Started: [ node1.example.com node2.example.com node3.example.com ] Clone Set: clvmd-clone [clvmd] Started: [ node1.example.com node2.example.com node3.example.com ] fence-vm1 (stonith:fence_xvm): Started node2.example.com fence-vm2 (stonith:fence_xvm): Started node2.example.com fence-vm3 (stonith:fence_xvm): Started node2.example.com Daemon Status: corosync: active/enabled pacemaker: active/enabled pcsd: active/enabled
更改资源启动顺序
现在我们也需要托管约束。
这种共置约束,确保clvmd
克隆始终与dlm
克隆保持在一起。
[root@node1 ~]# pcs constraint order start dlm-clone then clvmd-clone Adding dlm-clone clvmd-clone (kind: Mandatory) (Options: first-action=start then-action=start)
[root@node1 ~]# pcs constraint colocation add clvmd-clone with dlm-clone
在群集节点上设置共享存储
在上一篇文章中,我在所有群集节点上都使用了iscsi target,它将用于设置群集文件系统(GFS2)。
因此,连接到我的存储节点后,所有群集节点上都有/dev/sdc
可用。
[root@node2 ~]# ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 Dec 29 09:47 /dev/sda brw-rw---- 1 root disk 8, 1 Dec 29 09:47 /dev/sda1 brw-rw---- 1 root disk 8, 2 Dec 29 09:47 /dev/sda2 brw-rw---- 1 root disk 8, 16 Dec 29 09:47 /dev/sdb brw-rw---- 1 root disk 8, 17 Dec 29 09:47 /dev/sdb1 brw-rw---- 1 root disk 8, 32 Dec 29 10:30 /dev/sdc
我将在我的一个集群节点上的"/dev/sdc"上设置逻辑卷。
相同的配置将自动同步到所有其他群集节点
[root@node1 ~]# pvcreate /dev/sdc Physical volume "/dev/sdc" successfully created.
[root@node1 ~]# vgcreate -Ay -cy --shared vgclvm /dev/sdc Clustered volume group "vgclvm" successfully created
这里
-A | --autobackup y | n
:指定更改后是否应自动备份元数据。-c | --clustered y | n
:如果LVM是在集群支持下编译的,则使用clvmd
创建集群VG。
这允许多个主机在共享设备上共享VG。clvmd
和锁管理器必须已配置并正在运行。
显示可用的卷组
[root@node1 ~]# vgs VG #PV #LV #SN Attr VSize VFree centos 2 2 0 wz--n- <17.52g 1020.00m vgclvm 1 0 0 wz--nc 992.00m 992.00m
使用我们的共享卷组创建新的逻辑卷
[root@node1 ~]# lvcreate -l 100%FREE -n lvcluster vgclvm Logical volume "lvcluster" created.
在逻辑卷上创建一个" GFS2"文件系统。
[root@node1 ~]# mkfs.gfs2 -j3 -p lock_dlm -t mycluster:gfs2fs /dev/vgclvm/lvcluster /dev/vgclvm/lvcluster is a symbolic link to /dev/dm-2 This will destroy any data on /dev/dm-2 Are you sure you want to proceed? [y/n] y Discarding device contents (Jan take a while on large devices): Done Adding journals: Done Building resource groups: Done Creating quota file: Done Writing superblock and syncing: Done Device: /dev/vgclvm/lvcluster Block size: 4096 Device size: 0.97 GB (253952 blocks) Filesystem size: 0.97 GB (253951 blocks) Journals: 3 Journal size: 8MB Resource groups: 7 Locking protocol: "lock_dlm" Lock table: "mycluster:gfs2fs" UUID: da1e5aa6-51a3-4512-ba79-3e325455007e
这里
-t clustername:fsname
:用于指定锁定表的名称-j nn
:指定使用多少个日志(节点)-J:允许指定日志大小。
如果未指定,则日记的默认大小为128 MB。
最小大小为8 MB(不推荐)
注意:在命令中," clustername"必须是起搏器群集名称,因为我已经使用了" mycluster",它是我的群集名称。
创建安装点并验证
现在,我们的逻辑卷已成功创建。
接下来让我们为文件系统创建挂载点
注意:在所有群集节点上手动创建此安装点
# mkdir /clusterfs
在为GFS2创建资源之前,让我们手动尝试验证lvcluster上的文件系统是否正常运行。
[root@node1 ~]# mount /dev/vgclvm/lvcluster /clusterfs/
验证相同
[root@node2 ~]# mount | grep clusterfs /dev/mapper/vgclvm-lvcluster on /clusterfs type gfs2 (rw,noatime)
这样看来,lvm
已成功安装。
创建GFS2FS群集资源
现在我们可以为GFS2文件系统的gfs2fs
创建一个资源。
[root@node1 ~]# pcs resource create gfs2fs Filesystem device="/dev/vgclvm/lvcluster" directory="/clusterfs" fstype=gfs2 options=noatime op monitor interval=10s on-fail=fence clone interleave=true Assumed agent name 'ocf:heartbeat:Filesystem' (deduced from 'Filesystem')
验证集群状态
[root@node1 ~]# pcs status Cluster name: mycluster Stack: corosync Current DC: node1.example.com (version 1.1.18-11.el7_5.3-2b07d5c5a9) - partition with quorum Last updated: Sat Dec 29 10:58:08 2016 Last change: Sat Dec 29 10:57:52 2016 by root via cibadmin on node1.example.com 3 nodes configured 12 resources configured Online: [ node1.example.com node2.example.com node3.example.com ] Full list of resources: Clone Set: dlm-clone [dlm] Started: [ node1.example.com node2.example.com node3.example.com ] Clone Set: clvmd-clone [clvmd] Started: [ node1.example.com node2.example.com node3.example.com ] fence-vm1 (stonith:fence_xvm): Started node2.example.com fence-vm2 (stonith:fence_xvm): Started node2.example.com fence-vm3 (stonith:fence_xvm): Started node2.example.com Clone Set: gfs2fs-clone [gfs2fs] Started: [ node1.example.com node2.example.com node3.example.com ] Daemon Status: corosync: active/enabled pacemaker: active/enabled pcsd: active/enabled
因此,我们的gfs2fs
服务会在所有集群节点上自动启动。
现在,为GFS2和CLVMD安排资源启动顺序,以便在节点重新引导后以正确的顺序启动服务,否则服务将无法启动
[root@node1 ~]# pcs constraint order start clvmd-clone then gfs2fs-clone Adding clvmd-clone gfs2fs-clone (kind: Mandatory) (Options: first-action=start then-action=start) [root@node1 ~]# pcs constraint colocation add gfs2fs-clone with clvmd-clone
使用GFS2文件系统验证我们的集群
现在,由于我们的资源/服务在群集节点上正常运行。
让我们在一个群集节点上创建一个文件。
[root@node1 ~]# cd /clusterfs/ [root@node1 clusterfs]# touch file
现在连接到任何其他群集节点,并且该文件也应该存在于该位置。
[root@node2 ~]# ls /clusterfs/ file
因此,带有GFS2文件系统配置的群集可以按预期工作。