一、文件系统选型


在一般的生产环境中,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    指定客户端密码

cd ../../var/mfs/
cp -a metadata.mfs.empty metadata.mfs
chown -R mfs:mfs /usr/local/mfs

#启动mfsmaster

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

#或者

systemctl start moosefs-master.service

[root@mfs71 mfs]# ps -ef|grep mfs
mfs      16792     1  7 15:50 ?        00:00:00 /etc/init.d/mfsmaster start
root     16799 10714  0 15:50 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 16792  mfs   10u  IPv4  34092      0t0  TCP *:9420 (LISTEN)
[root@mfs71 mfs]# netstat -tnlp|grep mfsmaster
tcp        0      0 0.0.0.0:9419            0.0.0.0:*               LISTEN      16792/mfsmaster     
tcp        0      0 0.0.0.0:9420            0.0.0.0:*               LISTEN      16792/mfsmaster     
tcp        0      0 0.0.0.0:9421            0.0.0.0:*               LISTEN      16792/mfsmaster

#设置开机启动

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

[root@mfs71 /]# ps -ef|grep mfscgiserv
mfs      17457     1  0 16:10 ?        00:00:00 /usr/bin/python /usr/local/mfs/sbin/mfscgiserv start
root     17474 10714  0 16:10 pts/0    00:00:00 grep --color=auto mfscgiserv
[root@mfs71 /]# lsof -i:9425
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mfscgiser 17457  mfs    3u  IPv4  50337      0t0  TCP *:9425 (LISTEN)

#监控平台,可以修改默认绑定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做数据存储

fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
mkdir -p /mnt/mfsdata
mount /dev/sdb1 /mnt/mfsdata

#设置开机挂载

vi /etc/fstab

/dev/sdb1       /mnt/mfsdata    ext4    defaults        0 0
[root@mfs73 opt]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   50G  1.9G   49G    4% /
devtmpfs                 908M     0  908M    0% /dev
tmpfs                    920M     0  920M    0% /dev/shm
tmpfs                    920M  8.5M  911M    1% /run
tmpfs                    920M     0  920M    0% /sys/fs/cgroup
/dev/mapper/centos-home   46G   33M   46G    1% /home
/dev/sda1               1014M  184M  831M   19% /boot
tmpfs                    184M     0  184M    0% /run/user/0
/dev/sdb1                 99G   61M   94G    1% /mnt/mfsdata

#创建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-mfsmaster --disable-mfsmount
make && make install
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运行的。

chown -R mfs:mfs /usr/local/mfs

#启动chunkserver

/usr/local/mfs/sbin/mfschunkserver start

#或者

systemctl start moosefs-chunkserver.service

#设置开机自启动

systemctl enable moosefs-chunkserver.service
[root@mfs73 mfs]# ps -ef|grep mfs
mfs      16089     1  2 16:51 ?        00:00:00 /usr/local/mfs/sbin/mfschunkserver start
root     16102 10515  0 16:52 pts/0    00:00:00 grep --color=auto mfs
[root@mfs73 mfs]# lsof -i:9422
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mfschunks 16089  mfs   11u  IPv4  29835      0t0  TCP *:9422 (LISTEN)

#查看master上的连接

[root@mfs71 /]# netstat -an |grep 9420
tcp        0      0 0.0.0.0:9420            0.0.0.0:*               LISTEN     
tcp        0      0 192.168.5.71:9420       192.168.5.73:14990      ESTABLISHED
tcp        0      0 192.168.5.71:9420       192.168.5.74:11408      ESTABLISHED

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

#创建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

#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/。

cd ../../var/mfs/
cp metadata.mfs.empty metadata.mfs
chown -R mfs:mfs /usr/local/mfs

#启动metalogger节点服务

/usr/local/mfs/sbin/mfsmetalogger start

#或者

systemctl start moosefs-metalogger.service

#设置开机自启动

systemctl enable moosefs-metalogger.service
[root@mfs72 mfs]# ps -ef|grep mfs
mfs      16641     1  0 17:42 ?        00:00:00 /usr/local/mfs/sbin/mfsmetalogger start
root     16643 10733  0 17:42 pts/0    00:00:00 grep --color=auto mfs
[root@mfs72 mfs]# lsof -i:9419
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mfsmetalo 16641  mfs    8u  IPv4  35845      0t0  TCP mfs72:19092->mfs71:9419 (ESTABLISHED)

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



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

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

yum -y install fuse fuse-devel

#加载fuse模块

modprobe fuse
[root@web32 /]# lsmod |grep fuse
fuse                   91880  1

#创建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-mfsmaster --disable-mfschunkserver --enable-mfsmount
make && make install

#创建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,辅助文件系统可以在如下两个方面恢复丢失的数据


#查看挂载情况

[root@web32 /]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   36G  3.7G   32G   11% /
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G     0  1.9G    0% /dev/shm
tmpfs                    1.9G   57M  1.8G    3% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                497M  166M  332M   34% /boot
tmpfs                    380M     0  380M    0% /run/user/0
192.168.5.71:9421        187G  635M  186G    1% /mnt/mfs
[root@web32 mfs]# ls
web32.txt  web33.txt

[root@web33 mfs]# ls
web32.txt  web33.txt

#开机挂载

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

#卸载挂载

umount /mnt/mfs
umount /mnt/mfsmeta

#使用fstab自动挂载

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


###------------------------ 设置mfscgiserv HTTP验证 --------------------###

#安装apache

yum -y install httpd

#创建apache认证用户

htpasswd -cm /etc/httpd/conf/htpasswd.users blufly
balala369

#httpd.conf配置

vi httpd.conf
DocumentRoot "/usr/local/mfs/share/mfscgi"
<Directory "/usr/local/mfs/share/mfscgi">
#确保cgi模块的加载
LoadModule cgi_module modules/mod_cgi.so
AddHandler cgi-script .cgi
Alias /cgi-bin/ "/usr/local/mfs/share/mfscgi/"
<Directory "/usr/local/mfs/share/mfscgi">
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
    AuthName "Mfs access"
    AuthType Basic
    AuthUserFile /etc/httpd/conf/htpasswd.users
    Require valid-user
</Directory>

#启动apache

systemctl start httpd.service

#设置自启

systemctl enable httpd.service

http://192.168.5.71

101.JPG

#修改mfs master的主机名

vi /usr/local/mfs/share/mfscgi/mfs.cgi
try:
if "masterhost" in fields:
masterhost = fields.getvalue("masterhost")
else:
masterhost = 'mfs71'
except Exception:
masterhost = 'mfs71'
masterhost = 'mfs71'


###----------------------------- 排错 ————————————————————----——————————###

[root@mfs71 ~]# /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
[root@mfs71 ~]# cd /usr/local/mfs/var/mfs
[root@mfs71 mfs]# mv metadata.mfs.back metadata.mfs
[root@mfs71 mfs]# systemctl start moosefs-master.service


###---------------------- 测试下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

mfsmaster -a.JPG

[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

chunkserver down.JPG

#看看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节点

增加chunkserver.JPG

#mfs空间已增加

[root@web32 mfs]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   36G  3.7G   32G   11% /
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G     0  1.9G    0% /dev/shm
tmpfs                    1.9G  8.8M  1.9G    1% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                497M  166M  332M   34% /boot
tmpfs                    380M     0  380M    0% /run/user/0
192.168.5.71:9421        280G  952M  279G    1% /mnt/mfs

#写入一个文件

[root@web32 mfs]# echo "add chunkserver" >> chunkserver.txt

#可以看到数据已有写到新添加的chunkserver上面

[root@web32 mfs]# /usr/local/mfs/bin/mfsfileinfo chunkserver.txt 
chunkserver.txt:
        chunk 0: 0000000000000004_00000001 / (id:4 ver:1)
                copy 1: 192.168.5.73:9422 (status:VALID)
                copy 2: 192.168.5.75:9422 (status:VALID)


###----------------------- MFS的常见问题和建议对策 ---------------------###

#启动MooseFS 集群顺序:

1、用mfsmaster start命令启动mfs master进程

2、用mfsmetalogger start命令启动mfs metalogger进程

3、用mfschunkserver start命令启动mfs chunkserver进程

4、用mfsmount命令在所有的客户端挂载MooseFS文件系统


#安全的停止MooseFS 集群顺序:

1、用umount 命令在所有的客户端卸载MooseFS文件系统

2、用mfschunkserver stop 命令停止mfs chunkserver 进程

3、用mfsmetalogger stop 命令停止mfs metalogger 进程

4、用mfsmaster stop 命令停止mfs master 进程



#Master性能瓶颈

master本身的性能瓶颈,短期对策:按业务切分

 

#体系架构存储文件总数的瓶颈

mfs把文件系统的结构缓存到master的内存中,个人认为文件越多,master的内存消耗越大,8g对应2500kw的文件数,2亿文件就得64GB内存。

 

#单点故障解决方案的健壮性

利用corosync+pacemaker+DRBD来解决master的单点问题,后面文章专门来解决这个问题


#垃圾回收

默认的垃圾回收时间是86400,存在一种可能性是垃圾还没回收完,你的存储容量就暴掉了。

1、设置垃圾回收时间,积极监控存储容量。经过测试,把垃圾回收时间设置1小时,完全可以正确回收容量。

2、手动周期性去删除metamfs里的trash目录下的文件(健壮性还有待测试,反正删除后容量是回收了,不晓得有没有什么后遗症。)