CentOS 7上具有GFS2和iSCSI共享存储的主动/主动高可用性Pacemaker群集

时间:2020-03-21 11:42:28  来源:igfitidea点击:

我们将使用Pacemaker和Corosync构建一个三节点的主动/主动HA集群。

计划

我们的目标是使用Pacemaker和Corosync构建一个三节点(永不信任的群集,没有投票者的奇数个)主动/主动GFS2群集。

我们在VMware(ESXi)上有三个CentOS 7虚拟机,分别名为pcmk01,pcmk02和pcmk03.

本文遵循的约定是[ALL]表示需要在所有群集节点上运行的命令。

说明

对于超过16个节点的群集文件系统部署,Red Hat不支持使用GFS2.

RHEL 7中不支持gfs2_tool命令。

确保GFS2节点上的时钟已同步。
不必要的索引节点时间戳更新会严重影响群集性能。
本文未介绍NTP配置。

iSCSI服务器的安装和设置超出了本文的范围。
假定我们已经有一个功能正常的共享存储服务器。
我们可能需要查看此文章以了解RHEL 7上的iSCSI目标配置,我们可能会发现它很有用。

软件

本文使用的软件:

  • CentOS Linux版本7.2.1511(核心)
  • 起搏器-1.1.13
  • corosync-2.3.4
  • 个-0.9.143
  • 资源代理-3.9.5
  • 设备映射器多路径0.4.9
  • gfs2-utils 3.1.8

网络和防火墙配置

IP地址和主机名

将使用以下网络:

  • 10.247.50.0/24-可以访问Internet的局域网,
  • 172.16.21.0/24-用于Corosync的不可路由的群集心跳线VLAN,
  • 10.11.0.0/16-不可路由的iSCSI vlan,
  • 10.12.0.0/16-不可路由的iSCSI vlan。

在“/etc/hosts”文件中定义的主机名和IP:

10.247.50.10 vcentre
10.247.50.211 pcmk01 vm-pcmk01
10.247.50.212 pcmk02 vm-pcmk02
10.247.50.213 pcmk03 vm-pcmk03
172.16.21.11 pcmk01-cr
172.16.21.12 pcmk02-cr
172.16.21.13 pcmk03-cr
10.11.0.147 pcmk01-iscsi1
10.11.0.148 pcmk02-iscsi1
10.11.0.149 pcmk03-iscsi1
10.12.0.147 pcmk01-iscsi2
10.12.0.148 pcmk02-iscsi2
10.12.0.149 pcmk03-iscsi2

上面的vcentre记录指向我们的VMware vCenter服务器,该服务器位于10.247.50.10上。

我们设置了以下主机名:

[pcmk01]# hostnamectl set-hostname pcmk01
[pcmk02]# hostnamectl set-hostname pcmk02
[pcmk03]# hostnamectl set-hostname pcmk03

iptables

本文使用Iptables防火墙。
请注意,CentOS 7使用FirewallD作为默认的防火墙管理工具。

用Iptables替换FirewallD服务:

[ALL]# systemctl stop firewalld.service
[ALL]# systemctl mask firewalld.service
[ALL]# systemctl daemon-reload
[ALL]# yum install -y iptables-services
[ALL]# systemctl enable iptables.service
[ALL]# service iptables save

我们使用以下防火墙规则:

# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 10.0.0.0/8 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
-A INPUT -s 10.0.0.0/8 -p tcp -m tcp --dport 2224 -m state --state NEW -j ACCEPT
-A INPUT -s 172.16.21.0/24 -d 172.16.21.0/24 -m comment --comment Corosync -j ACCEPT
-A INPUT -s 10.11.0.0/16 -d 10.11.0.0/16 -m comment --comment iSCSI_1 -j ACCEPT
-A INPUT -s 10.12.0.0/16 -d 10.12.0.0/16 -m comment --comment iSCSI_2 -j ACCEPT
-A INPUT -p udp -m multiport --dports 67,68 -m state --state NEW -j ACCEPT
-A INPUT -p udp -m multiport --dports 137,138,139,445 -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j LOG --log-prefix "iptables_input "
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j LOG --log-prefix "iptables_forward "

Sysctl和SELinux

打开“ /etc/sysctl.conf”进行编辑,并放置以下内容以禁用IPv6:

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

如果发生故障(内核段错误或者GFS断言失败),也会导致节点崩溃:

kernel.panic_on_oops = 1

这应该由GFS自动打开。
从文件中加载值:

[ALL]# sysctl -p

SELinux设置为强制模式。

1.在群集节点之间配置无密码SSH身份验证

安装rsync程序包,生成SSH密钥对,并将其分布在群集节点上。

[ALL]# yum install rsync
[pcmk01]# ssh-keygen -b 2048 -t rsa -C "Hyman@theitroad" -f ~/.ssh/id_rsa
[pcmk01]# mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

与我们自己同步以获取存储在已知主机中的ECDSA密钥指纹,然后与其他集群节点同步:

[pcmk01]# rsync -av /root/.ssh/* pcmk01:/root/.ssh/
[pcmk01]# rsync -av /root/.ssh/* pcmk02:/root/.ssh/
[pcmk01]# rsync -av /root/.ssh/* pcmk03:/root/.ssh/

可选:在群集节点之间同步各种配置

这是一个简洁的'rsync_nodes.sh'脚本,用于使节点保持同步:

#!/bin/bash
# written by igi (http://www.theitroad.com)
# 07/02/2015 (dd/mm/yy)
# copyleft free software
# Simple script to keep cluster nodes in sync
#LOGFILE=""$HOME"/rsync_nodes.log";
# Nodes to keep in sync.
NODE1="pcmk01";
NODE2="pcmk02";
NODE3="pcmk03";
# Files and directories to sync.
# More files can be added as required.
FILE1="/etc/hosts";
FILE2="/etc/sysconfig/iptables";
FILE3="/etc/sysctl.conf";
FILE4="/etc/security/limits.conf";
FILE5="/etc/multipath.conf";
DIR1="/etc/yum.repos.d/";
#echo "Logfile is: "$LOGFILE"";
echo "Syncing "$FILE1"";
rsync -av "$FILE1" "$NODE2":"$FILE1" >>"$LOGFILE" 2>&1;
rsync -av "$FILE1" "$NODE3":"$FILE1" >>"$LOGFILE" 2>&1;
echo "Syncing "$FILE2"";
rsync -av "$FILE2" "$NODE2":"$FILE2" >>"$LOGFILE" 2>&1;
rsync -av "$FILE2" "$NODE3":"$FILE2" >>"$LOGFILE" 2>&1;
echo "Syncing "$FILE3"";
rsync -av "$FILE3" "$NODE2":"$FILE3" >>"$LOGFILE" 2>&1;
rsync -av "$FILE3" "$NODE3":"$FILE3" >>"$LOGFILE" 2>&1;
echo "Syncing "$FILE4"";
rsync -av "$FILE4" "$NODE2":"$FILE4" >>"$LOGFILE" 2>&1;
rsync -av "$FILE4" "$NODE3":"$FILE4" >>"$LOGFILE" 2>&1;
echo "Syncing "$FILE5"";
rsync -av "$FILE5" "$NODE2":"$FILE5" >>"$LOGFILE" 2>&1;
rsync -av "$FILE5" "$NODE3":"$FILE5" >>"$LOGFILE" 2>&1;
echo "Syncing "$DIR1"";
rsync -av "$DIR1" "$NODE2":"$DIR1" >>"$LOGFILE" 2>&1;
rsync -av "$DIR1" "$NODE3":"$DIR1" >>"$LOGFILE" 2>&1;
exit 0;

2.安装Pacemaker和Corosync

我们要首先安装VMware工具(如果在非VMware平台上运行,请跳过此行):

[ALL]# yum install open-vm-tools

这些个人电脑将安装起搏器,corosync和资源代理作为依赖项。

[ALL]# yum install -y pcs

(可选)安装用于SELinux管理的policycoreutils-python:

[ALL]# yum install -y policycoreutils-python

为名为hacluster的pcs管理帐户设置密码:

[ALL]# echo "passwd" | passwd hacluster --stdin

启动并启用服务:

[ALL]# systemctl start pcsd.service
[ALL]# systemctl enable pcsd.service

配置Corosync

以hacluster用户身份进行身份验证。
请注意,授权令牌存储在文件'/var/lib/pcsd/tokens'中。

[pcmk01]# pcs cluster auth pcmk01-cr pcmk02-cr pcmk03-cr -u hacluster -p passwd
pcmk01-cr: Authorized
pcmk02-cr: Authorized
pcmk03-cr: Authorized

生成并同步Corosync配置:

[pcmk01]# pcs cluster setup --name gfs_cluster pcmk01-cr pcmk02-cr pcmk03-cr

在所有节点上启动集群:

[pcmk01]# pcs cluster start --all

启用群集服务以在启动时启动:

[ALL]# pcs cluster enable --all

我们的Pacemaker集群现已启动并正在运行,但是尚未配置任何资源。

群集应具有法定人数。

[pcmk01]# corosync-quorumtool -s
Quorum information
-----------------
Date:

Sat Nov 6 15:41:52 2015
Quorum provider:  corosync_votequorum
Nodes:

3
Node ID:

1
Ring ID:

996
Quorate:

Yes
Votequorum information
---------------------
Expected votes:   3
Highest expected: 3
Total votes:

3
Quorum:

2
Flags:

Quorate
Membership information
---------------------

Nodeid

Votes Name

1

1 pcmk01-cr (local)

2

1 pcmk02-cr

3

1 pcmk03-cr

可以在https://pcmk01:2224 /上访问Cluster Manager Web UI。

3. iSCSI客户端安装和配置

配置设备映射器多路径和iSCSI启动器

[ALL]# yum install device-mapper-multipath iscsi-initiator-utils

DM Multipath的默认设置已编译到系统中,无需在“ /etc/multipath.conf”文件中显式设置。

但是,path_grouping_policy的默认值设置为故障转移,因此根据设置,我们可能需要编辑'/etc/multipath.conf'文件并将其更改为相应的名称。

由于通常服务器上已经使用了“ sda”磁盘,因此我们将其列入了黑名单。

[ALL]# cat << EOL > /etc/multipath.conf
defaults {

user_friendly_names yes

find_multipaths yes
}
blacklist {

devnode "sda"

devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"

devnode "^hd[a-z]"

devnode "^cciss!c[0-9]d[0-9].*"
}
devices {

device {

vendor

"NETAPP"

product

"NewFiler"

path_grouping_policy multibus

path_selector

"round-robin 0"

failback

immediate

}
}
EOL

启用并启动多路径服务:

[ALL]# systemctl enable multipathd.service
[ALL]# systemctl start multipathd

配置iSCSI启动器名称:

[ALL]# echo "InitiatorName=iqn.1994-05.com.redhat:$(hostname)" >/etc/iscsi/initiatorname.iscsi

启用并启动iscsi服务:

[ALL]# systemctl enable iscsi.service
[ALL]# systemctl start iscsi

发现新创建的目标,其中10.11.0.5是我们的NetApp SAN的IP:

[ALL]# iscsiadm -m discovery -t sendtargets -p 10.11.0.5:3260

将登录设置为自动:

[ALL]# iscsiadm -m node -L automatic

NetApp Data ONTAP SAN:在iSCSI服务器上创建LUN

下面的命令特定于我们正在使用的NetApp Data ONTAP SAN,因此由于读者对本文的兴趣有所疑问(重点放在Pacemaker + GFS2上),因此不作详细解释。
这些主要是供我们自己将来参考。

SAN> vol create iSCSI_PCMK_MySQL_Test_Cluster -s none aggr1_fcal 5g
SAN> vol autosize iSCSI_PCMK_MySQL_Test_Cluster -m 10g -i 1g on
SAN> snap sched iSCSI_PCMK_MySQL_Test_Cluster 0 0 0
SAN> snap reserve iSCSI_PCMK_MySQL_Test_Cluster 0
SAN> vfiler add vfiler2 /vol/iSCSI_PCMK_MySQL_Test_Cluster
SAN> igroup create -i -t linux PCMK_MySQL_Test_Cluster iqn.1994-05.com.redhat:pcmk01
SAN> igroup add PCMK_MySQL_Test_Cluster iqn.1994-05.com.redhat:pcmk02
SAN> igroup add PCMK_MySQL_Test_Cluster iqn.1994-05.com.redhat:pcmk03
SAN> igroup show PCMK_MySQL_Test_Cluster

PCMK_MySQL_Test_Cluster (iSCSI) (ostype: linux):

iqn.1994-05.com.redhat:pcmk01 (logged in on: IFGRP1-12, IFGRP1-11)

iqn.1994-05.com.redhat:pcmk02 (logged in on: IFGRP1-12, IFGRP1-11)

iqn.1994-05.com.redhat:pcmk03 (logged in on: IFGRP1-12, IFGRP1-11)
SAN> lun create -s 5g -t linux /vol/iSCSI_PCMK_MySQL_Test_Cluster/iSCSI_PCMK_MySQL_Test_Cluster.lun
SAN> lun set reservation /vol/iSCSI_PCMK_MySQL_Test_Cluster/iSCSI_PCMK_MySQL_Test_Cluster.lun disable
SAN> lun map -f /vol/iSCSI_PCMK_MySQL_Test_Cluster/iSCSI_PCMK_MySQL_Test_Cluster.lun PCMK_MySQL_Test_Cluster
SAN> lun show -v /vol/iSCSI_PCMK_MySQL_Test_Cluster/iSCSI_PCMK_MySQL_Test_Cluster.lun
/vol/iSCSI_PCMK_MySQL_Test_Cluster/iSCSI_PCMK_MySQL_Test_Cluster.lun    5.0g (5346689024)    (r/w, online, mapped)

Serial#: 80AQDCKHG1AJ

Share: none

Space Reservation: disabled

Multiprotocol Type: linux

Maps: PCMK_MySQL_Test_Cluster=0

Occupied Size:

0 (0)

Creation Time: Sat Jan 16 19:31:40 GMT 2015

Cluster Shared Volume Information: 0x0

Read-Only: disabled

LUN准备就绪后,请重新扫描iSCSI会话以显示新设备:

[ALL]# iscsiadm -m session --rescan
[pcmk01]# multipath -ll
360a980003830354d66244675306b7343 dm-2 NETAPP  ,LUN
size=5.0G features='4 queue_if_no_path pg_init_retries 50 retain_attached_hw_handle' hwhandler='0' wp=rw
`-+- policy='service-time 0' prio=2 status=active
  |- 5:0:0:0 sdb 8:16 active ready running
  `- 6:0:0:0 sdc 8:32 active ready running

4.配置STONITH(又名节点防护)

请注意,群集属性stonith-enabled可能不会停用以使用DLM。
具有共享数据的集群需要STONITH来确保数据完整性。

安装适用于VMware环境的防护代理:

[ALL]# yum install -y fence-agents-vmware-soap

使用来自CIB的当前原始XML配置填充文件:

[pcmk01]# pcs cluster cib stonith_cfg

创建一个名为my_vcentre-fence的新STONITH资源:

[pcmk01]# pcs -f stonith_cfg stonith create my_vcentre-fence fence_vmware_soap \
 ipaddr=vcentre ipport=443 ssl_insecure=1 inet4_only=1 \
 login="vcentre-account" passwd="passwd" \
 action=reboot \
 pcmk_host_map="pcmk01-cr:vm-pcmk01;pcmk02-cr:vm-pcmk02;pcmk03-cr:vm-pcmk03" \
 pcmk_host_check=static-list \
 pcmk_host_list="vm-pcmk01,vm-pcmk02,vm-pcmk03" \
 power_wait=3 op monitor interval=90s

启用STONITH,设置其操作和超时,然后提交更改:

[pcmk01]# pcs -f stonith_cfg property set stonith-enabled=true
[pcmk01]# pcs -f stonith_cfg property set stonith-action=reboot
[pcmk01]# pcs -f stonith_cfg property set stonith-timeout=120s
[pcmk01]# pcs cluster cib-push stonith_cfg

检查所有当前配置的STONITH属性:

[pcmk01]# pcs property list --all|grep stonith
 stonith-action: reboot
 stonith-enabled: true
 stonith-timeout: 120s
 stonith-watchdog-timeout: (null)

我们还可以检查所有属性默认值:

[pcmk01]# pcs property list --defaults

显示所有当前配置的STONITH设备:

[pcmk01]# pcs stonith show --full
 Resource: my_vcentre-fence (class=stonith type=fence_vmware_soap)
  Attributes: ipaddr=vcentre ipport=443 ssl_insecure=1 inet4_only=1 login=vcentre-account passwd=passwd action=reboot pcmk_host_map=pcmk01-cr:vm-pcmk01;pcmk02-cr:vm-pcmk02;pcmk03-cr:vm-pcmk03 pcmk_host_check=static-list pcmk_host_list=vm-pcmk01,vm-pcmk02,vm-pcmk03 power_wait=3
  Operations: monitor interval=90s (my_vcentre-fence-monitor-interval-90s)

测试STONITH,重新启动第三个群集节点,确保为此使用Corosync接口:

[pcmk01]# stonith_admin --reboot pcmk03-cr

如果超时,则可以增加监视间隔:

[pcmk01]# pcs stonith update my_vcentre-fence op monitor interval=120s

或者进行简单的清理,有时只需要这样做:

[pcmk01]# pcs stonith cleanup

清理告诉集群忘记一个stonith设备的操作历史记录,并重新检测其当前状态。
清除有关已解决的过去失败的知识可能很有用。

5.为GFS2配置Pacemaker

我们要防止健康的资源在集群中移动。
我们可以为每种资源指定不同的粘性,但是更改默认值通常就足够了。

[pcmk01]# pcs resource defaults resource-stickiness=200
[pcmk01]# pcs resource defaults
resource-stickiness: 200

安装群集文件系统所需的GFS2命令行实用程序和分布式锁定管理器(DLM):

[ALL]# yum install gfs2-utils lvm2-cluster

为LVM启用群集锁定:

[ALL]# lvmconf --enable-cluster

这会将系统上的locking_type设置为3,并禁用lvmetad的使用,因为在集群环境中尚不支持。
另一种方法是打开“ /etc/lvm/lvm.conf”文件并设置:

locking_type = 3

DLM需要在所有节点上运行,因此我们首先为其创建资源(使用ocf:pacemaker:controld资源脚本),然后对其进行克隆。
请注意,dlm资源是clvmd和GFS2的必需依赖项。

[pcmk01]# pcs cluster cib dlm_cfg
[pcmk01]# pcs -f dlm_cfg resource create dlm ocf:pacemaker:controld \
  op monitor interval=120s on-fail=fence clone interleave=true ordered=true

将clvmd设置为集群资源。

[pcmk01]# pcs -f dlm_cfg resource create clvmd ocf:heartbeat:clvm \
  op monitor interval=120s on-fail=fence clone interleave=true ordered=true

设置clvmd和dlm依赖关系并启动顺序。
创建排序和共置约束,以便clvm在dlm之后启动,并且两个资源都在同一节点上启动。

[pcmk01]# pcs -f dlm_cfg constraint order start dlm-clone then clvmd-clone
[pcmk01]# pcs -f dlm_cfg constraint colocation add clvmd-clone with dlm-clone

将群集的no-quorum-policy设置为冻结,以便在丢失仲裁后,剩余的分区将不执行任何操作,直到重新获得仲裁– GFS2需要仲裁才能运行。

[pcmk01]# pcs -f dlm_cfg property set no-quorum-policy=freeze

让我们检查配置:

[pcmk01]# pcs -f dlm_cfg constraint
Location Constraints:
Ordering Constraints:
  start dlm-clone then start clvmd-clone (kind:Mandatory)
Colocation Constraints:
  clvmd-clone with dlm-clone (score:INFINITY)
[pcmk01]# pcs -f dlm_cfg resource show
 Clone Set: dlm-clone [dlm]

Stopped: [ pcmk01-cr pcmk02-cr pcmk03-cr ]
 Clone Set: clvmd-clone [clvmd]

Stopped: [ pcmk01-cr pcmk02-cr pcmk03-cr ]

提交更改:

[pcmk01]# pcs cluster cib-push dlm_cfg
[pcmk01]# pcs resource show
 Clone Set: dlm-clone [dlm]

Started: [ pcmk01-cr pcmk02-cr pcmk03-cr ]
 Clone Set: clvmd-clone [clvmd]

Started: [ pcmk01-cr pcmk02-cr pcmk03-cr ]
[pcmk01]# pcs property list no-quorum-policy
Cluster Properties:
 no-quorum-policy: freeze

LVM配置

创建LVM对象

我们将从单个群集节点创建LVM对象。

[pcmk01]# pvcreate /dev/mapper/360a980003830354d66244675306b7343
[pcmk01]# vgcreate --autobackup=y --clustered=y vg_cluster /dev/mapper/360a980003830354d66244675306b7343
[pcmk01]# lvcreate --size 512M --name lv_storage vg_cluster

在某些情况下,我们可能会收到以下错误:

connect() failed on local socket: No such file or directory
Internal cluster locking initialisation failed.
WARNING: Falling back to local file-based locking.
Volume Groups with the clustered attribute will be inaccessible.

上面的内容表明我们启用了集群锁定,但是集群LVM守护程序(clvmd)没有运行。
确保它是通过Pacemaker启动的。

创建集群文件系统

GFS2为群集中需要挂载文件系统的每个节点需要一个日志。
例如,如果我们有一个16节点的群集,但只需要从两个节点挂载文件系统,则只需要两个日志。
如果需要从第三个节点挂载,则始终可以使用gfs2_jadd命令添加日志。
GFS2允许即时添加日志。

默认的GFS2日志大小为128MB。
最小大小为8MB。
较大的日记可以提高性能,尽管它们比较小的日记使用更多的内存。
默认大小为128MB,这意味着如果我们拥有512MB的逻辑卷和3个节点的集群,则创建GFS2文件系统将无法正常工作,我们将收到一条错误消息,指出可用空间不足:

Failed to create resource group index entry: No space left on device

在确定系统将包含的节点数量时,始终在高可用性和性能之间进行权衡。
随着节点数量的增加,使工作负载扩展变得越来越困难。
因此,对于超过16个节点的群集文件系统部署,Red Hat不支持使用GFS2.
在确定日志数量时,每个要挂载GFS2文件系统的群集节点都需要一个日志。

通常建议使用默认的日记大小128MB。
但是,由于我们的文件系统非常小(只有5GB),因此拥有128MB日志根本是不切实际的。

还建议我们不要运行超过85%的文件系统,尽管此数字可能会根据工作负载而有所不同。

在我们的特定情况下:3个节点x 32MB日志= 96MB +资源组的一些空间= 100MB左右。

创建具有三个日志的群集文件系统,日志大小为32MB。
请注意,群集名称必须与“ cluster.conf”中的名称匹配,因为仅允许该群集的成员使用此文件系统。

可接受的锁定协议为lock_dlm,lock_gulm,或者如果我们将GFS2用作本地文件系统(仅一个节点),则可以指定lock_nolock协议。

[pcmk01]# mkfs.gfs2 -j3 -J32 -t gfs_cluster:gfs2_storage -p lock_dlm /dev/vg_cluster/lv_storage
/dev/vg_cluster/lv_mysql01 is a symbolic link to /dev/dm-3
This will destroy any data on /dev/dm-3
Are you sure you want to proceed? [y/n]y
Device:

/dev/vg_cluster/lv_storage
Block size:

4096
Device size:

0.50 GB (131072 blocks)
Filesystem size:

0.50 GB (131068 blocks)
Journals:

3
Resource groups:

5
Locking protocol:

"lock_dlm"
Lock table:

"gfs_cluster:gfs2_storage"
UUID:

00a3fa40-d95c-904a-fd59-9fe3baa2b283

检查群集名称的几种方法:

[pcmk01]# pcs property list cluster-name
Cluster Properties:
 cluster-name: gfs_cluster
# grep name /etc/corosync/corosync.conf
  cluster_name: gfs_cluster

创建一个安装点:

[ALL]# mkdir -p /cluster/storage

创建Pacemaker文件系统资源

通常建议使用noatime和nodiratime参数挂载GFS2文件系统。
这使GFS2可以花费更少的时间来为每次访问更新磁盘inode。

[pcmk01]# pcs resource create gfs2_res01 Filesystem device="/dev/vg_cluster/lv_storage" \
  directory="/cluster/storage" fstype="gfs2" options="noatime,nodiratime,rw" \
  op monitor interval=90s on-fail=fence clone interleave=true

在通过iSCSI协议提供的分区上的GFS文件系统上使用LVM时,我们需要定义_netdev选项。
为此,我们将简单地更新文件系统资源:

[pcmk01]# pcs resource update gfs2_res01 options="noatime,nodiratime,rw,_netdev"

在系统上启用网络后,将挂载使用_netdev标志挂载的文件系统。

通过设置options参数的run_fsck参数,我们可以选择在引导时检查GFS2文件系统。

让我们检查一下gfs2挂载:

[pcmk01]# mount|grep gfs2
/dev/mapper/vg_cluster-lv_storage on /cluster/storage type gfs2 (rw,noatime,nodiratime,seclabel,_netdev))

警告:避免在GFS2上使用SELinux

根据RedHat文档,出于安全原因,强烈建议在大多数情况下使用SELinux,但不支持将其与GFS2一起使用。
SELinux使用扩展属性存储有关每个文件系统对象的信息。
可以读取,写入和维护这些扩展属性,但是会大大降低GFS2的速度。

挂载文件系统时,必须使用挂载手册页中所述的上下文选项之一,在GFS2文件系统(而不是整个服务器!)上关闭SELinux。

默认的安全上下文应为无标签的:

[pcmk01]# ls -dZ /cluster/storage
drwxr-xr-x. root root system_u:object_r:unlabeled_t:s0 /cluster/storage/

应该加载GFS2的xattr部分:

[pcmk01]# dmesg|grep xattr
[    2.671313] SELinux: initialized (dev dm-0, type ext4), uses xattr
[    4.623928] SELinux: initialized (dev sda1, type ext2), uses xattr
[   26.107473] SELinux: initialized (dev dm-3, type gfs2), uses xattr

我们将把安全性上下文更改为公共内容,每个文件系统仅一个安全性上下文。

标有public_content_t类型的文件允许FTP,Apache,Samba和rsync读取它们。
标有public_content_rw_t的文件允许被写入(某些服务,例如Samba,需要设置布尔值才能写入!)。

更新文件系统资源:

[pcmk01]# pcs resource update gfs2_res01 options='noatime,nodiratime,rw,_netdev,context="system_u:object_r:public_content_rw_t:s0"'

挂载选项和安全性上下文应更改:

[pcmk01]# mount|grep gfs2
/dev/mapper/vg_cluster-lv_storage on /cluster/storage type gfs2 (rw,noatime,nodiratime,context=system_u:object_r:public_content_rw_t:s0,_netdev)
[pcmk01]# ls -dZ /cluster/storage
drwxr-xr-x. root root system_u:object_r:public_content_rw_t:s0 /cluster/storage/

重新引导系统(或者从另一个节点隔离它!)并检查内核消息缓冲区,不应加载xattr部分:

[pcmk01]# reboot
[pcmk01]# dmesg|grep xattr
[    2.424703] SELinux: initialized (dev dm-0, type ext4), uses xattr
[    3.786307] SELinux: initialized (dev sda1, type ext2), uses xattr

如果当前版本不适合,我们总是可以检查其他SELinux可用内容:

# semanage fcontext -l|less

创建Pacemaker资源订购

现在,我们需要确保在尝试装入GFS2卷之前先启动集群LVM守护程序(clvmd),否则我们的逻辑设备'/dev/vg_cluster/lv_storage'将不会被发现为具有clustered属性的卷组。
将无法访问。
GFS2必须在clvmd之后启动,并且必须与clvmd在同一节点上运行。

[pcmk01]# pcs constraint order start clvmd-clone then gfs2_res01-clone
[pcmk01]# pcs constraint colocation add gfs2_res01-clone with clvmd-clone
[pcmk01]# pcs constraint show
Location Constraints:
Ordering Constraints:
  start dlm-clone then start clvmd-clone (kind:Mandatory)
  start clvmd-clone then start gfs2_res01-clone (kind:Mandatory)
Colocation Constraints:
  clvmd-clone with dlm-clone (score:INFINITY)
  gfs2_res01-clone with clvmd-clone (score:INFINITY)

如何离线检查GFS2文件系统

运行fsck.gfs2之前,所有节点都必须卸载GFS2文件系统。
无法从群集中的所有节点卸载会导致文件系统损坏。

[pcmk01]# pcs resource disable --wait=5 gfs2_res01
[pcmk01]# fsck.gfs2 /dev/vg_cluster/lv_storage
[pcmk01]# pcs resource enable gfs2_res01

如何在线增长GFS2文件系统

gfs2_grow命令用于在文件系统所在的设备也已扩展之后扩展GFS2文件系统。

让我们首先扩展LVM:

[pcmk01]# lvextend --size +512M /dev/vg_cluster/lv_storage

我们可能仅在已安装的文件系统上运行gfs2_grow,因为不支持未安装的文件系统的扩展。
我们只需要在集群中的一个节点上运行gfs2_grow。

请注意,我们可以使用-T标志运行gfs2_grow以显示已安装的GFS2文件系统的当前状态。

[pcmk01 ~]# gfs2_grow /dev/vg_cluster/lv_storage
# df -hT /cluster/storage
Filesystem

Type  Size  Used Avail Use% Mounted on
/dev/mapper/vg_cluster-lv_storage gfs2  1.0G  100M  925M  10% /cluster/storage

如何将日记添加到GFS2

日志数量可以通过gfs2_edit -p jindex获取。
挂载文件系统时,请勿执行此命令。

[pcmk01]# gfs2_edit -p jindex /dev/vg_cluster/lv_storage|grep journal
   3/3 [fc7745eb] 1/18 (0x1/0x12): File    journal0
   4/4 [8b70757d] 2/8231 (0x2/0x2027): File    journal1
   5/5 [127924c7] 3/16444 (0x3/0x403c): File    journal2

如果GFS2文件系统已满,则即使包含该文件系统的逻辑卷已扩展且大于该文件系统,gfs2_jadd也会失败。
这是因为在GFS2文件系统中,日志是普通文件,而不是嵌入式元数据,因此仅扩展基础逻辑卷将不会为日志提供空间。

# gfs2_jadd -j 1 /dev/vg_cluster/lv_storage
Filesystem: /dev/vg_cluster/lv_storage
Old journals: 3
New journals: 4
[pcmk01]# gfs2_edit -p jindex /dev/vg_cluster/lv_storage|grep journal
   3/3 [fc7745eb] 1/18 (0x1/0x12): File    journal0
   4/4 [8b70757d] 2/8231 (0x2/0x2027): File    journal1
   5/5 [127924c7] 3/16444 (0x3/0x403c): File    journal2
   6/6 [657e1451] 4/131340 (0x4/0x2010c): File    journal3

如何显示,打印或者编辑GFS2或者GFS内部结构

gfs2_edit命令是用于检查,编辑或者显示GFS2或者GFS文件系统的内部数据结构的工具。