背景
故障容错
上回说道,MFS的故障容错是基于文件的 goal 值,如果 goal 设置为 1 ,不管服务器有多少台,文件副本只有一个,这种情况下是提供不了容错功能的。
但想要多副本,也需要同时满足多节点,如果数据服务器的数量小于给文件设置的 goal 值时,也还是无法存储所有的副本。
目的
因此,本次的实验目的是为了在单机的基础上启动多个chunk server进程实例,实现单机文件的多副本配置。
实验过程
环境概述
本次略过安装过程,直接进入相关配置。
单机组件
master + chunkserver1 + chunkserver2 + metalogger(非必须) + cgiserver(非必须)
两组磁盘,共6块,实现数据双副本
第一组 ( Label A )
/mnt/data1
、/mnt/data2
、/mnt/data3
第二组 ( 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
- 与默认配置会有如下区别
- chunkserver配置
- 服务数据目录(DATA_PATH),需要区分指定,避免节点id文件(chunkserverid.mfs)、数据状态文件(csstats.mfs)冲突
- 磁盘挂载点配置文件(HDD_CONF_FILENAME),需要新建,避免复用相同磁盘
- 服务启动端口(CSSERV_LISTEN_PORT),需要延续指定,避免冲突,默认端口9422
- 磁盘挂载点配置
- 指定不同磁盘,避免数据冲突
- chunkserver配置
创建服务数据目录
存放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后台下,验证节点状态、存储等级
节点状态
节点上线,且实现单机双实例
各实例分别为A、B标签
磁盘全部上线,且容量大小符合预期
存储等级
存在目标等级
classAB
目标等级数据可用 ( can be fulfilled = YES )
目标等级数据有副本 ( 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份,全部照常读取 |
小结
- 多goal文件如发生数据降级,会马上开始追数据
- 在
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
测试机验证场景一
通过后解除挂载
关闭当前master
/usr/local/mfs/sbin/mfsmaster start
- 检查 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
进行恢复
- 将 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/
执行恢复
[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
在新节点上启动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
后台观察文件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域名解析尚未修改。