MooseFS单机数据高可用配置及灾难测试


背景

  • 故障容错

    上回说道,MFS的故障容错是基于文件的 goal 值,如果 goal 设置为 1 ,不管服务器有多少台,文件副本只有一个,这种情况下是提供不了容错功能的。

    但想要多副本,也需要同时满足多节点,如果数据服务器的数量小于给文件设置的 goal 值时,也还是无法存储所有的副本。

  • 目的

    因此,本次的实验目的是为了在单机的基础上启动多个chunk server进程实例,实现单机文件的多副本配置。


实验过程

环境概述

本次略过安装过程,直接进入相关配置。

  1. 单机组件

    master + chunkserver1 + chunkserver2 + metalogger(非必须) + cgiserver(非必须)

  2. 两组磁盘,共6块,实现数据双副本

    1. 第一组 ( Label A )

      /mnt/data1/mnt/data2/mnt/data3

    2. 第二组 ( Label B )

      /mnt/data4/mnt/data5/mnt/data6

配置事项

  • 实现原理

    在单机上启动多个 ChunkServer 实例进程,以此实现 “多节点” 状态,实现数据多副本分布。

    所以,以下部分只细说 ChunkServer 相关配置,其余组件参考常规部署配置即可。

Chunkserver 1

  • 该节点照常配置与启动即可

创建chunkserver配置

使用A标签,用于后续精准分布文件存放。

cd /usr/local/mfs/etc/mfs

cat > mfschunkserver.cfg << EOF
WORKING_USER = root
WORKING_GROUP = root
# 3.0 以上版本可用,用于机器分组
LABELS = A
# Master地址,可以是IP、域名或者hosts主机名
MASTER_HOST = mfs-test-master
EOF

创建磁盘挂载点配置

使用第一组磁盘,避免数据重复。

cat > mfshdd.cfg << EOF
/mnt/data1/chunk
/mnt/data2/chunk
/mnt/data3/chunk
EOF

启动第一个chunkserver节点

/usr/local/mfs/sbin/mfschunkserver start

Chunkserver 2

  • 与默认配置会有如下区别
    1. chunkserver配置
      • 服务数据目录(DATA_PATH),需要区分指定,避免节点id文件(chunkserverid.mfs)、数据状态文件(csstats.mfs)冲突
      • 磁盘挂载点配置文件(HDD_CONF_FILENAME),需要新建,避免复用相同磁盘
      • 服务启动端口(CSSERV_LISTEN_PORT),需要延续指定,避免冲突,默认端口9422
    2. 磁盘挂载点配置
      • 指定不同磁盘,避免数据冲突

创建服务数据目录

存放chunkserver节点id、元数据信息。

mkdir /usr/local/mfs-3.0.115/var/chunk2

创建chunkserver配置

使用B标签,用于后续精准分布文件存放。

cd /usr/local/mfs/etc/mfs

cat > mfschunkserver2.cfg << EOF
WORKING_USER = root
WORKING_GROUP = root
# 3.0 以上版本可用,用于机器分组
LABELS = B
# Master地址,可以是IP、域名、或者hosts主机名
MASTER_HOST = mfs-test-master
DATA_PATH=/usr/local/mfs-3.0.115/var/chunk2
HDD_CONF_FILENAME=/usr/local/mfs/etc/mfs/mfshdd2.cfg
CSSERV_LISTEN_PORT=9423
EOF

创建磁盘挂载点配置

使用第二组磁盘,避免数据重复。

使用chunk2目录存放元数据,避免误用第一组磁盘后,污染数据。

cat > mfshdd2.cfg << EOF
/mnt/data4/chunk2
/mnt/data5/chunk2
/mnt/data6/chunk2
EOF

启动第二个chunkserver节点

指定节点2配置文件启动即可

关闭方式同理,start改为stop即可。

/usr/local/mfs/sbin/mfschunkserver -c /usr/local/mfs/etc/mfs/mfschunkserver2.cfg start

设置存储等级

用于将数据精准分散到指定节点。

挂载目录

mkdir /mnt/homelab_mfs_dev
/usr/local/mfs/bin/mfsmount /mnt/homelab_mfs_dev -H 192.168.7.33

创建存储等级,名为 classAB

该存储等级为文件存在一份副本,共两份数据,即 goal=2

每份数据分别散落在A、B两个标签节点的磁盘组中。

/usr/local/mfs/bin/mfsscadmin /mnt/homelab_mfs_dev create A,B classAB

为目录设置存储等级

/usr/local/mfs/bin/mfssetsclass classAB -r /mnt/homelab_mfs_dev/server_data
  • 输出如下:

    /mnt/homelab_mfs_dev/server_data:
     inodes with storage class changed:              1
     inodes with storage class not changed:          0
     inodes with permission denied:                  0

验证检查

终端下,验证目录存储等级

/usr/local/mfs/bin/mfsgetgoal -r /mnt/homelab_mfs_dev/server_data
  • 输出如下:

    /mnt/homelab_mfs_dev/server_data:
     directories with storage class 'classAB' :          1

CGI后台下,验证节点状态、存储等级

节点状态
  1. 节点上线,且实现单机双实例

  2. 各实例分别为A、B标签

  3. 磁盘全部上线,且容量大小符合预期

存储等级
  1. 存在目标等级 classAB

  2. 目标等级数据可用 ( can be fulfilled = YES )

  3. 目标等级数据有副本 ( goal = 2 )

新建文件的副本验证

/mnt/homelab_mfs_dev/server_data 目录存放测试文件

[master]# ll /mnt/homelab_mfs_dev/server_data
total 120865
-rw-r--r-- 1 root root 123765471 Nov 15 00:34 plugins.tar.gz

验证文件存储等级

[master]# /usr/local/mfs/bin/mfsgetgoal /mnt/homelab_mfs_dev/server_data/plugins.tar.gz

/mnt/homelab_mfs_dev/server_data/plugins.tar.gz: 'classAB'

后台确认目标等级存在文件块数据

后台总览看板,确认文件均为双副本 ( 横轴: valid copies = 2 、纵轴: goal = 2 )


灾难测试

  • 单副本
    • 文件块: 23528 ( 总文件块数量,包含测试文件夹 )
    • 测试文件数: 23528
  • 双副本
    • 总文件块: 30594 ( 总文件块数量,包含测试文件夹 )
    • 测试文件数: 30394

场景一: 磁盘损坏

测试期间,每项完成后均重新挂载后再验证。

文件读取存在缓存。

场景 goal=1 效果 goal=2 效果 备注
Label A节点随机坏一盘 605个chunks丢失,顺序读取时异常文件hang住 7624个chunks降至1份,全部照常读取
Label B节点随机坏一盘 8152个chunks丢失,顺序读取时异常文件hang住 9933个chunks降至1份,全部照常读取
各Label节点坏一块盘 5248个chunks丢失,顺序读取时异常文件hang住 4468个chunks丢失,22623个chunks降至1份,顺序读取时异常文件hang住
Label A节点宕机( 一组磁盘不可用 ) 437个chunks丢失,顺序读取时异常文件hang住 30594个chunks降至1份,全部照常读取
Label B节点宕机( 一组磁盘不可用 ) 4151个chunks丢失,顺序读取时异常文件hang住 30594个chunks降至1份,全部照常读取

小结

  1. 多goal文件如发生数据降级,会马上开始追数据
  2. goal=2 情况下,除了每台节点各坏一块盘的情况会导致数据丢失,其余都能保证数据高可用

场景二: Master 冷备恢复

验证结果

场景简述:

通过冷备节点 ( Metalogger ) 恢复 master 验证数据是否丢失。

冷备数据间隔1H

  • master
    • 192.168.7.33
  • metalogger
    • 192.168.7.34
  • 测试机
    • 192.168.7.83
场景 单副本目录效果 双副本目录效果 备注
挂载master访问 正常 正常
挂载metalogger节点恢复后的master 正常 正常
小结

master宕机后可以进行手动冷备恢复,但需要注意 metalogger 备份间隔,如有实时写入场景,可能会造成部分丢失。

详细过程如下

需要提前在metalogger节点准备如下配置

mfsexports.cfg

mfsmaster.cfg

  1. 测试机验证场景一

    通过后解除挂载

  2. 关闭当前master

    /usr/local/mfs/sbin/mfsmaster start

  1. 检查 metalogger 已备份数据
[root@metalogger mfs]# ll /data1/mfsmetadata/
total 13836
-rw-r----- 1 root root 3359513 Nov 19 00:39 changelog_ml.0.mfs
-rw-r----- 1 root root       0 Nov 19 00:21 changelog_ml_back.0.mfs
-rw-r----- 1 root root       0 Nov 19 00:21 changelog_ml_back.1.mfs
-rw-r----- 1 root root 6828003 Nov 19 00:21 metadata_ml.mfs.back
  1. 进行恢复

    • 将 metalogger 的元数据备份 ( metadata_ml.mfs.back ) 拷至 master 数据目录下,并重命名为metadata.mfs
    • 将 metalogger 的事务日志全量拷至 master 数据目录下
    cp /data1/mfsmetadata/metadata_ml.mfs.back /data1/mfs/metadata.mfs
    cp /data1/mfsmetadata/changelog_ml* /data1/mfs/
  2. 执行恢复

    [root@metalogger ~]# /usr/local/mfs/sbin/mfsmaster restore
    loading metadata ...
    loading sessions data ... ok (0.0000)
    loading storage classes data ... ok (0.0000)
    loading objects (files,directories,etc.) ... ok (0.4836)
    loading names ... ok (0.5354)
    loading deletion timestamps ... ok (0.0000)
    loading quota definitions ... ok (0.0000)
    loading xattr data ... ok (0.0558)
    loading posix_acl data ... ok (0.0000)
    loading open files data ... ok (0.0000)
    loading flock_locks data ... ok (0.0000)
    loading posix_locks data ... ok (0.0000)
    loading chunkservers data ... ok (0.0000)
    loading chunks data ... ok (0.6261)
    checking filesystem consistency ... ok
    connecting files and chunks ... ok
    all inodes: 54066
    directory inodes: 27
    file inodes: 54025
    chunks: 54082
    progress: current change: 1832133 (first:1719564 - last:1832133 - 100% - ETA:finished)
    cleaning metadata ...
    cleaning objects ... done
    cleaning names ... done
    cleaning deletion timestamps ... done
    cleaning quota definitions ... done
    cleaning chunks data ...done
    cleaning xattr data ...done
    cleaning posix_acl data ...done
    cleaning flock locks data ...done
    cleaning posix locks data ...done
    cleaning chunkservers data ...done
    cleaning open files data ...done
    cleaning sessions data ...done
    cleaning storage classes data ...done
    cleaning dictionary data ...done
    metadata have been cleaned
  3. 在新节点上启动master

    [root@metalogger ~]# /usr/local/mfs/sbin/mfsmaster start
    open files limit has been set to: 16384
    working directory: /data1/mfs
    lockfile created and locked
    initializing mfsmaster modules ...
    exports file has been loaded
    mfstopology configuration file (/usr/local/mfs-3.0.115/etc/mfstopology.cfg) not found - using defaults
    loading metadata ...
    loading sessions data ... ok (0.0000)
    loading storage classes data ... ok (0.0000)
    loading objects (files,directories,etc.) ... ok (0.2039)
    loading names ... ok (0.2270)
    loading deletion timestamps ... ok (0.0000)
    loading quota definitions ... ok (0.0000)
    loading xattr data ... ok (0.0196)
    loading posix_acl data ... ok (0.0000)
    loading open files data ... ok (0.0000)
    loading flock_locks data ... ok (0.0000)
    loading posix_locks data ... ok (0.0000)
    loading chunkservers data ... ok (0.0000)
    loading chunks data ... ok (0.4166)
    checking filesystem consistency ... ok
    connecting files and chunks ... ok
    all inodes: 54066
    directory inodes: 27
    file inodes: 54025
    chunks: 54082
    metadata file has been loaded
    no charts data file - initializing empty charts
    master <-> metaloggers module: listen on *:9419
    master <-> chunkservers module: listen on *:9420
    main master server module: listen on *:9421
    mfsmaster daemon initialized properly
  4. 后台观察文件chunks及节点情况

    • 文件 chunks 并无缺失

    • chunkserver 连接正常

    • 测试挂载及读取文件正常

      /usr/local/mfs/bin/mfsmount /mnt/mfs_test -H 192.168.7.34 -o mfssubfolder=/server_data
可能遇到的问题
1. 在 metalogger 节点上恢复 master 成功并启动后,所有元数据丢失

检查chunkserver连接情况,是否有写死原来master地址,或原master域名解析尚未修改。


文章作者: NesTeaLin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 NesTeaLin !
  目录