MFS(MooseFS分布式文件系统)

作者:张首富
时间:2020-05-22
w x:y18163201

MooseFS[MFS]是一个具有容错性的网络分布式文件系统。它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。
官网地址:http://www.moosefs.com/

MFS简介

MooseFS是一个具有容错性,高可用,高性能,扩展性强的网络分布式文件系统,他将数据分布在多个存储服务器上,这些存储服务器对用户而言就是一块虚拟磁盘,它符合POSIX并且像任何其他类UNIX文件系统一样支持:

  • 分层结构:文件和文件夹
  • 文件属性
  • 特殊文件:
  • 硬软链接
  • 安全控制和ACL

MooseFS pro企业级架构图,我们使用的普通版,不具有下面的从服务器,不能直接使用它自带的高可用,我们后面介绍另外一种高可用方式keepalive
image-20200522104005363

MooseFS的优点:

  • 高可用性:存储节点(Chunk server)没有单点故障,文件系统的元数据在物理冗余服务器上保存为两个或多个副本,用户数据冗余冗余分布在系统的中存储服务器上
  • 低成本的数据安全:MooseFS使用户能够节省大量硬盘空间,保持相同的数据冗余级别。
  • 高性能性:支持高性能I/O操作,用户数据可以才雨多存储节点上同时读取/写入。

MooseFS文件系统的四种角色(roles)

  • 管理服务器(managing server )master:
    负责各个数据存储服务器(chunk server)的管理,文件读写调度,文件空间回收以及恢复、多节点拷贝

  • 元数据日志服务器(Metalogger server)Metalogger:
    负责备份master服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在master server出问题的时候接替其进行工作

  • 数据存储服务器(data server)chunk server:
    听从管理服务器调度,提供存储空间,并未客户端提供数据传输。真正存储用户数据的服务器。存储文件时,首先把文件分成块,然后这些块在数据服务器chunkserver 之间复制(复制多少份可以被手工指定,建议设置为3)。数据服务器可以是多个,并且数量越多,可以使用的“磁盘空间”越大,可靠性也越高

  • 客户机挂载使用 client computer :
    挂载进程mfs服务器共享出的存储并使用。通过fuse内核接口挂载进程管理服务器上所管理的数据存储服务器共享出的硬盘。 共享的文件系统的用法和 nfs 相似。 使用 MFS 文件系统来存储和访问的主机称为 MFS 的客户端,成功挂接 MFS 文件系统以后,就可以像以前使用 NFS 一样共享这个虚拟性的存储了。

MooseFS文件系统的工作流程

读取文件的流程

MFS(MooseFS分布式文件系统)_第1张图片
1,客户端向master server服务器询问资源所在的位置
2,然后master server服务器返回资源在chunk server上所在的位置
3,客户端拿着返回的地址去找资源,然后chunk server返回实际的资源

存储数据的过程

MFS(MooseFS分布式文件系统)_第2张图片
1,客户端告诉master server服务器他要存储数据
2,然后master server端去查找chunk server上空闲的位置
3,如果chunk server上还有空闲的位置,就会返回给master server位置
4,然后master server返回给客户端,然后客户端拿着这个位置去存储数据
5,chunk server把数据进行多分存储,存储完成之后会返回给客户端,
6,然后断开连接

安装构建MooseFS

主机规划

主机名 角色 IP地址
master_11 Managing server 10.0.0.11/24
node_1_12 Metalogger server 10.0.0.12/24
node_2_13 chunk server 1 10.0.0.13/24
node_3_14 chunk server 2 10.0.0.14/24
Node_4_15 client computers 10.0.0.15/24

环境准备

实验所需要的主机都必须支持FUSE内核模块,因为mfs的客户端程序也就是加载mfs磁盘系统的命令是使用了fuse,因此只要是想要挂在mfs的服务器,必要的前提条件就是先安装fuse,这样编译mfs的时候才能通过

FUSE:用户空间文件系统(Filesystem in Userspace)是操作系统中的概念,指完全在用户态实现的文件系统,,注:2.6内核以上都自带FUSE

  • 所有的服务器采用:centos 7.5
  • 关闭selinux和IPtables

开始搭建

1)在所有的服务器添加yum源

curl "http://ppa.moosefs.com/MooseFS-3-el7.repo" > /etc/yum.repos.d/MooseFS.repo
sed -i "/^gpgcheck/c gpgcheck=0" /etc/yum.repos.d/MooseFS.repo
yum clean  all 
yum list

2) 在主服务器上安装

[root@master_11 /]# yum install -y moosefs-master moosefs-cgi moosefs-cgiserv moosefs-cli
[root@master_11 /]# rpm -ql moosefs-master
/etc/mfs/mfsexports.cfg.sample
/etc/mfs/mfsmaster.cfg.sample
/etc/mfs/mfstopology.cfg.sample

3) 在metaloggers服务器上

[root@node_1_12 /]# yum install moosefs-metalogger -y
[root@node_1_12 /]# rpm -ql moosefs-metalogger
/etc/mfs/mfsmetalogger.cfg.sample

4) 在数据节点上chunk server

[root@node_2_13 monitor]# yum install moosefs-chunkserver  -y
[root@node_3_14 monitor]# yum install moosefs-chunkserver  -y
[root@node_2_13 monitor]# rpm -ql moosefs-chunkserver
/etc/mfs/mfschunkserver.cfg.sample
/etc/mfs/mfshdd.cfg.sample

5) 在客户节点上安装

[root@node_4_15 ~]# yum -y  install moosefs-client
[root@node_4_15 ~]# rpm -ql moosefs-client
/etc/mfs/mfsmount.cfg.sample

6) 在master端修改共享出去的目录和权限

[root@master_11 ~]# echo '10.0.0.0/24 /mfs_test rw,admin,maproot=0:0' >> /etc/mfs/mfsexports.cfg
[root@master_11 /]# systemctl start moosefs-master.service
[root@master_11 /]# systemctl enable moosefs-master.service
[root@master_11 /]# netstat -ntalp | grep mfsmaster
tcp        0      0 0.0.0.0:9419            0.0.0.0:*               LISTEN      3969/mfsmaster      
tcp        0      0 0.0.0.0:9420            0.0.0.0:*               LISTEN      3969/mfsmaster      
tcp        0      0 0.0.0.0:9421            0.0.0.0:*               LISTEN      3969/mfsmaster

7)在日志服务器上配置manage端的地址

[root@node_1_12 mfs]# vim /etc/mfs/mfsmetalogger.cfg
MASTER_HOST = 10.0.0.11
[root@node_1_12 mfs]# systemctl start moosefs-metalogger.service
[root@node_1_12 mfs]# systemctl enable moosefs-metalogger.service
[root@node_1_12 mfs]# netstat -ntalp | grep mfs
tcp        0      0 10.0.0.12:45152         10.0.0.11:9419          ESTABLISHED 2837/mfsmetalogger
// 可以看出log端和master端已经成功建立连接

8)修改chunk server端并启动

[root@node_2_13 mfs]# vim mfschunkserver.cfg
MASTER_HOST = 10.0.0.11
[root@node_2_13 mfs]# vim mfshdd.cfg
/tmp    //数据存放在哪个地方,一般工作中会配置一个独立的分区
[root@node_2_13 mfs]# systemctl start moosefs-chunkserver.service
[root@node_2_13 mfs]# systemctl enable moosefs-chunkserver.service
[root@node_2_13 mfs]# netstat -ntalp | grep mfs
tcp        0      0 0.0.0.0:9422            0.0.0.0:*               LISTEN      1387/mfschunkserver 
tcp        0      0 10.0.0.13:45530         10.0.0.11:9420          ESTABLISHED 1387/mfschunkserver 
// 可以看出他已经与master端建立连接了,另外一台chunk server也做同样的配置

[root@node_2_13 tmp]# ls 
00  22  44  66  88  AA                            C8  EA
01  23  45  67  89  AB                            C9  EB
02  24  46  68  8A  AC                            CA  EC
03  25  47  69  8B  AD                            CB  ED
04  26  48  6A  8C  AE                            CC  EE
// 分块存储,人类无法直接识别

9) 客户端挂载

[root@node_4_15 mfs]# vim mfsmount.cfg
mfsmaster=10.0.0.11
[root@node_4_15 mfs]# mfsmount /tmp/ -o nonempty -H 10.0.0.11:/mfs_test -p
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
挂载的目录是master管理端 mfshdd.cfg 里面的共享目录和权限,如果我没没有指定连接的密码,就需要使用 -o nonempty 参数来信任密码

10) 取消挂载

[root@node_4_15 ~]# umount -t fuse.mfs /tmp/

11)开启web界面

在master server上面执行

[root@master_11 ~]# mfscgiserv 
lockfile created and locked
starting simple cvimgi server (host: any , port: 9425 , rootpath: /usr/share/mfscgi)

然后浏览器访问IP:9425端口

优化操作

设定文件copy的份数(mfssetgoal)

在client 端执行命令

[root@node_4_15 tmp]# mfssetgoal -r 1 /tmp/
-r递归 1代表一份,然后在哪个挂载目录上实行

查看一个文件被复制了几份(mfscheckfile\mfsfileinfo)

在client端执行命令

mfscheckfile /tmp/sshd /tmp/1.txt 
/tmp/sshd:
 chunks with 1 copy:             1
/tmp/1.txt:
chunks with 1 copy:              1
// chunks with 1 copy 代表当前复制了1份

测试copy份数的设定是否成功

[root@node_4_15 tmp]# mfssetgoal -r 2 /tmp/
/tmp/:
 inodes with goal changed:                      47
 inodes with goal not changed:                   0
 inodes with permission denied:                  0
[root@node_4_15 tmp]# mfscheckfile /tmp/sshd /tmp/1.txt 
/tmp/sshd:
 chunks with 2 copies:            1

mfsfileinfo 查看文件属性

mfsfileinfo的参数:

  • -q:简洁模式,仅显示副本数,拷贝的份数
  • -c:从chunkserver接收块校验和
  • -s:计算文件签名(使用校验和)
[root@node_4_15 tmp]# mfsfileinfo /tmp/sshd 
/tmp/sshd:
        chunk 0: 0000000000000038_00000001 / (id:56 ver:1)
                copy 1: 10.0.0.13:9422 (status:VALID)
                copy 2: 10.0.0.14:9422 (status:VALID)
// 从上述可以看出两个副本存在的位置

mfsgetclass 显示文件的副本数和目录的副本数

[root@node_4_15 tmp]# mfsgetsclass -r /tmp/
/tmp/:
 files with goal                2 :         46
 directories with goal          2 :          2

mfsdirinfo 显示目录的状态

用法:mfsdirinfo [-nhHkmg] [-idfclsr] [-p] name [name ...]

  • -n - 以简单格式显示数字
  • -h-使用基数2前缀的“人类可读”数字(IEC 60027)
  • -H - 使用基数10前缀(SI)的“可读”数字
  • -k - 以千比数显示纯数字(二进制千 - 1024)
  • -m - 在mebis中显示纯数字(二进制mega - 1024 ^ 2)
  • -g - 以赤字显示纯数字(二进制千兆 - 1024 ^ 3)

'显示'开关:

  • -i - 显示索引节点数
  • -d - 显示目录数
  • -f - 显示文件数
  • -c - 显示块数
  • -l - 显示长度
  • -s - 显示大小
  • -r - 显示realsize
    '模式'开关:
  • -p - 精确模式
[root@node_4_15 tmp]# mfsdirinfo -h /tmp/
/tmp/:
 inodes:           48           //当前使用的inode号
  directories:      2           //两个目录
  files:           46           //46个文件
 chunks:           33           //占用了33个块
 length:        28KiB           //文件的总大小是28K
 size:         2.3MiB           //块长度总和为2.3M
 realsize:     4.6MiB           //使用的磁盘空间,因为我们是复制了2份,所以。。

 [root@node_4_15 tmp]# mfsdirinfo -h -p /tmp/
/tmp/:
 inodes:           48
  directories:      2
  files:           46
 chunks:           33
 length:        28KiB
 size:         2.3MiB
 realsize:     4.6MiB
/tmp/ (precise data):
 inodes:           48
  directories:      2
  files:           46
 chunks:           33
 length:        28KiB
 size:         2.3MiB
 realsize:     4.6MiB

mfssetgoal和mfsgetgoal命令

mfssetgoal设置目标copy的份数

mfssetgoal 3 /tmp  //tmp目录下的copy 3份,但是他里面的目录还是备份两份
mfssetgoal -r 3 /tmp  //tmp目录下所有的文件copy 3份,包括他里面的子目录

mfsgetgoal获取目标copy的份数

[root@node_4_15 tmp]# mfsgetgoal /tmp/
/tmp/: 2
[root@node_4_15 tmp]# mfsgetgoal /tmp/sshd
/tmp/sshd: 2

mfsgetquota 获取执行目录给定的配额

[root@node_4_15 tmp]# mfsgetquota -h /tmp/
/tmp/: (current values | soft quota | hard quota) ; soft quota grace period: default
 inodes   |     47 |      - |      - |
 length   |  28KiB |      - |      - |
 当前值      软配额     硬配额

 [root@node_4_15 tmp]# mfsgetquota -h /tmp/123/
/tmp/123/: (current values | soft quota | hard quota) ; soft quota grace period: default
 inodes   |      0 |      - |      - |
 length   |     0B |      - |      - |

mfsrsettrashtime和mfsgettrashtime命令 垃圾箱存放时间

删除的文件存放在“垃圾箱(trash bin)”的时间就是隔离时间(quarantine time),这个时间可以用mfsgettrashtime 来验证,也可以用mfssettrashtime来设置。设置的时间是按照小时计算,设置的单位是秒,不满一小时就按一小时计算。

mfs web展示界面介绍

MFS(MooseFS分布式文件系统)_第3张图片

  • 1、当前master端的Ip地址
  • 2、当前的mfs的版本
  • 3、当前内存的使用
  • 4、cpu的使用率
  • 5、总共的磁盘大小
  • 6、可用的磁盘大小

配置文件详解

mfsmaster.cfg master主配置文件详解

#######运行选项######################
# WORKING_USER = mfs   #运行master守护进程的用户,默认是mfs
# WORKING_GROUP = mfs  #运行master守护进程的用户组,默认是mfs
# SYSLOG_IDENT = mfsmaster #要在syslog消息中放置的进程名称(默认为mfsmaster),消息默认是记录在/var/log/messages里
# LOCK_MEMORY = 0       #是否执行mlockall()以避免mfsmaster 进程溢出(默认为0); 
# LIMIT_GLIBC_MALLOC_ARENAS = 4  #仅限于Linux:将malloc区域限制为给定值 - 防止服务器使用大量虚拟内存(默认为4)
# DISABLE_OOM_KILLER = 1 #仅限Linux:禁用内存killer(默认为1)
# NICE_LEVEL = -19       #运行守护进程的良好级别(默认为-19;注意:进程必须以root身份启动以提高优先级,如果优先级设置失败,进程保留开始的好水平)
# FILE_UMASK = 027       #为组和其他设置默认umask(用户始终为0,默认为027,块写入组并阻止所有其他)
# DATA_PATH = /usr/local/mfs-3.0.94/var/mfs #在哪里存储守护进程锁文件(默认为/usr/local/mfs-3.0.94/var/mfs)
# EXPORTS_FILENAME = /usr/local/mfs-3.0.94/etc/mfs/mfsexports.cfg #mfsexports.cfg文件的位置(默认为/usr/local/mfs-3.0.94/etc/mfs/mfsexports.cfg)
# TOPOLOGY_FILENAME = /usr/local/mfs-3.0.94/etc/mfs/mfstopology.cfg #mfstopology.cfg文件的位置(默认为/usr/local/mfs-3.0.94/etc/mfs/mfstopology.cfg)
# BACK_LOGS = 50         #元数据更改日志文件数(默认值为50),产生changelog.0.mfs-changelog.49.mfs,50个这样的日志文件用于存放元数据更改记录。
# METADATA_SAVE_FREQ = 1 #master多久会保存一次元数据,默认是1小时。
# BACK_META_KEEP_PREVIOUS = 1  #要保留的以前的元数据文件数(默认值为1),metadata.mfs.back.1留下一个这样的备份文件。
# CHANGELOG_PRESERVE_SECONDS = 1800 #在内存中必须保留多少秒的更改日志(默认为1800;这设置最小值,由于日志保存在5k块中,实际数量可能会更大一些;零会禁用额外的日志存储)
# MISSING_LOG_CAPACITY = 100000     #在主机中将存储多少个缺失的块(最多可分配 100*MISSING_LOG_CAPACITY 字节的内存)
#######命令连接选项#####################
# MATOML_LISTEN_HOST = *      #监听的IP地址,用于metalogger与masters间的连接,*表示任何。
# MATOML_LISTEN_PORT = 9419   #监听端口默认是9419,用于metalogger与masters间的连接
#######CHUNKSERVER连接选项###############
# MATOCS_LISTEN_HOST = *      #监听chunkservers连接的IP地址,默认是所有
# MATOCS_LISTEN_PORT = 9420   #监听端口默认是9420
# MATOCS_TIMEOUT = 10               #master-chunkserver连接的默认超时时间(默认为10秒)
# AUTH_CODE = mfspassword           #可选认证字符串。 定义时 - 只有具有相同AUTH_CODE的块服务器才允许连接到该主站。 当未定义(默认) - 然后所有chunkservers是允许的。如果要打开chunkserver身份验证,
#则首先在所有chunkserver中定义AUTH_CODE(并重新加载/重新启动它们),然后取消注释此选项并重新加载/重新启动master重新加载当前连接 chunkservers没有断开连接。 当chunkservers将进行新的连接时,将使用新的AUTH_CODE。
# REMAP_BITS = 24                   #可选IP类重映射。
# REMAP_SOURCE_IP_CLASS = 192.168.1.0
# REMAP_DESTINATION_IP_CLASS = 10.0.0.0
#######CHUNKSERVER工作选项##############
#REPLICATIONS_DELAY_INIT = 300           #开始复制前的初始延迟(秒)(默认为300)
# CHUNKS_LOOP_MAX_CPS = 100000           #Chunks循环不应该比每秒钟检查更多的块数(默认为100000)
# CHUNKS_LOOP_MIN_TIME = 300             #Chunks循环不应该在比给定的数字少的秒钟内完成(默认值为300)
# CHUNKS_SOFT_DEL_LIMIT = 10             #在一个chunk服务器上删除的最大块数(默认值为10)
# CHUNKS_HARD_DEL_LIMIT = 25             #在一个chunkserver上最多删除的块数(默认为25)
# CHUNKS_WRITE_REP_LIMIT = 2,1,1,4       #最大数量的块复制到一个chunkserver,第一个限制是比较危险的块(块只有一个副本);第二个限制是undergoal块(块的拷贝数量低于指定的目标);
#第三个限制是平衡与周围空间使用服务器之间的算术平均数;第四个限制是其他服务器之间的平衡(极低或极高的空间使用情况);这里mfs官方建议是第一个数字大于等于第二,第二大于或等于第三,第四大于或等于第三,即(第一个限制 > = 第二个限制 > = 第三个限制< = 第四个限制)。
# CHUNKS_READ_REP_LIMIT = 10,5,2,5       #从一个chunkserver复制的最大块数(默认为10,5,2,5)一个数字等于四个相同数字,以冒号分隔,限制组与写入限制相同,数字之间的关系也应该相同 在写限制(1st> = 2nd> = 3rd <= 4th)
# CS_HEAVY_LOAD_THRESHOLD = 100          #chunkserver负载值默认100
# CS_HEAVY_LOAD_RATIO_THRESHOLD = 5.0    #chunkserver负荷阈值率(默认值为5.0,每当chunkserver负载比先前指定的阈值高并且这一比率高于平均负载,然后chunkserver切换到“grace(优雅)”模式)
# CS_HEAVY_LOAD_GRACE_PERIOD = 900       #定义chunkserver将在“grace”模式下保持多长时间(以秒为单位)
# ACCEPTABLE_PERCENTAGE_DIFFERENCE = 1.0 #chunkserver的空间使用量的最大差异百分比(默认值为1.0;有效值:0.1 - 10.0)
# PRIORITY_QUEUES_LENGTH = 1000000       #优先队列的长度(濒危,undergoal等块-应该首先处理块,默认值是1000000)。
# CS_MAINTENANCE_MODE_TIMEOUT = 0        #服务器可以处于维护模式的最大秒数(默认值为0 - 这意味着“永远”)。
# CS_TEMP_MAINTENANCE_MODE_TIMEOUT = 1800 #服务器可以处于“临时”维护模式的最大秒数(重新连接服务器自动切换回正常模式后,服务器切换到此模式,默认值为1800)
###########客户连接选项########################
# MATOCL_LISTEN_HOST = *                 #用于监听客户端(安装)连接的IP地址(*表示任何)
# MATOCL_LISTEN_PORT = 9421              #端口监听客户端(mount)连接(默认为9421)
###########客户工作选择########################
# SESSION_SUSTAIN_TIME = 86400           #维持断开的客户端会话的时间(以秒为单位;默认值为86400 = 1天)
# QUOTA_DEFAULT_GRACE_PERIOD = 604800    #软配额的默认宽限期(秒)(默认为604800 - 7天)不推荐使用:QUOTA TIME_LIMIT
# ATIME_MODE = 0                         
#修改模式(默认为0 - 访问期间始终修改atime)
#所有模式:
#0 - 始终修改文件,文件夹和符号链接的atime。
#1 - 始终修改atime,但仅在文件的情况下(在文件夹和符号链接的情况下不要修改atime)。
#2 - 仅在ctime或mtime低于当前时间高于ctime或mtime时修改atime,当前atime早于24h时,修改atime。 在访问期间对所有对象进行操作(如Linux中的“relatime”选项)。
#3 - 与上述相同但仅在文件的情况下。 如果文件夹和符号链接不能修改atime。
#4 - 在访问期间不要修改atime(如“noatime”选项)。

mfsexports.cfg 配置文件详解

# cat /usr/local/mfs/etc/mfs/mfsexports.cfg  #这里就跟NFS的/etc/exports文件类似,就是允许让哪些客户端来进行挂载

一行的格式:[ip range] [path] [options]

ip范围:

*:表示任何ip(与0.0.0.0/0相同)

A.B.C.D:表示单个IP

A.B.C.D-E.F.G.H : IP地址范围

A.B.C.D / XX:A.B.C.D网络和子网掩码

A.B.C.D/E.F.G.H : A.B.C.D网络与E.F.G.H网络掩码
path:

. :特殊的“路径",意思是“元”

/...:路径在mfs结构

options:

ro/rw/readonly/readwrite:从字面意思就可以看出来只读/读写/只读/读写

alldirs:任何子目录都可以以root身份加载

dynamicip:ip仅在第一次身份验证期间进行测试,则客户端可以使用来自任何ip的相同会话ID

ignoregid:组ID(gid)

admin:管理权限 - 当前:允许操纵配额值

maproot=UID[:GID]:将所有根(uid零)操作视为用户执行的操作,其中uid等于UID,gid等于GID(如果GID未指定,则为该用户的默认gid)

mapall=UID[:GID}:如上所述,对于所有操作(对于这两个选项,UID和/或GID可以指定为主机上存在的用户名或组名)

password=TEXT:强制认证使用给定的密码

md5pass=MD5:如上所述,但是密码被定义为MD5哈希(MD5指定为128位十六进制数)

minversion=VER:仅允许版本号等于或大于VER的客户端(VER可以指定为X或X.Y或X.Y.Z)

mingoal=N : 不允许将目标设定在N以下(N应该是从'1'到'9'的数字)

maxgoal=N:不允许将目标设定在N(N以上)

mintrashtime=TIMEDURATION:不要将垃圾时间设置在TIME DURATION之下(时间DURATION可以按照设定顺序指定秒数或元素#W,#D,#H,#M,#S的组合)

maxtrashtime=TIMEDURATION:不允许设置超过TIMEDURATION的时间(TIMEDURATION可以指定如上)

默认值:

readonly,maproot=999:999,mingoal=1,maxgoal=9,mintrashtime=0,maxtrashtime=4294967295

mfsmetalogger.cfg 配置文件详解

###########运行选项############################
# WORKING_USER = mfs
# WORKING_GROUP = mfs
# SYSLOG_IDENT = mfsmetalogger    #要在syslog消息中放置的进程名称(默认为mfsmetalogger)
# LOCK_MEMORY = 0                 
# LIMIT_GLIBC_MALLOC_ARENAS = 4
# DISABLE_OOM_KILLER = 1
# NICE_LEVEL = -19
# FILE_UMASK = 027
# DATA_PATH = /usr/local/mfs-3.0.94/var/mfs
# BACK_LOGS = 50
# BACK_META_KEEP_PREVIOUS = 3      #要保留的以前的元数据文件数(默认为3),metadata_ml.mfs.back.1-metadata_ml.mfs.back.3留下三个这样的备份文件。
# META_DOWNLOAD_FREQ = 24          #元数据下载频率以小时为单位(默认为24,应至少为BACK_LOGS/2)。注意这里是要修改的一般改为1.
META_DOWNLOAD_FREQ = 1
##########MASTER连接选项######################
# MASTER_RECONNECTION_DELAY = 5    #如果未连接,则在下次尝试重新连接到主机之前延迟秒(默认为5)
# BIND_HOST = *                    #用于与主机连接的本地地址(默认为*,即默认本地地址)
# MASTER_HOST = mfsmaster          #MooseFS主机,只允许在单主机安装中使用IP(默认为mfsmaster),这里也是需要修改的地方。
# MASTER_PORT = 9419               #master的端口
# MASTER_TIMEOUT = 10              #与master连接的超时时间,默认是10秒钟

mfschunkserver.cfg配置文件详解

##########运行选项###########################
# WORKING_USER = mfs
# WORKING_GROUP = mfs
# SYSLOG_IDENT = mfschunkserver  #在syslog消息中放置的进程名称(默认为mfschunkserver)
# LOCK_MEMORY = 0
# LIMIT_GLIBC_MALLOC_ARENAS = 4
# DISABLE_OOM_KILLER = 1
# NICE_LEVEL = -19
# FILE_UMASK = 027
# DATA_PATH = /usr/local/mfs-3.0.94/var/mfs  #在哪里存储守护进程锁文件(默认为/usr/local/mfs-3.0.94/var/mfs)
# HDD_CONF_FILENAME = /usr/local/mfs-3.0.94/etc/mfs/mfshdd.cfg  #mfshdd.cfg文件位置,分配给MFS磁盘空间的配置文件的位置
# HDD_TEST_FREQ = 10  #块测试周期(默认值为10秒)
# HDD_LEAVE_SPACE_DEFAULT = 256MiB       #每个硬盘驱动器上应该留下多少空间(默认值:256MiB)
# HDD_REBALANCE_UTILIZATION = 20         #批量服务器允许在hdd空间重新平衡上花费的总工作时间的百分比
# HDD_ERROR_TOLERANCE_COUNT = 2          #在单个硬盘驱动器上以给定的秒数(PERIOD)容许多少个I/O错误(COUNT);如果错误数量超过此设置,则有害的硬盘驱动器将被标记为损坏
# HDD_ERROR_TOLERANCE_PERIOD = 600
# HDD_FSYNC_BEFORE_CLOSE = 0             #在chunk关闭前启用/禁用fsync
# HDD_SPARSIFY_ON_WRITE = 1              #在写入期间启用/禁用sparsification(跳过零)
# WORKERS_MAX = 250                      #最大的活跃会话数
# WORKERS_MAX_IDLE = 40                  #最大的空闲会话数
###########与master连接选项#################
# LABELS =                               #标签字符串(默认为空 - 无标签)
# BIND_HOST = *                          #用于master连接的本地地址(默认为*,即默认本地地址)
# MASTER_HOST = mfsmaster                #MooseFS主机,只允许在单主机安装中使用IP(默认为mfsmaster)。这里是要修改的地方。
# MASTER_PORT = 9420                     #与master端连接的端口
# MASTER_TIMEOUT = 10                    #与master连接的超时时间(默认为10秒)
# MASTER_RECONNECTION_DELAY = 5          #如果未连接,则在下次尝试重新连接到主机之前延迟秒(默认为5)
# AUTH_CODE = mfspassword                #authentication字符串(仅当master需要授权时才使用)
##########客户端连接选项####################
# CSSERV_LISTEN_HOST = *                 #IP地址来监听客户端(挂载)连接(*表示任何)
# CSSERV_LISTEN_PORT = 9422              #端口监听客户端(mount)连接(默认为9422)

fsmshdd.cfg 配置文件详解

该文件保留硬盘驱动器的安装点(路径)的定义以与块服务器一起使用。

一个路径可以从多个字符开始,这些字符可以切换其他选项:

*:表示这个硬盘被标记为删除,所有数据将被复制到其他硬盘驱动器(通常在其他chunkserver上)

<:表示来自此硬盘驱动器的所有数据都应该移动到其他硬盘驱动器

>:表示来自其他硬盘驱动器的所有数据都应移动到该硬盘驱动器

〜:表示总计数的重大变化不会将此驱动器标记为损坏

如果同时使用“<”和“>”驱动器,那么只能在这些驱动器之间移动数据

可以指定可选的空间限制(在每个安装点之后),有两种方法:

将空间设置为在硬盘驱动器上未使用(这覆盖了mfschunkserver.cfg的默认设置)

限制在硬盘上使用的空间,如:/mnt/hd4 -5GiB或/mnt/hd4 1.5TiB

mfsmount.cfg 挂载文件

#可选的mfsmount.cfg文件可用于指定mfsmount的默认值。 默认安装选项可以在一行以逗号分隔或多行指定。如(下面一看就能明白就不解释了):
# nosuid,nodev
# mfsmaster=mfsmaster    
# mfspassword=secret    #主要是这里,如果master设置了挂载密码,如果你这里不设置就要手工输了,然后如果客户端想开机自动挂载就需要在这里设置密码了。
#默认安装点也可以设置。 默认安装点必须以“/”开头,并且是一个完全限定的路径。如:
# /mnt/mfs

数据恢复

误删除数据从垃圾箱恢复

1)client我们已经挂载过目录了,直接在这个文件里面删除一个文件并给他恢复

> [root@node_5_16 tmp]# echo "this is test del file" >> test.png
[root@node_5_16 tmp]# ls 
test_file.txt

2)挂载垃圾箱

先查看删除的文件在垃圾箱存放的时间
[root@node_5_16 tmp]# mfsgettrashtime /tmp/
/tmp/: 3600

//挂载垃圾箱
[root@node_5_16 tmp]# mfsmount -m /mnt/ -H 10.0.0.11:/mfs_test
mfsmaster accepted connection with parameters: read-write,restricted_ip

3)删除数据,找到文件在垃圾箱的所在位置

[root@node_5_16 tmp]# rm -f test.png 
[root@node_5_16 trash]# find /mnt/ -name *test.txt
/mnt/trash/0F9/000000F9|test.txt

被删除的文件名在垃圾箱里面其实还是可以找到的,文件名是由一个8位16进制数的i-node和被删的文件名组成。在文件名和i-node之间不可以用"/",而是以“|” 替代。如果一个文件名的长度超过操作系统的限制(通常是255字符),那么超出部分将被删除。从挂载点起全部路径的文件名被删除的文件仍然可以被读写。需要注意的是,被删除的文件在使用文件名(注意文件名是两部分),一定要用单引号引起来。

4)恢复数据

[root@node_5_16 tmp]# cd /mnt/trash/0F9/
[root@node_5_16 0F9]# ls 
000000F9|1.txt  undel
[root@node_5_16 0F9]# mv 000000F9\|1.txt undel/
[root@node_5_16 0F9]# cd /tmp/
[root@node_5_16 tmp]# ls
1.txt
[root@node_5_16 tmp]# cat test.txt 
this is test del file

5)注意:
垃圾回收站不一定需要时刻都挂载,你可以等到你想从垃圾箱里面恢复数据的时候在挂载就行了