使用GFS2创建ISCSI集群存储

https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/9/html-single/configuring_gfs2_file_systems/index

测试环境

DSM 7.2.2 update4
Oracle Linux9.5

配置ISCSI

创建ISCSI LUN

在NAS创建一个新的target:

如果已有LUN可以直接映射,这边选择创建一个新的LUN:

这边创建的是带空间回收功能的thin LUN:

由于是集群使用,这边需要编辑target,启用多重联机功能:

配置iscsi客户端

以下命令需要在所有节点运行

安装iscsi客户端:
yum -y install iscsi-initiator-utils

修改配置文件/etc/iscsi/iscsid.conf
vi /etc/iscsi/iscsid.conf

修改以下配置,禁止自动发现的iqn自动连接,防止错误挂载其他target导致数据异常。
node.startup = manual

使用以下命令发现server的所有target(慎用,操作后会吧本地已有的连接配置清空)
iscsiadm -m discovery -t st -p 10.61.21.202

搜索需要挂载的target:
iscsiadm -m node | grep Target-8

使用以下命令挂载:
iscsiadm -m node -T iqn.2000-01.com.synology:DS1621bk.Target-8.2e42fdcccaf -p 10.61.21.202 -l

修改配置为开机自动连接:
iscsiadm -m node -T iqn.2000-01.com.synology:DS1621bk.Target-8.2e42fdcccaf -p 10.61.21.202 -o update -n node.startup -v automatic

绑定udev

以下命令需要在所有节点运行

查看当前装载的卷位置:
iscsiadm -m session -P 3

查看设备ID:
/lib/udev/scsi_id -g -u -d /dev/sdb

添加配置文件(RESULT需要填写设备ID):
vi /etc/udev/rules.d/scsi.rules

KERNEL=="sd*",SUBSYSTEM=="block",PROGRAM=="/lib/udev/scsi_id -g -u -d /dev/$name",RESULT=="360014058343f9badfd81d40ceda7f6d7",SYMLINK+="GFSdata1",OWNER="root",GROUP="root",MODE="0660"

加载配置:
/sbin/udevadm trigger --type=devices --action=change

udevadm control --reload-rules

部署集群服务

以下命令需要在所有节点运行

关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

修改hostname
hostnamectl set-hostname cnnode1.synohyperv.local

修改hosts
vi /etc/hosts

10.61.20.230 cnnode1.synohyperv.local cnnode1
10.61.20.225 cnnode2.synohyperv.local cnnode2
10.61.21.45 cnnode3.synohyperv.local cnnode3

安装NTP服务
yum install chrony -y

启用NTP服务
systemctl enable chronyd

修改NTP对时服务器
vi /etc/chrony.conf

重启NTP服务
systemctl restart chronyd

检查同步状态
chronyc sources -v

启用addons 源
dnf config-manager --enable ol9_addons

安装集群服务
yum install -y pcs pacemaker corosync fence-agents-all

启用集群服务
systemctl start pcsd
systemctl enable pcsd

设置集群用户密码
passwd hacluster

配置集群服务

以下命令只要在一台节点运行

验证集群
pcs host auth cnnode1 cnnode2 cnnode3 -u hacluster -p synology

启用集群
pcs cluster setup cluster0 cnnode1 cnnode2 cnnode3

pcs cluster start --all
pcs cluster enable --all

查看集群状态
pcs cluster status

调整集群策略:

活跃节点数小于一半时,保持当前资源运行状态,不进行资源迁移或停止。
pcs property set no-quorum-policy=freeze

当节点重启时,保留资源分配记录,节点回来后资源会回到原来的地方。
pcs property set shutdown-lock=true

多个节点同时出现问题时,允许并行 fencing,加快恢复速度。
pcs property set concurrent-fencing=true

检查策略:
pcs property

配置STONITH(Shoot The Other Node In The Head)

以下命令只要在一台节点运行

这边使用fence_scsi,3个节点都需要:

pcs stonith create fence_cnnode1 fence_scsi pcmk_host_list=cnnode1 devices="/dev/GFSdata1" meta provides="stonith" op monitor interval=60s

pcs stonith create fence_cnnode2 fence_scsi pcmk_host_list=cnnode2 devices="/dev/GFSdata1" meta provides="stonith" op monitor interval=60s

pcs stonith create fence_cnnode3 fence_scsi pcmk_host_list=cnnode3 devices="/dev/GFSdata1" meta provides="stonith" op monitor interval=60s

查询状态:
pcs stonith status

部署DLM

以下命令需要在所有节点运行

安装dlm-lib组件:
yum install -y dlm-lib

还需要安装对应的DLM服务
https://pkgs.org/search/?q=dlm

下载对应的RPM安装包:
https://centos.pkgs.org/9-stream/centos-resilientstorage-x86_64/dlm-4.3.0-1.el9.x86_64.rpm.html

手动安装:
rpm -ivh dlm-4.3.0-1.el9.x86_64.rpm

手动重启DLM进程以加载配置:
systemctl start dlm
systemctl stop dlm

查看是否有启动
lsmod | grep dlm

手动启动
modprobe dlm

检查文件是否存在
ll /dev/misc/dlm-control

如果不存在可能是注册错地方了,手动部署服务

mkdir /dev/misc/
ln -s /dev/dlm-control /dev/misc/dlm-control
ln -s /dev/dlm-monitor /dev/misc/dlm-monitor
ln -s /dev/dlm_plock /dev/misc/dlm_plock

创建集群存储

以下命令需要在所有节点运行

安装GFS2组件:
yum install -y gfs2-utils

配置集群存储

以下命令只要在一台节点运行

分区表在多节点共享时有同步风险,这边就不切分区了,创建3节点的集群文件系统
mkfs.gfs2 -p lock_dlm -t cluster0:gfsdata1 -j 3 /dev/GFSdata1

查看分区信息:
blkid /dev/GFSdata1

配置服务:

pcs resource create dlm ocf:pacemaker:controld op monitor interval=30s meta allow-multiple=true

pcs resource create data1 ocf:heartbeat:Filesystem device="/dev/GFSdata1" directory="/data" fstype="gfs2"     options="defaults,lockproto=lock_dlm,locktable=cluster0:gfsdata1,_netdev"     op monitor interval=10s meta allow-multiple=true

pcs constraint order start dlm then data1

pcs constraint colocation add data1 with dlm

检查集群状态
pcs status

确认正常后克隆配置让其他节点运行:
pcs resource clone dlm meta clone-max=3 clone-node-max=1
pcs resource clone data1 meta clone-max=3 clone-node-max=1

如果发生只有一个节点可以挂载其他节点挂载异常,可以尝试重启异常节点查看是否可以正常恢复:

重启cnnode2、cnnode3后:

集群控制

开启集群

以下命令只要在一台节点运行

开机后集群会自动启动:
pcs status

关闭维护模式
pcs property set maintenance-mode=false

启动所有服务

pcs resource enable dlm
pcs resource enable data1

关闭集群

以下命令只要在一台节点运行

停止服务
pcs resource disable data1
pcs resource disable dlm

确认服务是否都已经停止:
pcs status

进入维护模式
pcs property set maintenance-mode=true

关闭集群
pcs cluster stop --all

添加新设备到集群

需要先参考之前教程,配置iscsi客户端、绑定udev、部署集群服务。

启动集群服务
systemctl start pcsd
systemctl enable pcsd

设置集群用户密码
passwd hacluster

先部署部署DLM:
yum install -y dlm-lib

手动安装:
rpm -ivh dlm-4.3.0-1.el9.x86_64.rpm

手动重启DLM进程以加载配置:
systemctl start dlm
systemctl stop dlm

在已经加入集群的linux中执行后续操作:
pcs host auth cnnode1 cnnode2 cnnode3 cnnode4 -u hacluster -p synology

添加新节点到集群:
pcs cluster node add cnnode4
pcs cluster start cnnode4

查看集群状态
pcs status

配置STONITH
pcs stonith create fence_cnnode4 fence_scsi pcmk_host_list=cnnode4 devices="/dev/GFSdata1" meta provides="stonith" op monitor interval=60s

查看当前GFS2的journals数量:
gfs2_edit -p journals /dev/GFSdata1

增加journals数量并验证:
gfs2_jadd -j 1 /data/

调整集群配置:
pcs resource meta dlm-clone clone-max=4
pcs resource meta data1-clone clone-max=4

移除集群中设备

停止节点的服务:
pcs resource ban dlm cnnode4
pcs resource ban data1-clone cnnode4

查看集群状态
pcs status

配置为维护模式:
pcs node maintenance cnnode4

并关闭集群服务:
pcs cluster stop
pcs cluster disable

停用集群服务组件:
systemctl disable pacemaker corosync

在已经加入集群的linux中执行后续操作:

从集群中删除节点:
pcs cluster node remove cnnode4

删除对应节点的STONITH:
pcs stonith delete fence_cnnode4

note

关闭集群
pcs cluster stop --all

开启集群
pcs cluster start --all

删除服务
pcs stonith remove dlm

清理孤立资源
pcs resource cleanup dlm

取消clone
pcs resource unclone dlm

测试启动服务
pcs resource enable data1
pcs resource debug-start data1

重启stonith节点
pcs stonith enable fence_cnnode1
pcs stonith disable fence_cnnode1

清理日志
pcs resource cleanup

更新clone
pcs resource update dlm clone-max=4

临时禁止

停止节点的部分服务
pcs resource ban data1-clone cnnode3

恢复节点的部分服务
pcs resource clear data1-clone cnnode3

永久禁止

加禁止约束:
pcs constraint location data1-clone avoids cnnode3=INFINITY

查看约束:
pcs constraint config --full

删除约束:
pcs constraint remove <约束ID>
pcs constraint remove location-data1-clone-cnnode3--INFINITY

强行停止集群
pcs cluster stop --all --force