【Linux】基于 iSCSI + CLVM + GFS2 搭建高可用高性价比集群共享存储实战

admin / Linux / 已更新 2026-09-24 / 1712 字 · 约 16 分钟 / 598 次阅读 /

一、集群共享存储核心架构与技术栈

在多节点高可用集群中,多个计算节点需要并发读写底层同一份持久化数据。传统单机文件系统(如 ext4、xfs)缺乏跨节点的分布式锁机制,直接并发挂载会导致文件系统元数据损坏。

本方案基于 RedHat Cluster Suite(RHCS) 技术栈,搭建高性价比、支持动态扩容的共享存储体系:

+-------------------------------------------------------------+
|                 GFS2 (全局分布式集群文件系统)                 |
+-------------------------------------------------------------+
|               CLVM (Cluster LVM 集群逻辑卷管理)              |
+-------------------------------------------------------------+
|             CMAN (集群管理) + RGManager / DLM 分布式锁       |
+-------------------------------------------------------------+
|           iSCSI Initiator (各计算节点网络块设备映射)           |
+-------------------------------------------------------------+
                              ▲
                              │ 网络存储传输 (TCP/IP IP-SAN)
                              ▼
+-------------------------------------------------------------+
|           iSCSI Target Server (IP-SAN 存储服务器)           |
+-------------------------------------------------------------+

核心组件职责对比

组件名称 核心角色 功能说明 关键管理命令 / 服务
iSCSI Target 集中块存储服务端 通过 TCP/IP 网络将物理磁盘导出为网络 LUN 块设备 tgtd, tgtadm
iSCSI Initiator 块存储客户端 在计算节点挂载远端 target 磁盘并识别为本地 /dev/sdX iscsiadm, iscsid
CMAN 集群成员管理器 负责集群节点发现、仲裁决策(Quorum)与心跳保活 cman, ccs_tool
CLVM 集群逻辑卷管理 将 LVM 元数据在全集群节点实时同步,支持动态在线扩容 clvmd, lvmconf
GFS2 分布式集群文件系统 基于 DLM 分布式锁支持集群多节点同时安全挂载与读写 gfs2-utils, mkfs.gfs2

二、集群基础环境准备与规划

1. 节点规划与网络解析

主机角色 主机名 (FQDN) IP 地址 存储 / 角色说明
Target 存储机 target.xdl.com 192.168.1.10 提供 IP-SAN 共享磁盘(添加额外的 /dev/sdb)
计算节点 1 node1.xdl.com 192.168.1.20 集群控制节点 / NTP 本地时间源服务器
计算节点 2 node2.xdl.com 192.168.1.30 集群计算节点
计算节点 3 node3.xdl.com 192.168.1.40 集群计算节点

在所有节点(target, node1~3)配置统一的 /etc/hosts 解析:

# 配置 hosts 解析
cat >> /etc/hosts << 'EOF'
192.168.1.10    target.xdl.com   target
192.168.1.20    node1.xdl.com    node1
192.168.1.30    node2.xdl.com    node2
192.168.1.40    node3.xdl.com    node3
EOF

# 同步给其余节点
scp /etc/hosts node1:/etc/
scp /etc/hosts node2:/etc/
scp /etc/hosts node3:/etc/

2. 双向 SSH 免密认证配置

在各节点之间建立免密互信通道,方便批量运维与文件推送:

# 在 target 服务器上执行并分发
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3

# 在 node1~node3 计算节点上重复互信配置
for node in node1 node2 node3; do
    ssh $node 'ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa; ssh-copy-id target'
done

3. 全局高精度时钟同步 (NTP)

[!WARNING] 集群心跳第一前置:CMAN 集群与 GFS2 分布式锁极其依赖严格统一的时钟源。节点间时钟漂移若超过几秒,将直接触发仲裁超时把异常节点踢出集群(Fencing)。

以 node1 作为局域网内部授时基准源:

# 1. 在 node1 上配置 /etc/ntp.conf
cat > /etc/ntp.conf << 'EOF'
driftfile /var/lib/ntp/drift
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
server 127.127.1.0
fudge 127.127.1.0 stratum 10
EOF

service ntpd start && chkconfig ntpd on

# 2. 其余节点 (target, node2, node3) 指向 node1 进行时钟同步
for host in target node2 node3; do
    ssh $host "ntpdate -u 192.168.1.20"
done

三、iSCSI 共享块存储服务搭建与挂载

1. 服务端 Target 存储池配置 (Target 主机)

安装 scsi-target-utils,将 /dev/sdb 格式化为 iSCSI LUN 导出:

yum install -y scsi-target-utils

# 配置 Target 共享策略
cat > /etc/tgt/targets.conf << 'EOF'
<target iqn.2017-05.com.xdl:teststore.sdb>
    <backing-store /dev/sdb>
        vendor_id test
        lun 4
    </backing-store>
    incominguser asd 123456
    initiator-address 192.168.1.0/24
</target>
EOF

service tgtd start
chkconfig tgtd on

# 查看导出资源状态
tgtadm -L iscsi -o show -m target

2. 客户端 Initiator 网络磁盘挂载 (node1 ~ node3)

在 3 台计算节点上安装客户端并完成 CHAP 身份验证:

# 定义批量操作快捷函数
for b in {1..3}; do
ssh node$b "yum -y install iscsi-initiator-utils"
ssh node$b "echo 'InitiatorName=iqn.2017-05.com.xdl:node$b' > /etc/iscsi/initiatorname.iscsi"

# 注入 CHAP 认证密码
ssh node$b "cat >> /etc/iscsi/iscsid.conf << 'EOF'
node.session.auth.authmethod = CHAP
node.session.auth.username = asd
node.session.auth.password = 123456
EOF"

# 发现并登录 iSCSI Target
ssh node$b "iscsiadm -m discovery -t sendtargets -p 192.168.1.10"
ssh node$b "iscsiadm -m node -T iqn.2017-05.com.xdl:teststore.sdb --login"
done

[!TIP] 登录成功后,在各节点执行 lsblk,即可看到新增的共享网络块设备 /dev/sdb。


四、CMAN 集群基础设施与仲裁搭建

1. 安装 CMAN 与 RGManager

for b in {1..3}; do
    ssh node$b "yum install -y cman rgmanager"
    # 关闭会干扰集群虚拟 IP 的 NetworkManager
    ssh node$b "service NetworkManager stop && chkconfig NetworkManager off"
done

2. 创建并分发集群拓扑配置 (node1)

# 1. 初始化集群 testcluster
ccs_tool create testcluster

# 2. 添加隔离机制 Fence (测试环境使用 manual 隔离设备)
ccs_tool addfence meatware fence_manual

# 3. 将 3 个节点加入集群
ccs_tool addnode -n 1 -f meatware node1.xdl.com
ccs_tool addnode -n 2 -f meatware node2.xdl.com
ccs_tool addnode -n 3 -f meatware node3.xdl.com

# 4. 同步配置文件到 node2 和 node3
scp /etc/cluster/cluster.conf node2:/etc/cluster/
scp /etc/cluster/cluster.conf node3:/etc/cluster/

3. 启动 CMAN 集群服务

for b in {1..3}; do
    ssh node$b "echo 'CMAN_QUORUM_TIMEOUT=0' >> /etc/sysconfig/cman"
    ssh node$b "service cman start && chkconfig cman on"
done

# 在 node1 上检查集群仲裁法定人数与节点健康状态
clustat

五、CLVM 集群逻辑卷配置

启用集群化 LVM,防止多节点同时对卷组(VG)元数据做修改产生冲突:

# 1. 各计算节点安装并启用集群模式
for b in {1..3}; do
    ssh node$b "yum install -y lvm2-cluster"
    ssh node$b "lvmconf --enable-cluster"
    ssh node$b "service clvmd start && chkconfig clvmd on"
done

# 2. 在任意单节点 (如 node1) 创建集群卷
pvcreate /dev/sdb
vgcreate clustervg /dev/sdb
lvcreate -L 10G -n clusterlv clustervg

# 3. 检查逻辑卷是否已在各节点全部同步识别
lvdisplay /dev/clustervg/clusterlv

六、GFS2 集群文件系统格式化与多节点安全挂载

1. 格式化 GFS2 文件系统

GFS2 格式化时必须指定集群名称与日志锁表数量(-j 参数需大于等于挂载节点数):

# 在 node1 上安装 gfs2-utils
yum install -y gfs2-utils

# 格式化集群逻辑卷 (testcluster 为集群名, gfs2_store 为文件系统名, -j 3 支持 3 节点并发)
mkfs.gfs2 -p lock_dlm -t testcluster:gfs2_store -j 3 /dev/clustervg/clusterlv

2. 挂载与并发读写验证

在所有节点上创建挂载点并挂载:

for b in {1..3}; do
    ssh node$b "mkdir -p /mnt/shared_gfs2"
    ssh node$b "mount -t gfs2 /dev/clustervg/clusterlv /mnt/shared_gfs2"
done

# 测试数据并发一致性
echo "Hello from node1 $(date)" > /mnt/shared_gfs2/test.txt
ssh node2 "cat /mnt/shared_gfs2/test.txt"
ssh node3 "echo 'Appended by node3' >> /mnt/shared_gfs2/test.txt"
cat /mnt/shared_gfs2/test.txt

[!TIP] 在线动态扩容特性:后期若需给共享存储扩容,只需在 Target 扩展磁盘后,在任意节点执行 lvextend -L +10G /dev/clustervg/clusterlv,接着执行 gfs2_grow /mnt/shared_gfs2,无需停机即可完成秒级在线扩容。

admin

admin

云原生架构 · 全栈开发

感谢阅读本文!记录系统架构思考与实战复盘。专注于 Python、Django、PostgreSQL 与云原生容器化工程实践。