一、文件系统选型

在一般的生产环境中,NFS共享存储算是比较常用的,简单、方便,但随着业务的不断扩展,数据量也是承爆发式的增长,因而对存储这些数据的文件系统要求也越来越高了,分存式、可扩展、大容量,这样的需求变得迫切了, 目前常见的分布式文件系统有很多种,mogileFS、FastDFS、Moosefs、Lustre、TFS、GFS、HDFS等等,

mogileFS:Key-Value型元文件系统,不支持FUSE,应用程序访问它时需要API,主要用在web领域处理海量小图片,效率相比mooseFS高很多。

fastDFS:国人在mogileFS的基础上进行改进的key-value型文件系统,同样不支持FUSE,提供比mogileFS更好的性能。

mooseFS:支持FUSE,相对比较轻量级,对master服务器有单点依赖(可以通过DRBD来解决),

glusterFS:支持FUSE,比mooseFS庞大,无元数据服务器,堆栈式架构(基本功能模块可以进行堆栈式组合,实现强大功能)。具有线性横向扩展能力。

ceph:支持FUSE,客户端已经进入了linux-2.6.34内核,也就是说可以像ext3/rasierFS一样,选择ceph为文件系统。彻底的分布式,没有单点依赖,用C编写,性能较好。基于不成熟的btrfs,其本身也非常不成熟。

lustre:Oracle公司的企业级产品,非常庞大、复杂。而且Lustre严重依赖内核,需要重新编译内核。

Key-Value型文件系统没有目录结构,导致不能用list某个子目录的所有文件,不能直接像本地文件系统一样操作,干什么事情都需要一个api,让人十分不爽,如果不介意api谳用的,fastDFS是一个不错的分布式存储方案,如果要使用通用的文件系统,那就只能在mooseFS、glusterFS、ceph、lustre中选择,ceph不成熟了,它基于的btrfs本身就不成熟,它的官方网站上也明确指出不要把ceph用在生产环境中,所以pass掉,lustre过于庞大、复杂这里也pass掉,那剩下的就只能在mooseFS、glusterFS中选择了,glusterFS适合大文件存储,如果做虚拟化,用glusterFS来做存储就挺合适的。对于小文件,无元数据服务设计解决了元数据的问题。但GlusterFS并没有在I/O方面作优化,在存储服务器底层文件系统上仍然是大量小文件,本地文件系统元数据访问是瓶颈,数据分布和并行性也无法充分发挥作用。因此,GlusterFS的小文件性能还存在很大优化空间。最后只能选择mooseFS了,但mooseFS已经足够满足我的存储需求。国内mooseFS的人比较多,可参考的文档也比较的多。

二、MooseFS的详解

1、MooseFS的优点

1)部署简单,轻量、易配置、易维护

2)易于扩展,支持在线扩容,不影响业务,体系架构可伸缩性极强

3)通用文件系统,不需要修改上层应用就可以使用(比那些需要专门api的dfs方便多了)。

4)以文件系统方式展示:如存图片,虽然存储在chunkserver上的数据是二进制文件,但是在挂载mfs的client端仍旧以图片文件形式展示,便于数据备份

5)硬盘利用率高。测试需要较大磁盘空间

6)可设置删除的空间回收时间,避免误删除文件丢失就恢复不及时影响业务

7)系统负载,即数据读写分配到所有的服务器上

8)可设置文件备份的副本数量,一般建议3份,未来硬盘容量也要是存储单份的容量的三倍

2、MooseFS的缺点

1)master目前是单点(虽然会把数据信息同步到备份服务器,但是恢复需要时间,因此,会影响上线,针对这个问题,

可以通过DRBD+Corosync+Pacemaker方案解决)

2)元数据服务器对主机的内存要求略高,所以元数据服务器硬件配置要高,尤其是内存

3、MooseFS文件系统结构

1)管理服务器           Master Server(Master)

2)元数据日志服务器     Metalogger Server(Metalogger)

3)数据存储服务器       Data Servers (Chunkservers)

4)客户端               Client

4、MooseFS各角色说明

1)Master管理服务器

有时也称为元数据服务器,负责管理各个数据存储服务器,调度文件读写,回收文件空间以及恢复多节点拷贝。目前MFS只支持一个元数据服务器master,这是一个单点故障,需要一个性能稳定的服务器来充当。希望今后MFS能支持多个master服务器,进一步提高系统的可靠性。

2)Metalogger元数据日志服务器

负责备份管理服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在管理服务器出问题时接替其进行工作。元数据日志服务器是mfsl.6以后版本新增的服务,可以把元数据日志保留在管理服务器中,也可以单独存储在一台服务器中。为保证数据的安全性和可靠性,建议单独用一台服务器来存放元  数据日志。需要注意的是,元数据日志守护进程跟管理服务器在同一个服务器上,备份元数据日志服务器作为它的客户端,从管理服务器取得日志文件进行备份。

3)Chunkserver数据存储服务器(推荐至少两台chunkserver)

数据存储服务器是真正存储用户数据的服务器,负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数据传输。在存储文件时,首先把文件分成块,然后将这些块在数据存储服务器之间互相复制(复制份数手工指定,建议设置副本数为3),数据服务器可以是多个,并且数量越多,可使用的"磁盘空间"越小,可靠性也越高。同时,数据存储服务器还负责连接管理服务器,听从管理服务器调度,并为客户提供数据传输。数据存储服务器可以有多个,并且数量越多,可靠性越高,MFS可用的磁盘空间也越大。

4)Client客户端

通过fuse内核接口挂接远程管理服务器上所管理的数据存储服务器,使共享的文件系统和使用本地Linux文件系统的效果看起来是一样的。

三、配置MooseFS高可用文件系统

配置环境:

CentOS 7.5 x 64

Master: 192.168.5.71

metalogger:192.168.5.72

VIP:192.168.5.77

Chunkservers: 192.168.5.73 192.168.5.74 192.168.5.75

#hosts文件配置

cat >> /etc/hosts << EOF
192.168.5.71 mfs71
192.168.5.72 mfs72
192.168.5.73 mfs73
192.168.5.74 mfs74
192.168.5.75 mfs75
EOF

###------------------- master-server元数据服务器安装配置 ---------------###

#创建mfs用户和组

useradd mfs -s /sbin/nologin
yum install -y gcc c++ zlib-devel
cd /opt
wget https://github.com/moosefs/moosefs/archive/v3.0.101.tar.gz
tar -zxvf v3.0.101.tar.gz
cd moosefs-3.0.101
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
make && make install cd /usr/local/mfs/etc/mfs
cp -a mfsmaster.cfg.sample mfsmaster.cfg
cp -a mfstopology.cfg.sample mfstopology.cfg
cp -a mfsexports.cfg.sample mfsexports.cfg

#配置文件说明

mfsmaster.cfg            主文件

# WORKING_ USER = mfs      #运行master server 的用户

# WORKING_ GROUP = mfs     #运行master server 的组

# SYSLOG_IDENT = mfsmaster #master server 在syslog 中的标识,说明是由master serve 产生的

# LOCK_MEMORY = 0          #是否执行mlockall()以避免mfsmaster 进程溢出(默认为0)

# NICE_LEVEL = -19         #运行的优先级(如果可以默认是-19; 注意: 进程必须是用root 启动)

# EXPORTS_FILENAME = /usr/local/mfs/etc/mfsexports.cfg #被挂接目录及其权限控制文件的存放位置

# DATA_PATH = /usr/local/mfs/var/mfs    #数据存放路径,此目录下大致有三类文件,changelog,sessions 和stats;

# BACK_LOGS = 50                        #metadata 的改变log 文件数目(默认是50);

# REPLICATIONS_ DELAY_INIT = 300        #延迟复制的时间(默认是300s);

# REPLICATIONS_ DELAY_DISCONNECT = 3600 #chunkserver 断开的复制延迟(默认是3600);

# MATOML_LISTEN_HOST = *     #metalogger 监听的IP 地址(默认是*,代表任何IP);

# MATOML_LISTEN_PORT = 9419 #metalogger 监听的端口地址(默认是9419);

# MATOCS_LISTEN_ HOST = *   #用于chunkserver 连接的IP 地址(默认是*,代表任何IP);

# MATOCS_LISTEN_PORT = 9420 #用于chunkserver 连接的端口地址(默认是9420);

# MATOCU_LISTEN_HOST = *    #用于客户端挂接连接的IP 地址(默认是*,代表任何IP);

# MATOCU_LISTEN_PORT = 9421 #用于客户端挂接连接的端口地址(默认是9421);

# CHUNKS_LOOP_TIME = 300    #chunks 的回环频率(默认是:300 秒);# CHUNKS_DEL_LIMIT = 100

# CHUNKS_WRITE_REP_LIMIT = 1 #在一个循环里复制到一个chunkserver 的最大chunk 数目(默认是1)

# CHUNKS_READ_REP_LIMIT = 5  #在一个循环里从一个chunkserver 复制的最大chunk 数目(默认是5)

# REJECT_OLD_ CLIENTS = 0    #弹出低于1.6.0 的客户端挂接(0 或1,默认是0)

# 凡是用#注释掉的变量均使用其默认值

# 修改DATA_PATH指定的目录要权限为mfs,chown -R mfs:mfs /usr/local/mfs/var/mfs

mfsexports.cfg           mfs挂载权限设置,参考NFS文件系统中的exports.cfg

mfstopology.cfg          机架感知

#修改配置文件

vi mfsexports.cfg

192.168.5.0/24         /          rw,alldirs,maproot=0
192.168.5.0/24 . rw

#参数说明

第一行允许192.168.5.0网段机器可以挂载mfs的根分区;如果将"/"改为"."符号则表示允许访问所有

第二行允许192.168.5.0网段机器挂载使用回收站功能。如果决定了挂载mfsmeta,那么一定要在mfsmaster的mfsexport.cfg文件中添加这条记录:

#允许192.168.5.32服务器挂载mfs的根分区下的web目录

192.168.5.32         /web          rw,alldirs,maproot=0

IP格式说明

*所有的ip 地址

n.n.n.n单个ip 地址

n.n.n.n/bIP 网络地址/位数掩码

n.n.n.n/m.m.m.mIP 网络地址/子网掩码

f.f.f.f-t.t.t.tIP 段

权限说明:

ro          只读模式

rw          读写模式

alldirs     允许挂载任何指定的子目录

maproot     映射为root,还是指定的用户

password    指定客户端密码

 

#启动mfsmaster

/usr/local/mfs/sbin/mfsmaster start   #可以使用/usr/local/mfs/sbin/mfsmaster -a 命令进行启动,这种方式一般可用于修复性启动。

#或者systemctl start moosefs-master.service

#设置开机启动

systemctl enable moosefs-master.service
systemctl list-unit-files|grep moosefs

#启动和停止Web GUI

/usr/local/mfs/sbin/mfscgiserv start

#访问http://192.168.5.71:9425

#监控平台,可以修改默认绑定IP地址和端口

vi /usr/local/mfs/sbin/mfscgiserv

host = '192.168.5.71'  #后期可以设置成VIP
port = 80

#开机启动

echo "/usr/local/mfs/sbin/mfscgiserv start" >> /etc/rc.local

###------------------------ chunkServer安装配置 ------------------------###

#格式化磁盘,sdb做数据存储

 #设置开机挂载

#创建mfs用户和组

cd /usr/local/mfs/etc/mfs/
cp mfschunkserver.cfg.sample mfschunkserver.cfg

#chunkserver配置文件如下:

mfschunkserver.cfg      这个是mfschunkserver配置文件

mfshdd.cfg              这个是mfschunkserver上的分区,必须是独立分区!

vi mfschunkserver.cfg

#这个填写master管理节点的ip或主机名(做了高可用后要改成VIP)

MASTER_HOST = 192.168.5.71
MASTER_PORT = 9420 cp mfshdd.cfg.sample mfshdd.cfg
echo "/mnt/mfsdata" >> mfshdd.cfg chown -R mfs:mfs /mnt/mfsdata

#在这里/mnt/mfsdata是一个给mfs 的分区,但在本机上是一个独立的目录,最好是一个单独的硬盘或者一个raid 卷,最低要求是一个分区。

#不要忘了更改目录的权限,因为mfschunkserver进程是用mfs运行的。

 

#启动chunkserver

/usr/local/mfs/sbin/mfschunkserver start

#或者

systemctl start moosefs-chunkserver.service

#设置开机自启动

systemctl enable moosefs-chunkserver.service

###--------------- metalogger元数据日志服务器安装配置 ------------------###

#创建mfs用户和组

 #mfsmetalogger.cfg文件配置
cd /usr/local/mfs/etc/mfs/
cp mfsmetalogger.cfg.sample mfsmetalogger.cfg vi mfsmetalogger.cfg
META_DOWNLOAD_FREQ = 1
MASTER_HOST = 192.168.5.71
MASTER_PORT = 9419

参数解释:

META_DOWNLOAD_FREQ  表示源数据备份下载请求频率,这里设置为1小时。默认为24小时,即每隔一天从元数据服务器(MASTER)下载一个metadata.mfs.back 文件。

当元数据服务器关闭或者出故障时,matedata.mfs.back 文件将消失,那么要恢复整个mfs,则需从metalogger 服务器取得该文件。请特别注意这个文件,它与日志

文件(即changelog_ml.0.mfs文件)一起,才能够恢复整个被损坏的分布式文件系统。元数据日志服务器的备份数据存放目录是/usr/local/mfs/var/mfs/。

 

#启动metalogger节点服务

/usr/local/mfs/sbin/mfsmetalogger start

#或者

systemctl start moosefs-metalogger.service

#设置开机自启动

systemctl enable moosefs-metalogger.service

#在master节点看看Web GUI访问页面(可以reload 重载mfscgiserv服务)

###------------------  mfs client客户端上的操作记录  -------------------###

#mfs client安装依赖与系统包fuse,通过yum方式安装

yum -y install fuse fuse-devel 

#加载fuse模块

modprobe fuse
lsmod |grep fuse

#创建mfs用户和组

#创建mfs挂载目录

mkdir /mnt/mfs      #这个是挂载的数据目录

mkdir /mnt/mfsmeta  #这个是挂载的回收站目录

#mfs client 挂载命令

#挂载到MFS的根目录(/)下,即在客户端/mnt目录下写入的数据会直接写到MFS的根目录下。这里客户端的挂载路径可以自定义

[root@web32 /]# /usr/local/mfs/bin/mfsmount /mnt/mfs -H 192.168.5.71             
# mfs文件系统是正规的mfs挂载系统,里面包含了所有的mfs存储的文件与目录
[root@web32 /]# /usr/local/mfs/bin/mfsmount -m /mnt/mfsmeta/ -H 192.168.5.71
# mfsmeta文件系统是mfs提供用于辅助的文件系统,相当于windows的回收站

#挂载到MFS子目录(/web)下,这个web目录是在MFS文件系统下真实存在的。在客户端显示的还是/mnt/web路径,往里面写入的数据其实是写到了MFS的/mnt/nfs/web路径下

[root@web32 /]# /usr/local/mfs/bin/mfsmount /mnt/web –H 192.168.5.71 –S /web

#mfsmount可用参数

-H#管理服务器IP

-P#管理服务器端口

-S#指出被挂接mfs 目录的子目录,默认是/目录,就是挂载整个mfs 目录

-m#这样可以挂载一个辅助的文件系统mfsmeta,辅助文件系统可以在如下两个方面恢复丢失的数据

#开机挂载

echo "/usr/local/mfs/bin/mfsmount /mnt/mfs -H 192.168.5.71" >> /etc/rc.local
echo "/usr/local/mfs/bin/mfsmount -m /mnt/mfsmeta/ -H 192.168.5.71" >> /etc/rc.local

#使用fstab自动挂载

/usr/local/mfs/bin/mfsmount /mnt/mfs fuse mfsmaster=192.168.5.71,mfsport=9421,_netdev 0 0

###---------------------- 测试下MFS回收站功能 --------------------------###

#在mfs挂载点删除一个文件,看看在mfsmeta挂载点能否找到

[root@web32 mfs]# echo "回收测试" > 11.txt
[root@web32 mfs]# /usr/local/mfs/bin/mfsrgettrashtime /mnt/mfs/11.txt
deprecated tool - use "mfsgettrashtime -r"
/mnt/mfs/11.txt:
files with trashtime 86400 : 1
#回收站存放的时间为24小时

#删除文件

rm /mnt/mfs/11.txt

#在回收站里面找到被删除的文件

[root@web32 mfs]# find /mnt/mfsmeta/trash/ -name "*11.txt*"
/mnt/mfsmeta/trash/004/00000004|11.txt #被删除的文件名在垃圾箱里面其实还是可以找到的,文件名是由一个8位16进制数的i-node和被删的文件名组成。在文件名和i-node之间不可以用"/",而是以"|"替代。 #如果一个文件名的长度超过操作系统的限制(通常是255字符),那么超出部分将被删除。从挂载点起全部路径的文件名被删除的文件仍然可以被读写。 #需要注意的是,被删除的文件在使用文件名(注意文件名是两部分),一定要用单引号引起来 #不加单引号报错 [root@web32 mfs]# cat /mnt/mfsmeta/trash/004/00000004|11.txt
cat: /mnt/mfsmeta/trash/004/00000004: 没有那个文件或目录
-bash: 11.txt: 未找到命令 [root@web32 mfs]# cat '/mnt/mfsmeta/trash/004/00000004|11.txt'
11.txt #从回收站里恢复已删除的文件 [root@web32 mfs]# cd /mnt/mfsmeta/trash/004
[root@web32 004]# ls
00000004|11.txt undel
[root@web32 004]# mv 00000004\|11.txt ./undel/ #文件已恢复,在恢复文件的时候,原来被删文件下面的目录下,不能有同名文件,不然恢复不成功 [root@web32 004]# cat /mnt/mfs/11.txt
回收测试 ##为垃圾箱设定隔离时间 #设置的时间是按照小时计算,设置的单位是秒,不满一小时就按一小时计算,(0:表示立即彻底删除,1小时:3600;1天:86400;一周:604800;1月:2592000) [root@web32 mfs]# /usr/local/mfs/bin/mfssettrashtime 600 /mnt/mfs/
/mnt/mfs/: 600 #上面设置为600秒,即10分钟,不足1小时,算作1小时,所以查看结果是3600秒(即1小时) [root@web32 mfs]# /usr/local/mfs/bin/mfsrgettrashtime /mnt/mfs
deprecated tool - use "mfsgettrashtime -r"
/mnt/mfs:
files with trashtime 86400 : 3
directories with trashtime 3600 : 1 #若把时间设置为0,说明文件执行删除命令后,就会立即删除,不可能再恢复,不进入回收站: [root@web32 mfs]# /usr/local/mfs/bin/mfssettrashtime 0 /mnt/mfs/ #递归 [root@web32 mfs]# /usr/local/mfs/bin/mfssettrashtime -r 0 /mnt/mfs/ #mfssettrashtime -r是对目录进行递归赋值的。为一个目录设定存放时间后,在此目录下新创建的文件和目录就可以继承这个设置了 [root@web32 mfs]# /usr/local/mfs/bin/mfssettrashtime -r 6000 /mnt/mfs/
/mnt/mfs/:
inodes with trashtime changed: 3
inodes with trashtime not changed: 1
inodes with permission denied: 0 [root@web32 mfs]# /usr/local/mfs/bin/mfsrgettrashtime /mnt/mfs
deprecated tool - use "mfsgettrashtime -r"
/mnt/mfs:
files with trashtime 7200 : 3
directories with trashtime 7200 : 1 #在其它mfs客户端看到的结果一样 [root@web33 mfs]# /usr/local/mfs/bin/mfsrgettrashtime /mnt/mfs
deprecated tool - use "mfsgettrashtime -r"
/mnt/mfs:
files with trashtime 7200 : 3
directories with trashtime 7200 : 1 ###----------------------- 设定数据副本数量 ----------------------------### #创建两个测试目录 [root@web32 mfs]# mkdir /mnt/mfs/test{1,2} #设置存放文件的份数,对于已经存在的文件不会改变其副本数,只对后续新写入的文件副本数生效 [root@web32 mfs]# /usr/local/mfs/bin/mfssetgoal 1 /mnt/mfs/test1
/mnt/mfs/test1: goal: 1 #查看文件份数 [root@web32 mfs]# /usr/local/mfs/bin/mfsgetgoal /mnt/mfs/test1
/mnt/mfs/test1: 1 #mfssetgoal -r设置对所有已存在的文件及子目录副本数为2,并且新写入的文件和子目录的副本数也为2 [root@web32 mfs]# /usr/local/mfs/bin/mfssetgoal -r 2 /mnt/mfs/test2
/mnt/mfs/test2:
inodes with goal changed: 0
inodes with goal not changed: 1
inodes with permission denied: 0 [root@web32 mfs]# /usr/local/mfs/bin/mfsgetgoal /mnt/mfs/test2
/mnt/mfs/test2: 2 #复制文件到对应的目录 [root@web32 mfs]# cp /etc/hosts /mnt/mfs/test1
[root@web32 mfs]# cp /etc/hosts /mnt/mfs/test2 #查看文件的实际副本数量 [root@web32 mfs]# /usr/local/mfs/bin/mfsfileinfo /mnt/mfs/test1/hosts
/mnt/mfs/test1/hosts:
chunk 0: 0000000000000005_00000001 / (id:5 ver:1)
copy 1: 192.168.5.74:9422 (status:VALID) [root@web32 mfs]# /usr/local/mfs/bin/mfsfileinfo /mnt/mfs/test2/hosts
/mnt/mfs/test2/hosts:
chunk 0: 0000000000000006_00000001 / (id:6 ver:1)
copy 1: 192.168.5.73:9422 (status:VALID)
copy 2: 192.168.5.74:9422 (status:VALID). #挂载MFS系统时,根目录系统默认设置的副本数量是2 [root@web32 mfs]# /usr/local/mfs/bin/mfsgetgoal /mnt/mfs/
/mnt/mfs/: 2
[root@web32 mfs]# /usr/local/mfs/bin/mfsgetgoal /mnt/mfs/web32.txt
/mnt/mfs/web32.txt: 2
[root@web32 mfs]# /usr/local/mfs/bin/mfsfileinfo web32.txt
web32.txt:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 192.168.5.73:9422 (status:VALID)
copy 2: 192.168.5.74:9422 (status:VALID) goal设置为2,只要两个chunkserver中有一个能够正常运行,数据就能保证完整性。 假如每个文件的goal(保存份数)都不小于2,并且没有under-goal文件(可以用mfsgetgoal –r和mfsdirinfo命令来检查),那么一个单一的chunkserver在任何时刻都可能做 停止或者是重新启动。以后每当需要做停止或者是重新启动另一个chunkserver的时候,要确定之前的chunkserver被连接,而且要没有under-goal chunks。 实际测试时,传输一个大文件,设置存储2份。传输过程中,关掉chunkserver1,这样绝对会出现有部分块只存在chunkserver2上;启动chunkserver1,关闭chuner2,这样绝对 会有部分块只存在chuner1上。把chunkserver2启动起来。整个过程中,客户端一直能够正常传输。在客户端查看,一段时间内,无法查看;稍后一段时间后,就可以访问了。 文件正常,使用mfsfileinfo 查看此文件,发现有的块分布在chunkserver1上,有的块分布在chuner2上。使用mfssetgoal 2和mfssetgoal -r 2均不能改变此文件的目前块的现状。 但使用mfssetgoal -r 1后,所有块都修改成1块了,再mfssetgoal -r 2,所有块都修改成2份了。 测试chunkserver端,直接断电情况下,chunkserver会不会出问题: 1)数据传输过程中,关掉chunkserver1,等待数据传输完毕后,开机启动chunkserver1. chunkserver1启动后,会自动从chunkserver2复制数据块。整个过程中文件访问不受影响。 2)数据传输过程中,关掉chunkserver1,不等待数据传输完毕,开机启动chunkserver1. chunkserver1启动后,client端会向chunkserver1传输数据,同时chunkserver1也从chunkserver2复制缺失的块。 如果有三台chunkserver,设置goal=2,则随机挑选2个chunkserver存储。 如果有一个chunkserver不能提供服务,则剩余的2个chunkserver上肯定有部分chunks(块)保存的是一份。则在参数(REPLICATIONS_DELAY_DISCONNECT = 3600)后,只有一份的chunks 会自动复制一份,即保存两份。保存两份后,如果此时坏掉的chunkserver能够提供服务后,此时肯定有部分chunks存储了三份,mfs会自动删除一份。 当增加第三个服务器做为额外的chunkserver时,虽然goal设置为2,但看起来第三个chunkserver从另外两个chunkserver上复制数据。 是的,硬盘空间平衡器是独立地使用chunks的,因此一个文件的chunks会被重新分配到所有的chunkserver上。 goal number不能超过chunkserver number,要小于或等于chunkserver的数量 #mfsdirinfo整个目录树的内容需要通过一个功能增强、等同于“du -s”的命令mfsdirinfo来显示。mfsdirinfo可以显示MFS的具体信息,查看目录树的内容摘要 [root@web32 mfs]# /usr/local/mfs/bin/mfsdirinfo /mnt/mfs
/mnt/mfs:
inodes: 8
directories: 3
files: 5
chunks: 5
length: 421
size: 368640
realsize: 663552 其中: 1)length 表示文件大小的总和 2)size 表示块长度总和 3)realsize 表示磁盘空间的使用,包括所有的副本 ###---------------------------- 快照snapshot ---------------------------### #MFS系统可以利用mfsmakesnapshot工具给文件或者目录做快照(snapshot),不能将快照放到MFS文件系统之外的其他文件系统下,快照文件和源文件必须要在同一个MFS文件系统下(即路径一致) # cd /mnt/mfs
/usr/local/mfs/bin/mfsmakesnapshot test2 test2-snapshot_20181031
/usr/local/mfs/bin/mfsmakesnapshot 11.txt 11.txt-snapshot_20181031 [root@web32 mfs]# ls
11.txt 11.txt-snapshot_20181031 test1 test2 test2-snapshot_20181031 #通过mfsdirinfo命令可以查看创建出来的目录快照,它只占用了一个inode,并不占用磁盘空间,就像ln命令创建硬链接类似 [root@web32 mfs]# /usr/local/mfs/bin/mfsdirinfo test2-snapshot_20181031
test2-snapshot_20181031:
inodes: 2
directories: 1
files: 1
chunks: 1
length: 188
size: 73728
realsize: 147456 [root@web32 mfs]# /usr/local/mfs/bin/mfsdirinfo test2
test2:
inodes: 2
directories: 1
files: 1
chunks: 1
length: 188
size: 73728
realsize: 147456 #通过mfsfileinfo命令可以查看创建出来的目录快照 [root@web32 mfs]# /usr/local/mfs/bin/mfsfileinfo 11.txt-snapshot_20181031
11.txt-snapshot_20181031:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 192.168.5.73:9422 (status:VALID)
copy 2: 192.168.5.74:9422 (status:VALID) [root@web32 mfs]# /usr/local/mfs/bin/mfsfileinfo 11.txt
11.txt:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 192.168.5.73:9422 (status:VALID)
copy 2: 192.168.5.74:9422 (status:VALID) mfsmakesnapshot是一次执行中整合了一个或者一组文件的副本,而且对这些文件的源文件进行任何修改都不会影响源文件的快照,就是说任何对源文件的操作,如写入操作,将会不修改副本。 mfsmakesnapshot可以实现这个快照功能,当有多个源文件时,他们的快照会被加入到同一个目标文件中,通过对比快照的测试,可以发现快照的本质: 1)一个MFS系统下的文件做快照后,查看两个文件的块信息,他们是同一个块。接着,把原文件删除,删除源文件后(最初会留在回收站上,但过一段时间后回收站的文件也删除了),快照 文件仍然存储,并且可以访问。使用mfsfileinfo查看,发现还是原来的块。 2)对一个文件做快照后,查看两个文件的块信息,发现是同一个块。把原文件修改后,发现原文件的使用块信息变了,即使用了一个新块。而快照文件仍然使用原来的块,保持文件内容不变。 #修改源文件来对比一下源文件和快照的块变化 [root@web32 /]# cd /mnt/mfs
[root@web32 mfs]# echo "快照恢复" >> 11.txt
[root@web32 mfs]# cat 11.txt
回收测试
快照恢复 #对比发现源文件和快照的块信息变了 [root@web32 mfs]# /usr/local/mfs/bin/mfsfileinfo 11.txt
11.txt:
chunk 0: 0000000000000007_00000001 / (id:7 ver:1)
copy 1: 192.168.5.73:9422 (status:VALID)
copy 2: 192.168.5.74:9422 (status:VALID) [root@web32 mfs]# /usr/local/mfs/bin/mfsfileinfo 11.txt-snapshot_20181031
11.txt-snapshot_20181031:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 192.168.5.73:9422 (status:VALID)
copy 2: 192.168.5.74:9422 (status:VALID) ###---------------------- MFS元数据损坏后的恢复 ------------------------### 在mfs master单点的情况下,当master元数据服务器出现故障导致元数据损坏后,可以通过Metalogger元数据日志服务器上的备份数据进行恢复,通常元数据有两部分的数据: 1)主要元数据文件metadata.mfs,当mfsmaster运行的时候会被命名为metadata.mfs.back 2)元数据改变日志changelog.*.mfs,存储了过去的N小时的文件改变。主要的元数据文件需要定期备份,备份的频率取决于取决于多少小时changelogs储存。 元数据changelogs应该实时的自动复制。自从MooseFS 1.6.5,这两项任务是由mfsmetalogger守护进程做的。 一旦master管理节点出现崩溃(比如因为主机或电源失败),需要最后一个元数据日志changelog并入主要的metadata中。这个操作时通过mfsmetarestore工具做的,最简单的方法是: [root@mfs71 mfs]# /usr/local/mfs/sbin/mfsmetarestore -a #如果master数据被存储在MooseFS编译指定地点外的路径,则要利用-d参数指定metadata的具体路径 [root@mfs71 mfs]# /usr/local/mfs/sbin/mfsmetarestore -a -d /storage/mfsmaster #模拟master(元数据服务器)彻底挂掉 #先通过mfs客户端记录下mfs文件系统上存储的数据情况 [root@web32 mfs]# tree
.
├── test1
│ └── hosts
├── test2
│ └── hosts
├── test2-snapshot_20181031
│ └── hosts
├── web32.txt
└── web33.txt
3 directories, 5 files #停止master节点并删除metadata.mfs及changelog.0.mfs(变更日志文件) [root@mfs71 mfs]# /usr/local/mfs/sbin/mfsmaster stop
[root@mfs71 mfs]# cd /usr/local/mfs/var/mfs
[root@mfs71 mfs]# ls
changelog.0.mfs changelog.17.mfs changelog.1.mfs changelog.39.mfs metadata.crc metadata.mfs.empty
changelog.15.mfs changelog.18.mfs changelog.20.mfs changelog.40.mfs metadata.mfs.back stats.mfs
changelog.16.mfs changelog.19.mfs changelog.38.mfs changelog.41.mfs metadata.mfs.back.1
[root@mfs71 mfs]# rm -rf ./* #没有metadata.mfs启动moosefs-master.service是会报错的 [root@mfs71 mfs]# /usr/local/mfs/sbin/mfsmaster start
open files limit has been set to: 16384
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmaster modules ...
exports file has been loaded
topology file has been loaded
loading metadata ...
can't find metadata.mfs - try using option '-a'
init: metadata manager failed !!!
error occurred during initialization - exiting #查看metalogger元数据日志服务器的文件情况 [root@mfs72 mfs]# cd /usr/local/mfs/var/mfs
[root@mfs72 mfs]# ls
changelog_ml.0.mfs changelog_ml.19.mfs changelog_ml_back.1.mfs metadata_ml.mfs.back.2
changelog_ml.15.mfs changelog_ml.1.mfs metadata.mfs metadata_ml.mfs.back.3
changelog_ml.16.mfs changelog_ml.37.mfs metadata.mfs.empty
changelog_ml.17.mfs changelog_ml.38.mfs metadata_ml.mfs.back
changelog_ml.18.mfs changelog_ml_back.0.mfs metadata_ml.mfs.back.1 #从metalogger元数据日志服务器上将最新一份metadata_ml.mfs.back及changelog_ml.0.mfs复制到master元数据服务器的的数据目录下 scp -P 65535 metadata_ml.mfs.back changelog_ml.0.mfs 192.168.5.71:/usr/local/mfs/var/mfs/ #在master上将复制过来的文件属主属组设为mfs [root@mfs71 mfs]# ls
changelog_ml.0.mfs metadata_ml.mfs.back
[root@mfs71 mfs]# chown -R mfs.mfs ./* #再来启动mfs master服务 [root@master-server mfs]# /usr/local/mfs/sbin/mfsmaster start
open files limit has been set to: 16384
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmaster modules ...
exports file has been loaded
topology file has been loaded
loading metadata ...
can't find metadata.mfs - try using option '-a'
init: metadata manager failed !!!
error occurred during initialization - exiting #发现启动还是报错,其实mfs的操作日志都记录到changelog.0.mfs里面。changelog.0.mfs每小时合并一次到metadata.mfs中,此时应该利用mfsmetarestore命令合并元数据changelogs,可以用自动恢复模式命令"mfsmetarestore –a" [root@mfs71 mfs]# /usr/local/mfs/sbin/mfsmetarestore -a
mfsmetarestore has been removed in version 1.7, use mfsmaster -a instead

#然后需要以-a方式启动master

[root@mfs71 mfs]# ls
changelog.0.mfs changelog_ml_back.0.mfs metadata_ml.mfs.back
[root@mfs71 mfs]# ps -ef|grep mfs
mfs 3206 1 0 15:09 ? 00:00:01 /usr/local/mfs/sbin/mfsmaster -a
root 3215 2894 0 15:11 pts/0 00:00:00 grep --color=auto mfs [root@mfs71 mfs]# lsof -i:9420
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mfsmaster 3206 mfs 9u IPv4 48004 0t0 TCP *:9420 (LISTEN)
mfsmaster 3206 mfs 11u IPv4 50182 0t0 TCP mfs71:9420->mfs73:25650 (ESTABLISHED)
mfsmaster 3206 mfs 13u IPv4 50192 0t0 TCP mfs71:9420->mfs74:49806 (ESTABLISHED) #去mfs客户端看看文件数量对不对 [root@web33 mfs]# tree
.
├── test1
│ └── hosts
├── test2
│ └── hosts
├── test2-snapshot_20181031
│ └── hosts
├── web32.txt
└── web33.txt
3 directories, 5 files ###------------------------ chunkserver故障测试 ------------------------### #在mfs客户端上查看文件的副本数(副本数量为2) [root@web33 mfs]# /usr/local/mfs/bin/mfsgetgoal /mnt/mfs/
/mnt/mfs/: 2 #查看mfs系统上的文件存储信息(两个chunkserver上都存储的有) [root@web33 mfs]# /usr/local/mfs/bin/mfsfileinfo /mnt/mfs/web32.txt
/mnt/mfs/web32.txt:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 192.168.5.73:9422 (status:VALID)
copy 2: 192.168.5.74:9422 (status:VALID) [root@web33 mfs]# /usr/local/mfs/bin/mfsfileinfo /mnt/mfs/web33.txt
/mnt/mfs/web33.txt:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 192.168.5.73:9422 (status:VALID)
copy 2: 192.168.5.74:9422 (status:VALID) #关闭其中的一个chunkserver [root@mfs73 mfs]# /usr/local/mfs/sbin/mfschunkserver stop
sending SIGTERM to lock owner (pid:1488)
waiting for termination terminated
 

#看看mfs客户端上的文件能否正常访问

[root@web32 mfs]# ls
web32.txt web33.txt
[root@web32 mfs]# cat web32.txt
web32 test file #现在通过客户端写入一个文件 [root@web32 mfs]# echo "chunkserver dowm" >> mfs73-down.txt
[root@web32 mfs]# ls
mfs73-down.txt web32.txt web33.txt #查看mfs73-down.txt存储信息 [root@web32 mfs]# /usr/local/mfs/bin/mfsfileinfo mfs73-down.txt
mfs73-down.txt:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 192.168.5.74:9422 (status:VALID) #上面可以看到mfs73-down.txt只存储到一个节点上,启动故障的chunkserver,看文件是否同步 [root@web32 mfs]# /usr/local/mfs/bin/mfsfileinfo mfs73-down.txt
mfs73-down.txt:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 192.168.5.73:9422 (status:VALID)
copy 2: 192.168.5.74:9422 (status:VALID) #可以看到文件已经同步,实测中间有几秒钟的延迟 ###------------------------ Moosefs存储空间扩容 ------------------------### #增加一个chunkserver节点

#看看mfs客户端上的文件能否正常访问

[root@web32 mfs]# ls
web32.txt web33.txt
[root@web32 mfs]# cat web32.txt
web32 test file #现在通过客户端写入一个文件 [root@web32 mfs]# echo "chunkserver dowm" >> mfs73-down.txt
[root@web32 mfs]# ls
mfs73-down.txt web32.txt web33.txt #查看mfs73-down.txt存储信息 [root@web32 mfs]# /usr/local/mfs/bin/mfsfileinfo mfs73-down.txt
mfs73-down.txt:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 192.168.5.74:9422 (status:VALID) #上面可以看到mfs73-down.txt只存储到一个节点上,启动故障的chunkserver,看文件是否同步 [root@web32 mfs]# /usr/local/mfs/bin/mfsfileinfo mfs73-down.txt
mfs73-down.txt:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 192.168.5.73:9422 (status:VALID)
copy 2: 192.168.5.74:9422 (status:VALID) #可以看到文件已经同步,实测中间有几秒钟的延迟 ###------------------------ Moosefs存储空间扩容 ------------------------### #增加一个chunkserver节点

学习MFS(六)的更多相关文章

  1. 前端学习 第六弹: javascript中的函数与闭包

    前端学习 第六弹:  javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) {   ...

  2. Android Animation学习(六) View Animation介绍

    Android Animation学习(六) View Animation介绍 View Animation View animation系统可以用来执行View上的Tween animation和F ...

  3. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  4. Bootstrap3.0学习第六轮(表单)

    Bootstrap3.0学习第六轮(表单) 前言 阅读之前您也可以到Bootstrap3.0入门学习系列导航中进行查看http://www.cnblogs.com/aehyok/p/3404867.h ...

  5. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  6. Maven学习(六)-- Maven与Eclipse整合

    由于我使用的是IDEA所以就不摘录了,感兴趣的移步 Maven学习总结(六)--Maven与Eclipse整合 Maven学习总结(七)--eclipse中使用Maven创建Web项目  

  7. python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍

    目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...

  8. Python学习第六课

    Python学习第六课 课前回顾 列表 创建 通过 [] :写在[]里,元素之间用逗号隔开 对应操作: 查 增 append insert 改(重新赋值) 删除(remove del pop(删除后会 ...

  9. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  10. 【转载】 强化学习(六)时序差分在线控制算法SARSA

    原文地址: https://www.cnblogs.com/pinard/p/9614290.html ------------------------------------------------ ...

随机推荐

  1. C# Task和异步方法

    本文主要参考: https://www.cnblogs.com/qtiger/p/13497807.html ThreadPool中有若干数量的线程.当有任务需要处理时,会从线程池中获取一个空闲的线程 ...

  2. NPOI导出大量数据的避免OOM解决方案【SXSSFWorkbook】

    一.NPOI的基本知识 碰到了导出大量数据的需求场景:从数据读取数据大约50W,然后再前端导出给用户,整个过程希望能较快的完成.如果不能较快完成,可以给与友好的提示. 大量数据的导出耗时的主要地方: ...

  3. 解决oracle用户过期问题

    转至:https://blog.51cto.com/718693/1566905 2014-10-22 21:31:01   最近测试部工作人员发现一个问题,说oracle用户密码提示要过期了,问我怎 ...

  4. Python 爬取 "王者荣耀.英雄壁纸" 过程中的矛和盾

    1. 前言 学习爬虫,最好的方式就是自己编写爬虫程序. 爬取目标网站上的数据,理论上讲是简单的,无非就是分析页面中的资源链接.然后下载.最后保存. 但是在实施过程却会遇到一些阻碍. 很多网站为了阻止爬 ...

  5. MySQL第一讲概论

    MySQL 后期内容 Python 今日内容概要 MySQL的概念 数据库软件的安装及使用 配置文件介绍 数据库常用命令(库操作.表操作.记录操作) 今日内容详细 什么是数据库 1.单机游戏 本地保存 ...

  6. VM虚拟机 Ubuntu配置与ssh连接

    VMware安装ubuntu 自定义 不作更改 选择稍后安装操作系统,相当于裸机,没装系统. 选择ubuntu64 选择虚拟机名字与保存路径 配置情况 2G即可 网络类型,选择NAT 可以了解一下这几 ...

  7. JZ-044-翻转单词顺序列

    翻转单词顺序列 题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如, ...

  8. LabVIEW,控件快捷菜单,温度转换

    目前正在自学LabVIEW,深感困难重重,我将偶尔发表一些自己的收获,自认为算是干货了, 搜到这篇随笔的朋友们或多或少遇到了些许困难,希望这能帮助到你们. 内容:练习使用LabVIEW中的控件快捷菜单 ...

  9. PHP读取.cer文件解析公钥证书.pfx证书

    php读取.cer文件 $certificateCAcerContent = file_get_contents($filePath); $certificateCApemContent = '--- ...

  10. C++高并发场景下读多写少的优化方案

    概述 一谈到高并发的优化方案,往往能想到模块水平拆分.数据库读写分离.分库分表,加缓存.加mq等,这些都是从系统架构上解决.单模块作为系统的组成单元,其性能好坏也能很大的影响整体性能,本文从单模块下读 ...