一、集群共享存储核心架构与技术栈
在多节点高可用集群中,多个计算节点需要并发读写底层同一份持久化数据。传统单机文件系统(如 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,无需停机即可完成秒级在线扩容。