【MooseFS分布式】

一、集群规划

主机名IP 地址角色安装包
server1192.168.247.142Master + Metalogger + CGI 监控moosefs-master, moosefs-metalogger, moosefs-cli, moosefs-gui
server2192.168.247.143ChunkServer(数据节点)moosefs-chunkserver
server3192.168.247.145ChunkServer(数据节点)moosefs-chunkserver
server4192.168.247.146Clientmoosefs-client

二、所有节点统一准备(4 台都执行)

1. 设置主机名与 hosts 解析

[root@server1 ~]# vim /etc/hosts

2. 添加 MooseFS 官方 EL9 YUM 仓库

curl "https://repository.moosefs.com/RPM-GPG-KEY-MooseFS" > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
curl "http://repository.moosefs.com/MooseFS-4-el9.repo" > /etc/yum.repos.d/MooseFS.repo
dnf makecache

三、Master 节点部署(mfs-master)

1. 安装

dnf install -y moosefs-master moosefs-metalogger moosefs-cli moosefs-gui

2. 准备配置文件

cd /etc/mfs
cp mfsmaster.cfg.sample mfsmaster.cfg
cp mfsexports.cfg.sample mfsexports.cfg
cp mfstopology.cfg.sample mfstopology.cfg
cp mfsmetalogger.cfg.sample mfsmetalogger.cfg

3. 配置 mfsmaster.cfg(关键项)

# 基本默认即可,确认以下项
cat >> /etc/mfs/mfsmaster.cfg << 'EOF'
# 数据目录
DATA_PATH = /var/lib/mfs
# 工作用户
WORKING_USER = mfs
WORKING_GROUP = mfs
# 监听地址(默认0.0.0.0即可)
# MATOML_LISTEN_HOST = *
# MATOCS_LISTEN_HOST = *
# MATOCL_LISTEN_HOST = *
EOF

4. 配置 mfsexports.cfg(客户端挂载权限)

# 允许整个网段读写,无需密码
cat > /etc/mfs/mfsexports.cfg << 'EOF'
192.168.247.0/24    /    rw,alldirs,maproot=0
EOF

5. 初始化元数据

cd /var/lib/mfs
# 首次启动需要metadata.mfs文件,用empty模板
cp metadata.mfs.empty metadata.mfs
chown mfs:mfs metadata.mfs

6. 启动 Master 并设为开机自启

systemctl enable --now moosefs-master
systemctl status moosefs-master

7. 启动 Metalogger(元数据备份)

# mfsmetalogger.cfg 默认MASTER_HOST = mfsmaster,能解析即可
# 确认 /etc/hosts 里 mfsmaster 指向本机或直接改 MASTER_HOST = 127.0.0.1
sed -i 's/^# MASTER_HOST = mfsmaster/MASTER_HOST = 127.0.0.1/' /etc/mfs/mfsmetalogger.cfg

systemctl enable --now moosefs-gui

8. 启动 Web 监控界面(CGI)

systemctl enable --now moosefs-cgiserv
# 默认监听9425端口,浏览器访问 http://192.168.247.142:9425

四、ChunkServer 节点部署(两台操作相同)

1. 安装

dnf install -y moosefs-chunkserver

2. 准备配置文件

cd /etc/mfs
cp mfschunkserver.cfg.sample mfschunkserver.cfg
cp mfshdd.cfg.sample mfshdd.cfg

3. 配置 mfschunkserver.cfg

# 指定Master地址(关键!)
sed -i 's/^# MASTER_HOST = mfsmaster/MASTER_HOST = mfsmaster/' /etc/mfs/mfschunkserver.cfg

# 可选:调整HDD空间预留
# HDD_LEAVE_SPACE_DEFAULT = 256MiB

4. 配置数据存储目录 mfshdd.cfg

虚拟机增添一块硬盘

对 /dev/nvme0n2 创建 GPT 分区、格式化 xfs

# 创建gpt分区表,整块磁盘一个分区
parted -s /dev/nvme0n2 mklabel gpt
parted -s /dev/nvme0n2 mkpart chunk xfs 0% 100%

# 通知内核重新识别分区
udevadm trigger

# 格式化xfs
mkfs.xfs /dev/nvme0n2p1

创建挂载目录,写入 /etc/fstab 开机自动挂载

mkdir -p /mnt/mfsdata

#写入fstab
echo '/dev/nvme0n2p1  /mnt/mfsdata  xfs  defaults  0 0' >> /etc/fstab

#挂载
mount -a

#确认挂载成功
df -h /mnt/mfsdata

输出应该看到 /dev/nvme0n2p1 20G挂载到/mnt/mfsdata

修改目录权限给 mfs 用户

chown mfs:mfs /mnt/mfsdata
ls -ld /mnt/mfsdata

修改 mfshdd.cfg,指向这个数据盘,不要用 /mnt/mfschunk 测试目录

#覆盖写入,只写这一行
echo "/mnt/mfsdata" > /etc/mfs/mfshdd.cfg

#确认内容
cat /etc/mfs/mfshdd.cfg

⚠️注意:两台 chunkserver(server2 server3 )每台都完整执行上面全部步骤,每台各自使用本机的/dev/nvme0n2

5. 启动 ChunkServer

systemctl enable --now moosefs-chunkserver
systemctl status moosefs-chunkserver

五、客户端挂载(mfs-chunk3 或任意需要访问存储的机器)

1. 安装客户端

dnf install -y moosefs-client

2. 加载 fuse 模块并创建挂载点

modprobe fuse
echo "fuse" > /etc/modules-load.d/fuse.conf
mkdir -p /mnt/mfs

3. 挂载 MooseFS

# 临时挂载
mount -t moosefs mfsmaster:/ /mnt/mfs

# 开机自动挂载(写入fstab)
echo "mfsmaster:/  /mnt/mfs  moosefs  defaults,_netdev  0 0" >> /etc/fstab
mount -a

4. 验证

df -h /mnt/mfs
# 应看到类似:mfs-master:/  XXXG  XXXG  0%  /mnt/mfs

搭建高可用

部署Pacemaker集群

安装软件

[root@server1 ~]# vim /etc/yum.repos.d/rocky-addons.repo

[root@server5 ~]# vim /etc/yum.repos.d/rocky-addons.repo

[root@server1 ~]# yum install -y pacemaker corosync pcs fence-agents

[root@server5 ~]# yum install -y pacemaker corosync pcs fence-agents

启动服务

[root@server1 ~]# systemctl enable --now pcsd.service

[root@server5 ~]# systemctl enable --now pcsd.service

设置密码

[root@server1 ~]# echo westos | passwd --stdin hacluster

执行主机认证

[root@server1 ~]# pcs host auth server1 server5 -u hacluster -p westos

创建集群

[root@server1 ~]# pcs cluster setup mycluster server1 server5

启动并启用集群

[root@server1 ~]# pcs cluster start --all

[root@server1 ~]# pcs cluster enable --all

创建vip

[root@server1 ~]# pcs resource create VIP ocf:heartbeat:IPaddr2 ip=192.168.247.200 cidr_netmask=24 op monitor interval=30s

禁用 STONITH(仅测试/学习环境)

[root@server1 ~]# pcs property set stonith-enabled=false

设置集群失去仲裁时的策略

[root@server1 ~]# pcs property set no-quorum-policy=ignore

验证

[root@server1 ~]# pcs status

修改主机解析

[root@server1 ~]# vim /etc/hosts

同步所有节点

[root@server1 ~]# scp /etc/hosts server2:/etc/hosts
[root@server1 ~]# scp /etc/hosts server3:/etc/hosts
[root@server1 ~]# scp /etc/hosts server4:/etc/hosts
[root@server1 ~]# scp /etc/hosts server5:/etc/hosts

部署iSCSI服务

一、server4 部署 iSCSI Target

添加一块硬盘

1. 安装并启动 targetcli

dnf install -y targetcli
systemctl enable --now target.service

2. 配置 Target(直接使用整盘 /dev/nvme0n2)

进入 targetcli 交互命令行:

targetcli

在 targetcli 交互界面依次执行下面命令:

# 使用整块 NVMe 盘作为后端存储(无需分区/格式化)
/backstores/block create name=mfs_meta dev=/dev/nvme0n2

# 创建 iSCSI Target
/iscsi create iqn.2026-08.com.example:server4.mfs-meta

# 关联 LUN
/iscsi/iqn.2026-08.com.example:server4.mfs-meta/tpg1/luns create /backstores/block/mfs_meta

# 配置 ACL(仅允许 server1 和 server5 访问)
/iscsi/iqn.2026-08.com.example:server4.mfs-meta/tpg1/acls create iqn.2026-08.com.example:server1
/iscsi/iqn.2026-08.com.example:server4.mfs-meta/tpg1/acls create iqn.2026-08.com.example:server5

# 绑定监听地址为 server4 的业务 IP
/iscsi/iqn.2026-08.com.example:server4.mfs-meta/tpg1/portals create 192.168.247.146

# 保存配置并退出交互模式
saveconfig
exit

3. 验证 Target 状态

# 查看完整iSCSI配置树,确认 backstores、luns、acls、portals 均正常显示
targetcli ls

# 检查3260监听端口,确认在 192.168.247.146 上监听
ss -tlnp | grep 3260

二、server1 & server5 部署 Initiator(两节点均需执行)

 安装软件包

dnf install -y iscsi-initiator-utils device-mapper-multipath

配置 iSCSI Initiator

# 设置 Initiator Name(确保两节点名称不同)
echo "InitiatorName=iqn.2026-08.com.example:$(hostname)" > /etc/iscsi/initiatorname.iscsi

# 发现 Target
iscsiadm -m discovery -t st -p 192.168.247.146

# 登录 Target
iscsiadm -m node --login

# ⭐ 关键:设置为开机自动登录(替代 OCF iSCSI Agent)
iscsiadm -m node -o update -n node.startup -v automatic

# 启动并启用 iscsid 服务
systemctl enable --now iscsid.service

配置 Multipath

# 生成配置文件
cat > /etc/multipath.conf << 'EOF'
defaults {
    user_friendly_names yes
    find_multipaths no
}
devices {
    device {
        vendor "LIO-ORG"
        product "*"
        path_grouping_policy failover
        path_checker tur
        failback immediate
    }
}
EOF

# 启动并启用 multipathd
systemctl enable --now multipathd.service

# 验证多路径设备(确认 mpathb 存在且状态为 active)
multipath -ll

格式化文件系统(仅首次,任一节点执行)

mkfs.xfs -f /dev/mapper/mpathb

⚠️ 注意:此步骤只需执行一次。XFS 不支持多节点同时挂载,后续由 Pacemaker 保证单活。


三、纳入 Pacemaker 管理

由 Pacemaker 管理,禁止开机自启

systemctl disable moosefs-master

创建资源组 mfs_ha_group

# 文件系统资源(依赖 /dev/mapper/mpathb 已由 multipath 自动就绪)
pcs resource create MFS_Meta_FS ocf:heartbeat:Filesystem \
    device="/dev/mapper/mpathb" \
    directory="/var/lib/mfs" \
    fstype=xfs \
    options="noatime,nodiratime,inode64" \
    op monitor interval=30s

# MooseFS Master 服务资源
pcs resource create MFS_Master systemd:moosefs-master \
    op monitor interval=30s


# 加入资源组(顺序 = 启动顺序:FS → Service → VIP)
pcs resource group add mfs_ha_group MFS_Meta_FS MFS_Master VIP

验证最终状态

server1宕机后服务自动切换到server5

pacemaker + fence_sbd

创建 SBD 共享 vmdk 磁盘

管理员身份打开powershell,进入 VMware 安装目录

创建 1GB 厚置磁盘

  • -c 创建磁盘
  • -s 1GB SBD 不需要很大,1G 足够
  • -a lsilogic SCSI 适配器
  • -t 2 预分配厚置磁盘(关键,SBD 不能用精简置零)

E:\vm 提前手动建好文件夹,不要放在单个虚拟机目录内,方便多节点共享。

给每台集群虚拟机添加 SBD 磁盘

所有虚拟机必须关机,不能开机状态操作

  1. 编辑虚拟机设置 → 添加 → 硬盘 → SCSI → 使用现有虚拟磁盘
  2. 浏览选中:E:\vm\sbd.vmdk
  3. 弹出转换提示:选择【保持现有格式】,不要转换
  4. 选中刚添加的硬盘 →【高级】 模式勾选:独立‑永久
  5. 虚拟设备节点:统一选同一个 SCSI 控制器,例如SCSI 1:0(两台虚拟机节点设备节点必须完全一致)

不要用 SCSI0(系统盘控制器),建议新增独立 SCSI 控制器,SCSI 总线共享 = 虚拟。

修改每台虚拟机 .vmx 配置文件(最关键)

关闭 VMware 全部窗口;找到虚拟机目录下xxx.vmx,记事本打开,文件末尾追加下面内容

disk.locking = "FALSE"

disk.EnableUUID = "TRUE"

scsi1.sharedBus = "virtual"

说明:

  • disk.locking="FALSE":关闭 VMware 磁盘锁,允许多台虚机同时打开同一块 vmdk;不加会报磁盘被占用
  • disk.EnableUUID="TRUE":让 Linux 识别磁盘 UUID,SBD、udev 依赖
  • scsi1.sharedBus="virtual":SCSI 总线共享,多虚机共享该 SCSI 总线

保存 vmx,再打开 VMware 启动虚拟机。

调整虚拟机磁盘引导顺序

VMware 顶部菜单:【虚拟机】→【电源】→打开电源时进入固件

切换到 Boot 选项卡

光标移动选中 +Hard Drive,按下 Enter 回车键,展开硬盘子列表,就会看到两块磁盘

  • 硬盘 (NVMe) 40G(系统盘,需要放到第一位)
  • 硬盘 (SCSI) 1G

在展开的硬盘列表中:

  • 方向键选中硬盘(NVMe)
  • 按键盘上的 +加号键 向上移动,把 NVMe 移动到硬盘列表最顶部

F10 → 选择 Yes,保存退出 BIOS

SBD配置

Linux 虚拟机内确认识别磁盘

两台节点开机执行

#查看块设备,sbd磁盘是裸盘,无分区

lsblk

#查看磁盘UUID,SBD推荐用by‑id路径

ls /dev/disk/by-id/

不要 fdisk 分区、不要 mkfs 格式化!SBD 直接使用整块裸设备。

安装sbd组件

dnf install -y sbd fence-agents-all

加载 softdog 软件看门狗

modprobe softdog

#开机自动加载

echo "softdog" > /etc/modules-load.d/softdog.conf

#验证,出现/dev/watchdog即为成功

ls /dev/watchdog

lsmod | grep softdog

初始化 SBD(仅在其中一个节点执行 create)

只在 server1 执行 SBD 磁盘初始化 create(server5 不要执行!)

#获取SBD磁盘持久by‑id路径,复制输出结果

ls /dev/disk/by-id/

#写入SBD头部
sbd -d /dev/disk/by-id/scsi-36000c290ff2b9bdc4bdc0dd80162f848 create

#校验头部信息,必须输出header version,不报错
sbd -d /dev/disk/by-id/scsi-36000c290ff2b9bdc4bdc0dd80162f848 dump

Pacemaker 集群配置 SBD STONITH(任意一台节点执行,推荐 server1)

pcs 一键配置 fence_sbd

pcs stonith sbd enable \
device="/dev/disk/by-id/scsi-36000c290ff2b9bdc4bdc0dd80162f848" \
watchdog=/dev/watchdog

手动创建 stonith 资源

pcs stonith create sbd-fence fence_sbd \
devices="/dev/disk/by-id/scsi-36000c290ff2b9bdc4bdc0dd80162f848" \
op monitor interval=30s timeout=20s \
op start timeout=20s \
op stop timeout=20s

查看 stonith 配置

pcs stonith config

开启 stonith 隔离总开关

pcs property set stonith-enabled=true

重启整个集群使配置全部生效

pcs cluster stop --all
pcs cluster start --all

#查看集群整体状态
pcs status

SBD 隔离功能测试 

在 server1 执行,给 server5 发送隔离消息,server5 机器会立刻看门狗重启

sbd -d /dev/disk/by-id/scsi-36000c290ff2b9bdc4bdc0dd80162f848 message server5 reset

在 server5 执行,给 server1 发送隔离消息,server1 立刻重启

sbd -d /dev/disk/by-id/scsi-36000c290ff2b9bdc4bdc0dd80162f848 message server1 reset

如果此命令执行成功,说明底层sbd工作正常

集群层面调用 stonith 隔离(集群资源会自动处理故障转移)

#在server5隔离server1
pcs stonith fence server1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值