一、部署分布式文件系统
添加moosefs的repo源,每个节点都需要
[root@server1 ~]# curl "https://repository.moosefs.com/RPM-GPG-KEY-MooseFS" > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
[root@server1 ~]# curl "https://repository.moosefs.com/MooseFS-4-el9.repo" > /etc/yum.repos.d/MooseFS.repo
每个节点分别安装每个节点需要的软件
master节点:
[root@server1 ~]# yum install moosefs-master moosefs-cgi moosefs-cgiserv moosefs-cli
chunkserver节点:
[root@server2 ~]# yum install install moosefs-chunkserver
[root@server3 ~]# yum install install moosefs-chunkserver
client节点:
[root@server4 ~]# yum install moosefs-client
每个节点都添加解析,方便后面挂载和操作
1.1 master节点部署
先开启gui,再开启master
[root@server1 ~]# systemctl enable --now moosefs-gui.service
[root@server1 ~]# systemctl enable --now moosefs-master.service
浏览器访问没有问题
1.2 chunkserver节点部署
chunkserver分别添加一块新的硬盘,记得关机添加,否则会将引导硬盘换成你新添加的硬盘
新添加的硬盘
然后进行分区,格式化,挂载
格式化
[root@server2 ~]# mkfs.xfs /dev/nvme0n2p1
UUID进行挂载
[root@server2 ~]# mkdir /mnt/ssd01
[root@server2 ~]# blkid
[root@server2 ~]# vim /etc/fstab
[root@server2 ~]# systemctl daemon-reload
[root@server2 ~]# mount -a
修改权限属性,否则服务会起不来
[root@server2 ~]# chown mfs.mfs /mnt/ssd01/
添加文件内容
[root@server2 ~]# cd /etc/mfs
[root@server2 mfs]# ls
mfschunkserver.cfg mfschunkserver.cfg.sample mfshdd.cfg mfshdd.cfg.sample
[root@server2 mfs]# vim mfshdd.cfg
启动服务
[root@server2 mfs]# systemctl enable --now moosefs-chunkserver
server3是相同的步骤
1.3 client节点部署:server4
[root@server4 ~]# mkdir /mnt/mfs
[root@server4 ~]# mfsmount /mnt/mfs -H mfsmaster #后面替换成自己的解析域名
1.4 自定义副本策略
Storage Class(存储类):MooseFS可以自定义副本策略,不再使用全局默认副本数,针对目录 / 文件单独指定副本数量、存储节点,实现不同数据差异化存储。
进入MFS挂载目录,须进入MooseFS挂载点,所有mfs管理命令只对挂载点内文件生效
创建自定义存储类 hot_1cp,返回ok代表存储类创建成功,该策略注册到MFS元数据服务
[root@server4 ~]# cd /mnt/mfs
[root@server4 mfs]# mfsscadmin create -K 1* hot_1cp
storage class make hot_1cp: ok
[root@server4 mfs]# mkdir dir1
[root@server4 mfs]# cd dir1/
[root@server4 dir1]# cp /etc/hosts .
[root@server4 dir1]# ls
hosts
[root@server4 dir1]# mfsfileinfo hosts
创建测试目录,上传测试文件,建立测试环境,拷贝/etc/hosts作为测试文件,此时文件继承MFS全局默认副本策略(默认 2 副本)。
给目录递归应用存储类,执行这条命令,仅仅修改元数据信息,告诉master:这里的文件要遵守 hot_1cp 策略;磁盘上的chunk副本不会立刻删除,master后台异步任务慢慢调整副本数量。
[root@server4 dir1]# mfssclass set hot_1cp -r .
查询文件绑定的存储类
[root@server4 dir1]# mfssclass get hosts
执行完策略后异步删除其中一份,只剩1份,真正实现hot_1cp(1 副本)。
[root@server4 dir1]# mfsfileinfo hosts
| 命令 | 查看对象 | 作用 |
|---|---|---|
mfssclass get hosts | 元数据 | 看文件绑定哪个存储类模板,只是标记,不代表磁盘实际状态 |
mfsfileinfo hosts | 底层磁盘数据 | 看真实副本几份、存哪些服务器,用来确认策略真正落地 |
1.5 标签 (LABELS) + 按标签分配存储类
新增server5作为chunkserver节点
创建/mnt/hdd01是server5这台chunkserver用来存放MooseFS数据块的本地目录。
moosefs‑chunkserver服务运行身份是mfs用户,目录权限必须属于mfs,否则服务启动失败,无法读写磁盘
[root@server5 ~]# mkdir /mnt/hdd01
[root@server5 ~]# chown mfs.mfs /mnt/hdd01/
[root@server5 ~]# cd /etc/mfs
[root@server5 mfs]# vim mfshdd.cfg
mfshdd.cfg指定chunkserver使用哪些本地磁盘目录存储数据;一行代表一个存储目录。
[root@server5 mfs]# systemctl enable --now moosefs-chunkserver
给所有chunkserver节点打LABELS标签
[root@server2 ~]# cd /etc/mfs
[root@server2 mfs]# vim mfschunkserver.cfg
S表示固态盘,H表示机械盘
server2
server3
添加一台server5
要重启服务
存储类指定只存标签A的节点
server2的IP是192.168.159.152,标签为A;server3的IP是192.168.159.153,标签为B
[root@server4 dir1]# mfsscadmin create -K A 1CP_A
[root@server4 mfs]# mfssclass set -r 1CP_A dir1/
[root@server4 dir1]# mfsfileinfo hosts
原先文件副本在server3(153);应用存储类‑K A之后,master后台迁移数据块,副本迁移到带 A 标签的server2(192.168.159.152)。
存储类的‑K 参数可以根据标签约束副本存放节点。
存储类,同时指定A、C两个标签,保存2份副本
[root@server4 mfs]# mkdir dir2
[root@server4 mfs]# cd dir2
[root@server4 dir2]# cp /etc/passwd .
2份副本,一份放在标签A(server2 SSD),一份放在标签C(server5 HDD 机械盘)。
[root@server4 dir2]# mfsscadmin create -K A,C 2CP_AC
[root@server4 dir2]# mfssclass set -r 2CP_AC dir2/
[root@server4 dir2]# mfsfileinfo passwd
1.6 pacemaker高可用
server1对server5进行免密
server1和server5都将repo源中的高可用打开
[root@server1 ~]# cd /etc/yum.repos.d
[root@server1 yum.repos.d]# vim rocky-addons.repo
部署集群只需要在1 干
[root@server1 ~]# pcs host auth server1 server5 -u hacluster -p 123456
设置密码
[root@server5 yum.repos.d]# passwd hacluster
[root@server1 ~]# pcs cluster setup mycluster server1 server5
解决警告
[root@server1 ~]# pcs property set stonith-enabled=false
[root@server1 ~]# pcs property set no-quorum-policy=ignore
[root@server1 ~]# pcs resource create VIP ocf:heartbeat:IPaddr2 ip=192.168.159.100 cidr_netmask=24 op monitor interval=30s
master解析指向VIP
[root@server1 ~]# vim /etc/hosts
二、pacemaker与iscsi存储配合实现MooseFS Master高可用
target:服务端(提供磁盘,server4),把本地磁盘对外发布
initiator:客户端(server1、server5),通过网络远程挂载这块共享磁盘。
后续交给 pacemaker 高可用集群管理这个iSCSI存储资源。
2.1 iSCSI Target服务端配置
给server4添加新的磁盘,安装target服务端工具包
[root@server4 ~]# yum install -y targetcli
[root@server4 ~]# systemctl start target
[root@server4 ~]# targetcli
进入targetcli交互 shell
iscsi底层存储
创建后端存储,绑定server4本地磁盘分区/dev/nvme0n2,命名my_disk
/> /backstores/block create my_disk /dev/nvme0n2
创建iSCSI target,定义对外共享的iqn名称
/iscsi> create iqn.2026-08.com.example:mfsdata在target下创建lun,把后端磁盘my_disk映射给iSCSI共享
/iscsi> iqn.2026-08.com.example:mfsdata/tpg1/luns create /backstores/block/my_disk添加访问ACL,允许指定iqn名称的客户端接入访问磁盘
/iscsi> iqn.2026-08.com.example:mfsdata/tpg1/acls create iqn.2026-08.com.example:client
2.2 iSCSI Initiator客户端配置
通过网络,发现并挂载server4共享出来的iSCSI磁盘
server1和server5安装,步骤一样
[root@server1 ~]# yum install -y iscsi-initiator-utils
[root@server1 ~]# vim /etc/iscsi/initiatorname.iscsi
[root@server1 ~]# systemctl restart iscsid #文件编辑后需要重启
[root@server1 ~]# iscsiadm -m discovery -t st -p 192.168.159.154
[root@server5 ~]# yum install -y iscsi-initiator-utils
[root@server5 ~]# vim /etc/iscsi/initiatorname.iscsi #文件编辑后需要重启
[root@server5 ~]# systemctl restart iscsid
[root@server5 ~]# iscsiadm -m discovery -t st -p 192.168.159.154
修改客户端initiatorname,必须和服务端ACL里面写的iqn完全一致
[root@server5 ~]# yum install -y iscsi-initiator-utils
[root@server5 ~]# vim /etc/iscsi/initiatorname.iscsi #文件编辑后需要重启
[root@server5 ~]# systemctl restart iscsid
[root@server5 ~]# iscsiadm -m discovery -t st -p 192.168.159.154
发现iSCSI target服务端(server4 IP:192.168.159.154)
iSCSI客户端登录target存储
iscsiadm -m node -l
如果做错了,有缓存,以下操作
[root@server1 ~]# iscsiadm -m node -o delete -T 你创建的iqn名称
2.3 磁盘分区、格式化,迁移MooseFS Master元数据
提前手动停掉moosefs‑master服务,不能让旧元数据目录还在读写。
对iSCSI磁盘/dev/sda做分区
[root@server1 ~]# fdisk /dev/sda
格式化为XFS文件系统
[root@server1 ~]# mkfs.xfs /dev/sda1
临时挂载到/mnt,用来迁移原有元数据
[root@server1 ~]# mount /dev/sda1 /mnt/
moosefs‑master运行身份mfs,目录权限必须匹配
[root@server1 ~]# chown mfs.mfs /mnt/进入原有master元数据存放目录
[root@server1 ~]# cd /var/lib/mfs/
完整拷贝全部元数据到iSCSI磁盘,‑p保留权限、时间属性
[root@server1 mfs]# cp -p * /mnt/
[root@server1 mfs]# umount /mnt/iSCSI磁盘挂载到mfs master真实工作目录
[root@server1 ~]# mount /dev/sda1 /var/lib/mfs[root@server1 ~]# chown mfs.mfs /var/lib/mfs
[root@server1 ~]# umount /var/lib/mfs
2.4 Pacemaker创建集群资源
先挂载文件系统 (mfsdata) → 再启动 moosefs‑master (mfsmaster);资源组统一管理,故障整体漂移;组内已经预先存在VIP虚拟IP资源。
#创建Filesystem资源:挂载iSCSI分区/dev/sda1到/var/lib/mfs,xfs文件系统
[root@server1 ~]# pcs resource create mfsdata ocf:heartbeat:Filesystem device=/dev/sda1 directory=/var/lib/mfs fstype=xfs op monitor interval=1min
#创建moosefs‑master系统服务资源
[root@server1 ~]# pcs resource create mfsmaster systemd:moosefs-master op monitor interval=30s#将VIP、mfsdata、mfsmaster加入同一个资源组 mfscluster
[root@server1 ~]# pcs resource group add mfscluster VIP mfsdata mfsmaster
最开始在server5上,将server5休眠后,会回到server1
让server5成为备机
访问MooseFS WEB页面,使用集群VIP地址192.168.159.100,无论资源漂移到哪台主机,访问地址不变。WEB界面Metadata server显示的IP就是VIP。
如果发现有错误,导致VIP或mfsmaster一直是stopped状态,可以清理一下纪录缓存
[root@server1 ~]# pcs resource cleanup mfsmaster
[root@server1 ~]# pcs resource cleanup VIP
三、Pacemaker SBD磁盘隔离
集群脑裂风险:两个节点网络断开,两边都认为对方挂掉,同时挂载iSCSI共享磁盘,直接损坏 MooseFS元数据。SBD通过一块共享磁盘做 “投票板”,节点收不到对方心跳,就向磁盘写reset指令,把故障机器强制重启,保证同一时间只有一个节点接管业务。
3.1 Windows端VMware命令创建共享磁盘
以管理员身份运行cmd,进入VMware安装目录,创建100MB的SBD共享磁盘sbd.vmdk
cd "D:\Program Files (x86)\VMware\VMware Workstation"
.\vmware-vdiskmanager.exe -c -s 100MB -a lsilogic -t 2 "E:\vm\sbd.vmdk"
创建虚拟磁盘
修改之前mfsdata资源,替换为by‑uuid路径,防止新添加的磁盘造成漂移,集群起不来
[root@server1 ~]# ll /dev/disk/by-uuid/
# 更新Filesystem资源,把原来device=/dev/sda1换成uuid路径
[root@server1 ~]# pcs resource update mfsdata device=/dev/disk/by-uuid/6e502f00-32f2-4ee5-a941-c32c81651290
[root@server1 ~]# pcs resource clear mfscluster
[root@server1 ~]# pcs resource debug-start mfsdata
[root@server1 ~]# pcs resource enable mfscluster
[root@server1 ~]# pcs status
添加虚拟磁盘,选择1:0,并且是独立、永久,如果有快照,则是灰色的,无法选择
将引导磁盘放在新添加的磁盘前面,否则会进入单机引导界面
编辑.vmx文件,记事本打开,添加三行
查看是否识别到新加的虚拟磁盘
保证server1和server5上的id要一致
3.2 加载看门狗模块
# 安装sbd隔离代理包
[root@server1 ~]# dnf install -y sbd fence-agents-all
# 加载内核软看门狗softdog,SBD隔离依赖看门狗设备/dev/watchdog
[root@server1 ~]# modprobe softdog# 设置开机自动加载softdog模块
[root@server1 ~]# echo "softdog" > /etc/modules-load.d/softdog.conf# 验证看门狗设备是否生成
[root@server1 ~]# ls /dev/watchdog
确认内核模块加载成功
[root@server1 ~]# lsmod | grep softdog
3.3 初始化SBD共享磁盘
用刚才的id初始化
用自己本机真实的uuid
[root@server1 ~]# sbd -d /dev/disk/by-id/scsi-36000c29e9fc1cf4aafb997fc68715d52 create
查看SBD磁盘头部信息,确认初始化成功
[root@server1 ~]# sbd -d /dev/disk/by-id/scsi-36000c29e9fc1cf4aafb997fc68715d52 dump
3.4 Pacemaker创建STONITH SBD隔离资源
创建stonith隔离资源fence_sbd
[root@server1 ~]# pcs stonith create sbd-fence fence_sbd devices="/dev/disk/by-id/scsi-36000c29e9fc1cf4aafb997fc68715d52" op monitor interval=30s timeout=20s op start timeout=20s op stop timeout=20s
全局开启stonith隔离功能
[root@server1 ~]# pcs property set stonith-enabled=true
重启整个集群,加载SBD隔离配置
[root@server1 ~]# pcs cluster stop --all[root@server1 ~]# pcs cluster start --all
stonith 资源 → fence 代理 → sbd 底层。
[root@server1 ~]# pcs cluster stop --all
[root@server1 ~]# systemctl unmask sbd
[root@server1 ~]# systemctl enable sbd[root@server1 ~]# systemctl daemon-reload
[root@server1 ~]# pcs cluster start --all
3.5 SBD 隔离功能测试实验
[root@server1 ~]# sbd -d /dev/disk/by-id/scsi-36000c29e9fc1cf4aafb997fc68715d52 list
查看SBD磁盘slot槽位状态,两个节点都是clear正常状态
执行完server5会重启
[root@server1 ~]# sbd -d /dev/disk/by-id/scsi-36000c29e9fc1cf4aafb997fc68715d52 message server5 reset
server5执行stonith隔离,强制重启server1
[root@server5 ~]# pcs stonith fence server1
server1强制重启
资源被server5接管
四、提醒与坑点
- VMware环境必须修改vmx的4行参数,关闭磁盘锁、开启共享SCSI总线;两台虚拟机都改。
- SBD磁盘只需要100M,不需要大空间。
- 全部磁盘配置禁止写/dev/sda这种设备名,统一使用/dev/disk/by‑id,防止开机磁盘顺序漂移集群瘫痪。
- 虚拟机没有硬件看门狗,必须加载softdog内核模块生成/dev/watchdog,否则SBD隔离失效。
- 磁盘模式必须【独立‑永久】,有快照会灰色无法勾选,先删除快照。
- STONITH 隔离作用:集群高可用不允许关闭stonith‑enabled,没有隔离的集群生产环境不安全。