基于 iSCSI 共享块存储的 Pacemaker 主备高可用服务
本文旨在构建一个结合了 Pacemaker 高可用集群 与 iSCSI 共享块存储 的完整高可用解决方案。该方案的核心目标是为上层应用(例如 MooseFS 元数据服务器)提供一个稳定、可靠且具备故障自动切换能力的基础架构。
架构概览: 我们将 server1 和 server5 配置为 Pacemaker 双节点集群,负责管理应用服务的高可用性。同时,将 server4 配置为独立的 iSCSI Target 存储服务器,为集群节点提供共享的网络块存储。集群节点(server1 和 server5)作为 iSCSI Initiator 客户端,挂载并使用该共享存储,确保应用数据在节点间保持一致。
核心价值: 通过 Pacemaker 实现服务的自动故障转移(Failover),结合 iSCSI 提供的共享存储,避免了传统主备模式中数据同步的复杂性和延迟问题。当主节点发生故障时,Pacemaker 能够将虚拟 IP(VIP)和关联的服务快速切换到备用节点,而备用节点通过 iSCSI 访问同一份数据,保证了服务的连续性和数据的一致性。
下文将分步详解 Pacemaker 高可用环境部署 、独立 iSCSI Target 存储服务器搭建 以及 iSCSI Initiator 客户端配置 三大核心环节,最终实现一个可投入生产环境测试的高可用存储集群。
Pacemaker 高可用环境部署
1. 环境准备与软件安装
首先,在两台节点上配置高可用软件仓库并安装必要的软件包。
cpp
# 进入 yum 仓库目录
[root@server1 ~]# cd /etc/yum.repos.d
查看现有仓库文件
[root@server1 yum.repos.d]# ls
MooseFS.repo rocky-addons.repo rocky-devel.repo rocky-extras.repo rocky.repo
启用 Rocky Linux 的 addons 仓库(通常包含高可用组件)
[root@server1 yum.repos.d]# vim rocky-addons.repo
将文件中第一块(通常是 [rocky-addons])的 enable=0 改为 enable=1
安装 Pacemaker、Corosync 集群通信层、PCS 管理工具及隔离代理
[root@server1 yum.repos.d]# yum install -y pacemaker corosync pcs fence-agents
启动并启用 pcsd 服务(PCS 守护进程,用于远程管理)
[root@server1 ~]# systemctl enable --now pcsd
**注意:**请在 server1 和 server5 上均执行以上步骤。
2. 集群节点认证
配置节点间的免密 SSH 访问,并为集群管理账户 `hacluster` 设置统一密码,以便后续认证。
cpp
# 在 server1 上生成 SSH 密钥对(如果尚未生成)
[root@server1 ~]# ssh-keygen
为集群管理账户 hacluster 设置密码
[root@server1 ~]# echo 001003 | passwd --stdin hacluster
将相同的密码同步设置到 server5 上的 hacluster 账户
[root@server1 ~]# ssh server5 'echo 001003 | passwd --stdin hacluster'
验证 hacluster 用户是否存在
[root@server1 ~]# id hacluster
uid=189(hacluster) gid=189(haclient) groups=189(haclient)
使用 pcs 命令对两个节点进行认证
[root@server1 ~]# pcs host auth server1 server5 -u hacluster -p 001003
server5: Authorized
server1: Authorized
3. 创建并启动集群
使用认证信息初始化一个名为 `mycluster` 的 Pacemaker 集群。
cs
# 初始化集群,指定集群名称和节点
[root@server1 ~]# pcs cluster setup mycluster server1 server5
No addresses specified for host 'server1', using 'server1'
No addresses specified for host 'server5', using 'server5'
Destroying cluster on hosts: 'server1', 'server5'...
server5: Successfully destroyed cluster
server1: Successfully destroyed cluster
Requesting remove 'pcsd settings' from 'server1', 'server5'
server1: successful removal of the file 'pcsd settings'
server5: successful removal of the file 'pcsd settings'
Sending 'corosync authkey', 'pacemaker authkey' to 'server1', 'server5'
server1: successful distribution of the file 'corosync authkey'
server1: successful distribution of the file 'pacemaker authkey'
server5: successful distribution of the file 'corosync authkey'
server5: successful distribution of the file 'pacemaker authkey'
Sending 'corosync.conf' to 'server1', 'server5'
server1: successful distribution of the file 'corosync.conf'
server5: successful distribution of the file 'corosync.conf'
Cluster has been successfully set up.
在所有节点上启动集群服务
[root@server1 ~]# pcs cluster start --all
server5: Starting Cluster...
server1: Starting Cluster...
设置集群服务开机自启
[root@server1 ~]# pcs cluster enable --all
server1: Cluster Enabled
server5: Cluster Enabled
4. 配置双节点集群关键参数
在双节点 Pacemaker 集群中,必须调整以下核心参数以确保集群在故障场景下仍能正常运行。
背景说明: 对于双节点集群,当其中一个节点故障导致仲裁(quorum)不满足时,默认情况下所有资源都会停止。为避免这种情况,必须进行以下配置。
cpp
# 在实验环境中关闭 STONITH(隔离)功能
[root@server1 ~]# pcs property set stonith-enabled=false
配置双节点集群在丢失仲裁时忽略仲裁丢失,使剩余单节点继续运行资源
[root@server1 ~]# pcs property set no-quorum-policy=ignore
5. 创建并管理虚拟 IP(VIP)资源
创建一个虚拟 IP 地址资源,作为高可用服务对外提供访问的入口。
cs
# 创建名为 VIP 的 IPaddr2 资源,指定 IP 地址和监控间隔
[root@server1 ~]# pcs resource create VIP ocf:heartbeat:IPaddr2 ip=192.168.223.200 cidr_netmask=24 op monitor interval=30s
查看集群状态,确认资源已创建并运行在某个节点上(此处显示在 server1)
[root@server1 ~]# pcs status
Cluster name: mycluster
Cluster Summary:
Stack: corosync (Pacemaker is running)
Current DC: server5 (version 2.1.10-3.el9_8-5693eaeee) - partition with quorum
Last updated: Thu Aug 20 16:05:51 2026 on server1
Last change: Thu Aug 20 16:05:43 2026 by root via root on server1
2 nodes configured
1 resource instance configured
Node List:
Online: [ server1 server5 ]
Full List of Resources:
VIP (ocf:heartbeat:IPaddr2): Started server1
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
输出解读: 状态显示 VIP 资源已在 server1 上启动(
Started server1)。
后续配置: 为了让应用通过 VIP 访问,需要在所有集群节点的 /etc/hosts 文件中进行相应映射。
cs
# 编辑 hosts 文件,添加 VIP 映射并移除旧的映射(如果存在)
[root@server1 ~]# vi /etc/hosts
# 在文件末尾添加一行:192.168.223.200 mfsmaster
# 同时,删除可能存在的将 mfsmaster 指向 server1 本地 IP 的条目。
重要:此修改需要同步到集群中的所有节点(server1 和 server5)。
搭建独立 iSCSI Target 存储服务器
将 server4 配置为 iSCSI Target 存储服务器,为其添加一块新磁盘,并将其通过网络共享给其他主机(Initiator 客户端)作为网络块设备使用。
1. 安装 Target 软件包
首先,在 server4 上安装 targetcli 工具并启动服务。
cs
# 安装Target 存储服务器
[root@server4 ~]# yum install -y targetcli
[root@server4 ~]# systemctl enable --now target
Created symlink /etc/systemd/system/multi-user.target.wants/target.service → /usr/lib/systemd/system/target.service.
2. 配置 iSCSI Target
进入 targetcli 交互式命令行界面,执行以下步骤:
cs
# 把本地磁盘 `/dev/nvme0n2`,通过网络共享出去,给其他主机(Initiator 客户端)当网络块磁盘使用。
[root@server4 ~]# targetcli
targetcli shell version 2.1.57
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
创建后端存储对象 block 类型 my_disk
/>/backstores/block create my_disk /dev/nvme0n2
创建 iSCSI Target(目标),IQN 名称:iqn.2026‑08.com.example:mfsdata
/> /iscsi create iqn.2026-08.com.example:mfsdata
创建 LUN,把后端存储 my_disk 绑定给 Target
/> /iscsi/iqn.2026-08.com.example:mfsdata/tpg1/luns create /backstores/block/my_disk
创建 ACL 访问控制列表:限制哪些 iSCSI 客户端 IQN 可以接入这个存储。
/> /iscsi/iqn.2026-08.com.example:mfsdata/tpg1/acls create iqn.2026-08.com.example:client
部署 iSCSI Initiator(客户端)
iSCSI Initiator(客户端)用于连接远端的 iSCSI Target 存储服务器,将网络上的块存储设备映射为本地磁盘使用。
cpp
# 安装 iSCSI 客户端软件包 iscsi-initiator-utils
[root@server1 ~]# yum install -y iscsi-initiator-utils
[root@server1 ~]# cd /etc/iscsi/
cs
# 配置 iSCSI 客户端的 InitiatorName,使其与 Target 服务端的 ACL 白名单匹配,完成存储接入的身份鉴权
[root@server1 iscsi]# vim initiatorname.iscsi
InitiatorName=iqn.2026-08.com.example:client
# 将配置文件同步到集群中的另一个节点(server5)
[root@server1 iscsi]# scp initiatorname.iscsi server5:/etc/iscsi/
cs
# 使用 sendtargets 方式发现 iSCSI 目标,获取存储信息并保存连接记录
[root@server1 ~]# iscsiadm -m discovery -t st -p 192.168.223.149
192.168.223.149:3260,1 iqn.2026-08.com.example:mfsdata
使用已发现的节点记录发起登录,建立 iSCSI 会话,使内核识别远端共享块存储设备
[root@server1 ~]# iscsiadm -m node -l
Login to [iface: default, target: iqn.2026-08.com.example:mfsdata, portal: 192.168.223.149,3260] successful.
在另一个节点(server5)上执行相同的发现和登录操作
[root@server5 ~]# iscsiadm -m discovery -t st -p 192.168.223.149
192.168.223.149:3260,1 iqn.2026-08.com.example:mfsdata
[root@server5 ~]# iscsiadm -m node -l
Login to [iface: default, target: iqn.2026-08.com.example:mfsdata, portal: 192.168.223.149,3260] successful.
最后使用 fdisk -l 命令查看识别到的共享磁盘
验证: 执行
fdisk -l命令后,若出现 model 为my_disk的/dev/sda设备,则表明 iSCSI Initiator 客户端已成功登录 Target,并识别到了远端共享的块存储设备。

通过以上步骤,我们成功构建了一个具备高可用性的存储集群环境:Pacemaker 确保了服务的高可用性,而 iSCSI 提供了共享块存储能力,两者结合为上层应用(如 MooseFS)提供了稳定、可靠的存储基础架构。