CentOS 7上具有GFS2和iSCSI共享存储的主动/主动高可用性Pacemaker群集
我们将使用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文件系统的内部数据结构的工具。