MFS最佳实践

从该链接翻译 (last update: January 13, 2016)

依据以下建议将使得您的mfs获得最佳额可靠性。

  • 最小副本设置为2;
  • 为metadata预留充足磁盘空间;
  • 底层使用RAID1/RAID10来提供存储空间;
  • 不建议使用虚拟机;
  • chunker文件系统使用JBOD 或者 XFS;
  • 最低1G网络,建议10G网络;
  • overcommit_memory on Master Servers (Linux only);
  • 禁用updateDB 功能 (Linux only);
  • 使用最新的OS;
  • 使用推荐的硬件配置;

为保证数据(chunker)安全,应该将最小副本数设置为2!
超过1PB的大型实例建议设置最小副本书为3!

查看某个挂载点的副本数:

mfssetgoal -r 2 /mnt/mfs

为避免用户设置低于2的副本数,可设置:

vim /etc/mfs/mfsexports.cfg
*    /    rw,alldirs,mingoal=2,maproot=0:0
mfsmaster reload
#or
service moosefs-master reload
#or
kill -HUP `pidof mfsmaster`

/var/lib/mfs 目录预留足够的磁盘容量,不然会引起元数据丢失导致mfs数据丢失. 该目录的磁盘容量可通过以下公式进行计算:

  • RAM : 内存总量
  • BACK_LOGS : metadata日志文件数量 (默认50 - /etc/mfs/mfsmaster.cfg定义)
  • BACK_META_KEEP_PREVIOUS : 保存上个版本metadata日志的数量 (默认 1 - /etc/mfs/mfsmaster.cfg定义)

SPACE = RAM * (BACK_META_KEEP_PREVIOUS + 2) + 1 * (BACK_LOGS + 1) [GiB] (如果 /etc/mfs/mfsmaster.cfg 已经定义了相关默认值, 则 RAM * 3 + 51 [GiB])

The value 1 (before multiplying by BACK_LOGS + 1) is an estimation of size used by one changelog.[number].mfs file. In highly loaded instance it uses a bit less than 1 GB.

2.1. 举例

假设128G内存, /var/lib/mfs 最小容量为:

128*3 + 51 = 384 + 51 = 435 GiB :

RAID 1 or RAID 1+0 for storing metadata 建议使用RAID 1 or RAID 1+0 存储metadata dumps 和 changelogs. 不推荐使用网络存储 (e.g. SANs, NFSes, etc.).

对于高性能的环境,特别是master,不建议使用虚拟机.

建议chunker直接格式化磁盘为XFS然后挂载为/mnt/chunk01, /mnt/chunk02, …
然后将这些路径配置到/etc/mfs/mfschunkserver.cfg

理由如下:

  • MooseFS 具有检测磁盘健康状态的机制, MooseFS 发现坏盘, 复制数据到别处,并标记这些坏盘. 这不同于RAID,所以破坏RAID会导致磁盘状态的误报.
  • 另一个因素就是复制时间.假设副本数量为2,其中一个2T的磁盘挂掉,复制将会持续40~60分钟,假如一个大的阵列坏掉,复制将会持续12~18小时之久,期间副本只有一份,如果另外一个磁盘挂掉的话,数据就丢失了,复制时间越久,数据越危险.

至少1G,建议10G网络,同时交换机之间设置LACP链路冗余.

如 /var/log/syslog 或 /var/log/messages中有以下日志出现: fork error (store data in foreground - it will block master for a while) 那么你的master机器正面临问题, 超时或者client连接断开. 此时你的系统不再允许 MFS Master 进场在后台存储meatadata.

Linux systems use several different algorithms of estimating how much memory a single process needs when it is created. One of these algorithms assumes that if we fork a process, it will need exactly the same amount of memory as its parent. With a process taking 24 GB of memory and total amount of 40 GB (32 GB physical plus 8 GB virtual) and this algorithm, the forking would always be unsuccessful.

But in reality, the fork commant does not copy the entire memory, only the modified fragments are copied as needed. Since the child process in MFS master only reads this memory and dumps it into a file, it is safe to assume not much of the memory content will change.

Therefore such "careful" estimating algorithm is not needed. The solution is to switch the estimating algorithm the system uses. 

6.1. 解决

echo 1 > /proc/sys/vm/overcommit_memory
vim /etc/sysctl.conf
vm.overcommit_memory=1

Updatedb 不适用于网络分布式系统. 编辑/etc/updatedb.conf:

PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre tmpfs usbfs udf fuse.glusterfs fuse.sshfs fuse.mfs curlftpfs ecryptfs fusesmb devtmpfs"

比如MooseFS 3.0 和老版本的FUSE不兼容.

MooseFS Master Server为单线程, CPU应该为高频,低核心,并推荐关闭超线程功能,如:

Intel(R) Xeon(R) CPU E5-1630 v3 @ 3.70GHz
Intel(R) Xeon(R) CPU E5-1620 v2 @ 3.70GHz
  • 最小支持高可用的MooseFS Pro是2个master和3个chunkserver.
  • 运行MooseFS Pro 至少需要3个chunker.
  • storage/mfs/mfs最佳实践.txt
  • 最后更改: 2019/04/16 18:31
  • (外部编辑)