1.1、mfs文件系统的组成
1、元数据服务器。在整个体系中负责管理管理文件系统,目前MFS只支持一个元数据服务器master,这是一个单点故障,需要一个性能稳定的服务器来充当。希望今后MFS能支持多个master服务器,进一步提高系统的可靠性。
2、元数据日志服务器。备份master服务器的变化日志文件,文件类型为changelog_ml.*.mfs。当元数据服务器数据丢失或者损毁,可从日志服务器取得文件进行恢复。
3、数据存储服务器chunkserver。真正存储用户数据的服务器。存储文件时,首先把文件分成块,然后这些块在数据服务器chunkserver之间复制(复制份数可以手工指定,建议设置副本数为3)。数据服务器可以是多个,并且数量越多,可使用的“磁盘空间”越大,可靠性也越高。
4、客户端。使用MFS文件系统来存储和访问的主机称为MFS的客户端,成功挂接MFS文件系统以后,就可以像以前使用NFS一样共享这个虚拟性的存储了。
1.1.1、元数据服务器安装和配置(master)
正式环境为oel5.8,所有mfs子系统及客户端均在192.168.1.0段内。
Mfs主机:192.168.1.237
Mfs备机:192.168.1.236
Keepalived虚拟VIP :192.168.1.239
Mfs存储(chunkserver): (前端NGINX-M)192.168.1.134
(前端NGINX-S)192.168.1.36
(文件服务器NEW-WEB)192.168.1.238
Mfs客户端:(后端TOMCAT1)192.168.1.233
(后端TOMCAT2)192.168.1.234
(前端NGINX-M)192.168.1.134
(前端NGINX-S)192.168.1.36
Moosefs版本为moosefs-2.0.72-1.tar.gz
Fuse版本为fuse-2.8.4.tar.gz
安装前先查看文件描述,ulimit –n,最好设置的大点,
vim /etc/security/limits.conf
* hard nofile 50000
* softnofile 50000
(一)安装master方法一:编译安装
我们现在192.168.1.237和192.168.1.236上分别安装好mfsmaster。
可以到http://www.moosefs.org/download.html下载mfs各版本,鉴于服务器python环境为2.4.3,需要升级为python2.7.5可以较好的支持mfscgiserv。
1、下载moosefs安装包
2、解包 tar -zxvf moosefs-2.0.72-1.tar.gz
3、切换目录 cd moosefs-2.0.72
4、创建用户 useradd mfs -s /sbin/nologin
5、配置 ./configure--prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs
注意:在编译过程中可能会出现*************"checkingfor FUSE... no configure: error:mfsmount build was forced, but fuse development package is notinstalled"*******************可以不用管它,因为只是客户端挂接master
6、编译安装 make ; make install
(二)安装mfsmaster方法二:yum安装
如果你的系统的yum源已经升级到最新的,我们可以使用yum来安装moosefs2.0.72,
首先我们获取moosefs的rpm-gpg-key:
# curl "http://ppa.moosefs.com/RPM-GPG-KEY-MooseFS"> /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
在系统中导入rpm-gpg-key:
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
然后我们获取moosefs2.0.72的yum源:
# curl"http://ppa.moosefs.com/MooseFS-stable-el5.repo" >/etc/yum.repos.d/MooseFS.repo
最后我们就可以以yum的方式来安装:
Mfsmaster: # yum install moosefs-master moosefs-climoosefs-cgi moosefs-cgiserv
Chunkservers: # yum install moosefs-chunkserver
Metaloggers: # yum install moosefs-metalogger
Clients: # yum install moosefs-client
启动mfsmaster和mfschunkserver:
# servicemoosefs-master start
#service moosefs-chunkserver start
关于版本升级更新,在更新前应该做好metadata元数据的备份。
(三)配置元数据服务
元数据服务器的配置文件被放置于安装目录/usr/local/mfs/etc。与mfs-1.5.12版本不同的是:moosefs-2.0.72版安装完成只有模版文件,较之旧版的mfs,配置选项增加了几项可调控的选项,还增加了很多注释说明,其后缀形如mfsmaster.cfg.dist。为了使mfs master正常工作,需要两个配置文件mfsmaster.cfg及mfsexports.cfg,前者为主配置文件,后者为权限控制文件(mfs客户端挂接时使用)。
(1)主配置文件mfsmaster.cfg,可直接从模版文件拷贝而来,打开这个配置文件/usr/local/mfs/etc/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;
# FILE_UMASK = 027 创建文件的UMASK值
EXPORTS_FILENAME= /usr/local/mfs/etc/mfsexports.cfg 被挂接目录权限配置文件
DATA_PATH =/usr/local/mfs/var/mfs 数据存放路径,此目录下大致有三类文件,changelog,sessions和stats;三种类型文件。
#BACK_LOGS = 50 metadata 的改变log 文件数目(默认是50) 这里虽然默认值是50,但是在使用unison同步后,会额外的产生一个changlog.0.mfs的日志文件,unison部分会做说明。
#BACK_META_KEEP_PREVIOUS = 1,就是在/usr/local/mfs/var/mfs目录中metadata文件保存的数量为1。如果有多余的metadata文件,它会自动在原来名称后加后缀。
#CHANGELOG_PRESERVE_SECONDS = 1800 默认每隔1800秒变化的记录保存在内存中
#MISSING_LOG_CAPACITY = 100000 默认有100000个丢失chunks将存储在master中
#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);
#CHUNKS_LOOP_MAX_CPS = 100000 块循环不检查块每秒钟超过给定的数字(100000)的chunks
# CHUNKS_LOOP_TIME =300 chunks 的回环频率(默认是:300 秒);原文:在几秒钟内循环次数
#CHUNKS_SOFT_DEL_LIMIT = 10 软chunk删除一个chunkserver上的块数量
#CHUNKS_HARD_DEL_LIMIT = 25 硬chunk删除一个chunkserver上的块数量
#CHUNKS_WRITE_REP_LIMIT = 2,1,1,4 最大数量的块复制到一个chunkserver,第一个限制是比较危险的块(块只有一个副本);第二个限制是undergoal块(块的拷贝数量低于指定的目标);第三个限制是平衡与周围空间使用服务器之间的算术平均数;第四个限制是其他服务器之间的平衡(极低或极高的空间使用情况);这里mfs官方建议是第一个数字大于等于第二,第二大于或等于第三,第四大于或等于第三,即(第一个限制 > = 第二个限制 > = 第三个限制< = 第四个限制)。
#CHUNKS_READ_REP_LIMIT = 10,5,2,5 最大数量的块复制到一个chunkserver,
这个限制组和上面的写入的限制差不多,关系数量应该在写一样的限制,即(第一个限制 > = 第二个限制 > = 第三个限制< = 第四个限制)。
这里做下说明:上面这两个选项,是可以控制fsmchunkserver复制速度的,可以定义在一个循环里复制到一个chunkserver 的最大chunk数目
#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 定义了多久chunkservers仍将以“优雅”模式工作(以秒为单位).
#ACCEPTABLE_PERCENTAGE_DIFFERENCE = 1.0 chunkservers空间使用的百分比最大不同(默认是1.0;有效值:1.0 -10.0)
#PRIORITY_QUEUES_LENGTH = 1000000,优先队列的长度(濒危,undergoal等块-应该首先处理块,默认值是1000000)。
# MATOCL_LISTEN_HOST =* 用于客户端挂接连接的IP 地址(默认是*,代表任何IP);
# MATOCL_LISTEN_PORT =9421 用于客户端挂接连接的端口地址(默认是9421);
# SESSION_SUSTAIN_TIME = 86400 多久来维持一个断开连接的客户机会话(以秒为单位,默认是86400 = 1天)
# QUOTA_TIME_LIMIT = 604800 #在多少秒内的软配额(默认是604800 -7天)
尽管每行都被注释掉了,但它们却是配置文件的默认值,要改变这些值,需要取消注释,然后明确指定其取值。接下来说明一下其中一些项目的含义。
EXPORTS_FILENAME= /usr/local/mfs/etc/mfsexports.cfg 权限控制文件的存放位置。
DATA_PATH= /usr/local/mfs/var/mfs 数据存放路径,只元数据的存放路径。那么这些数据都包括哪些呢?进目录看看,大致分3种类型的文件:
(2)配置文件/usr/local/mfs/etc/mfsexports.cfg,也可直接从模版文件复制而来。这个文件的内容,十分类似NFS服务器的exports文件.实际配置时,可参照这个文件的默认行来修改以满足自己的应用需求.我的mfsexports.cfg文件的内容为:
192.168.1.0/24 . rw 这个“.”表示mfsmeta,就是我们下面挂接的垃圾回收站。
192.168.1.0/24 / rw,alldirs,maproot=0 挂接到mfs的根目录。
这种格式需要说明一下:
第一部分:客户端的ip 地址
第二部分:被挂接的目录
第三部分:客户端拥有的权限
第二部分说明
/ 标识MooseFS 根
第三部分详细说明
ro 只读模式共享
rw 读写的方式共享
alldirs 允许挂载任何指定的子目录
maproot映射为root,还是指定的用户(0表示ROOT)
password 指定客户端密码
(3)复制元数据文件
cp/usr/local/mfs/var/mfs/metadata.mfs.empty /usr/local/mfs/var/mfs/metadata.mfs
这是一个8字节的文件,为mfs-1.6.x以上新增项目。
(四)元数据服务器master启动
元数据服务器可以单独启动,即使没有任何数据存储服务器(chunkserver)也是能正常工作的,因此当我们安装配置完MFS后,即可启动它。执行命令 /usr/local/mfs/sbin/mfsmasterstart(如果启动过程报错,先检查配置文件,cp/usr/local/mfs/etc/mfsmaster.cfg.dist /usr/local/mfs/etc/mfsmaster.cfg,同理,mfsexport.cfg.dist也是一样的。我们最好对/usr/local/mfs,整体重新chown -R mfs.mfs/usr/local/mfs一下),如果没有意外,元数据库服务器就应该作为一个守护进程运行起来。现在我们可以通过3个方面来检查一下MFS master的运行状况:
先看启动过程:
查看master系统日志tail -f /var/log/messages
MFS的日志会直接写入系统日志。当我们增加数据存储服务器(chunkserver)或数据存储服务器(chunkserver)处故障时,都能在系统日志找到这些记录。注意,这个日志跟元数据变化日志不是一回事情。
启动:/usr/local/mfs/sbin/mfscgiserv 此时就可以通过http://192.168.1.237:9425 web监控界面查看到mfs使用情况了。
停止:kill掉进程就可以了。
(五)、关闭元数据服务器
关闭元数据服务器,务必使用 /usr/local/mfs/sbin/mfsmaster stop这种方式(之前使用1.6.x版本是支持-s停止的,新版不支持),如果直接使用kill杀死进程,将导致下次启动时出现找不到相关文件,而不能正常启动服务器。这个一定要谨慎。当然,如果发生了这个事情,还是可以通过 mfsmetastore 来恢复的。
1.1.2、元数据日志服务器安装和配置
元数据日志服务为mfs 1.6以后版本新增的服务,即可以把元数据日志保留在元数据服务器,也可以单独存储。为保证其可靠性,最好单独放置。需要注意的是,源数据日志守护进程跟元数据服务器(master)在同一个服务器上,备份元数据日志的服务器作为它的客户端,从元数据服务器取得日志文件进行备份。
(一)安装元数据日志服务器metalogger
说明:由于正式环境中,我们没有metalogger日志服务器,因为考虑到metalogger延时太大,这里只做简洁介绍:
1、下载moosefs2.0.72
2、解包tar -zxvfmoosefs-2.0.72-1.tar.gz
3、切换目录 cd moosefs-2.0.72
4、创建用户 useradd mfs -s /sbin/nologin
5、配置 ./configure--prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs
6、编译安装 make ; make install
(二)元数据日志服务(metalogger)配置
该服务仅需要一个配置文件,这里我们只需要从模板文件复制一个,然后稍微加以修改即可,下面是我的某个metalogger 的配置文件:配置前面几项是个master是一样的。
# WORKING_USER = mfs
# WORKING_GROUP = mfs
# SYSLOG_IDENT = mfsmetalogger
# LOCK_MEMORY = 0
# NICE_LEVEL = -19
#DATA_PATH = /usr/local/mfs/var/mfs 数据存放路径
#BACK_LOGS = 50 metadata 的改变log 文件数目(默认是50)
#META_DOWNLOAD_FREQ = 24 元数据备份文件下载请求频率。默认为24小时,即每隔一天从元数据服务器(MASTER)下载一个metadata.mfs.back 文件。当元数据服务器关闭或者出故障时,matedata.mfs.back文件将消失,那么要恢复整个mfs,则需从metalogger 服务器取得该文件。请特别注意这个文件,它与日志文件一起,才能够恢复整个被损坏的分布式文件系统。
# MASTER_RECONNECTION_DELAY = 5 重新连接master延时时间
MASTER_HOST = 192.168.1.239 (这里我们先填写为虚拟VIP地址)
MASTER_PORT = 9419
#MASTER_TIMEOUT = 60 可能是用于下载mfs.back文件重试时间
这个配置文件,唯一需要修改的地方就是MASTER_HOST,它的值必须是元数据服务器的主机名或者ip地址。另外,为方便大家进一步理解,我把配置文件里其他几个项目简单的说明一下:
(1) SYSLOG_IDENT= mfsmetalogger 元数据日志服务运行时,在系统日志输出的标识,下面给出一段系统日志:
(2)DATA_PATH= /usr/local/mfs/var/mfs 从元数据服务器(master)抓回文件,然后进行存放的路径。
(3)BACK_LOGS= 50 存放备份日志的总个数为50,超出50则轮转。在做元数据恢复时,仅仅需要最近的那个日志文件备份,因此默认的日志个数就足够了,这也保证了日志备份不会写满整个分区。
(三)元数据日志服务(metalogger)运行及关闭
1、启动过程为:
/usr/local/mfs/sbin/mfsmetalogger start
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmetalogger modules ...
mfsmetalogger daemon initialized properly
启动过程如果不能跟元数据服务器进行通信的话,系统会给出错误信息。
2、关闭服务,执行命令/usr/local/mfs/sbin/mfsmetalogger stop
3、检查服务的运行状况。从两个方面看,一个是元数据服务器,另一个是本身的数据生成情况。
察看元数据服务器网络连接,可以看见日志服务器连接到元数据服务器的tcp 9419端口。
查看日志服务器的工作目录,正常情况应该看见已经有文件生成了(从元数据服务器获取过来的)。可以手动从元数据服务器复制一个日志文件过来比较文件的内容。
、数据存储chunkserver服务器的安装配置
我们在这里说一下chunkserver具体安装环境:安装chunkserver前需要在(前端NGINX-M)192.168.1.134和(前端NGINX-S)192.168.1.36上安装fuse模块,因为这两台机器同时兼顾mfs客户端。省的下面重复安装。192.168.1.238上不需要安装fuse,所以编译选项中不需要加入--enable-mfsmount参数。
Mfsmount需要依赖FUSE,因此需要先安装好fuse,这里我选用 fuse-2.8.4.tar.gz。
Fuse下载地址:http://heanet.dl.sourceforge.net/project/fuse/fuse-2.X/
1、解包 tar zxvf fuse-2.8.4.tar.gz
2、切换目录 cd fuse-2.8.4
3、配置 ./configure
4、编译安装 make;make install
如果系统已经安装了fuse,则跳过这个步骤。
◆安装MFS客户端程序
1、修改环境变量文件/etc/profile ,追加下面的行,然后再执行命令source /etc/profile使修改生效。
exportPKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
一个MFS环境到底能集群多少服务器,最好3台以上;并且专门用来做存储。因为每个数据存储服务器的安装和配置都是相同的,所以只需按照一个服务器的操作就可以了。
(一)、安装数据存储服务器chunkserver
1、下载mfs安装包
2、解包 tar -zxvf moosefs-2.0.72-1.tar.gz
3、切换目录 cd moosefs-2.0.72
4、创建用户 useradd mfs -s /sbin/nologin
5配置./configure --prefix=/usr/local/mfs --with-default-user=mfs--with-default-group=mfs --enable-mfsmount --disable-mfsmaster
6、编译安装 make ; make install
(二)配置数据存储服务器chunkserver
数据存储服务器有2个配置需要修改,一个是主配置文件mfschunkserver.cfg ,另一个配置文件是 mfshdd.cfg。每个服务器用来分配给 MFS使用的空间最好是一个单独的硬盘或者一个raid卷,最低要求是一个分区。作者举的例子是创建一个大文件,然后挂接在本地,这不是个好主意,只能用来做实验了。
1、修改配置文件 /usr/local/mfs/etc/mfschunkserver.cfg。下面是修改了的配置文件:
# WORKING_USER = mfs
# WORKING_GROUP = mfs
#SYSLOG_IDENT = mfschunkserver chunkserver在syslog中的标识,说明是chunkserver产生
# LOCK_MEMORY = 0
# NICE_LEVEL = -19
# DATA_PATH = /usr/local/mfs/var/mfs
# MASTER_RECONNECTION_DELAY = 5
# BIND_HOST = *本地地址用于主连接(默认是*,即默认本地地址)
MASTER_HOST = 192.168.1.239
MASTER_PORT = 9420
# WORKERS_MAX = 150 # WORKERS_MAX_IDLE = 40 最大数量的活跃值和闲置的的最大数量
# MASTER_TIMEOUT = 60 连接MASTER的超时时间
# CSSERV_LISTEN_HOST = * 数据复制服务器地址
# CSSERV_LISTEN_PORT = 9422
# HDD_CONF_FILENAME =/usr/local/mfs/etc/mfshdd.cfg
# HDD_TEST_FREQ = 10 循环测试连接时间
# HDD_LEAVE_SPACE_DEFAULT = 256MiB chunkserver硬盘保留的默认空间
# IP address to listen for client (mount)connections (* means any)
# CSSERV_LISTEN_HOST = *
# CSSERV_LISTEN_PORT = 9422 监听客户端连接端口
# MASTER_TIMEOUT = 10
这个配置文件里,没有注释符号“#”就是被修改过的项了,
2、修改配置文件/usr/local/mfs/etc/mfshdd.cfg。为了使mfs拥有写目录的权限,需要修改目录的属主。我的服务器的分区挂接点是/databak/chunkserverdata/ , 用 chown -Rmfs:mfs /databak/chunkserverdata/ 把属主改变。因为我的每个服务器只需贡献一个分区做为MFS,因此配置文件只需要如下一行内容就可以了:
这里我们指定chunkserver存储空间大小:
/databak/chunkserverdata/ 440GiB 就是chunkserver这个机器真实存在的目录
这个文件默认情况下有好几行,有好几种空间配置方式:
/mnt/hd1 把hd1下所有的可用空间作为存储
*/mnt/hd2 指定这个盘为故障盘
/mnt/hd3 -5GiB 使用整块硬盘,但是最大保留5GiB的可用空间
/mnt/hd4 1.5TiB 使用整块硬盘,但是分配给chunkserver1.5TiB
(三)启动数据存储服务器chunkserver
在数据存储服务器chunkserver执行命令/usr/local/mfs/sbin/mfschunkserver start 启动数据存储守护进程.通过以下几种方式来检查chunkserver的运行状态.
1、查看进程 ps aux | grep mfschunkserver
2、查看网络状态,正常情况下应该看见9422处于监听状态,如果有其他数据存储服务器chunkserver在同一个元数据服务器master管理下运行的话,应该能看见其他chunkserver跟本机的连接情况:netstat -ant
3,查看元数据服务器的系统日志,可以看见新增的数据存储服务器chunkserver被加入。tail -f /var/log/messages
(四)关闭数据存储服务器
跟元数据服务器master相似,执行命令/usr/local/mfs/sbin/mfschunkserver stop , chunkserver服务就停下来了。为了使系统重启过程能自动启动chunkserver 服务,可以通过在/etc/rc.local文件追加行 /usr/local/mfs/sbin/mfschunkserver start 来达到这个目的(master的自动重启处理也可同样处理)。
1.1.4、mfsclient客户端的安装及配置
一、 MFS的客户端安装
(一)安装MFS客户端
我们上面已经安装了两个客户端了,下面只给(后端TOMCAT1)192.168.1.233和(后端TOMCAT2)192.168.1.234安装fuse就可以了。
注意:使用mfsmount必须安装FUSE模块,全称filesystem-userspace,如果系统内核版本低于2.6.20,会无法加载fuse.ko的模块,那么这就需要编译升级内核。
◆Mfsmount需要依赖FUSE,因此需要先安装好fuse,这里我选用 fuse-2.8.4.tar.gz。
Fuse下载地址:http://heanet.dl.sourceforge.net/project/fuse/fuse-2.X/
1、解包 tar zxvf fuse-2.8.4.tar.gz
2、切换目录 cd fuse-2.8.4
3、配置 ./configure
4、编译安装 make;make install
如果系统已经安装了fuse,则跳过这个步骤。
◆安装MFS客户端程序
1、修改环境变量文件/etc/profile ,追加下面的行,然后再执行命令source /etc/profile使修改生效。
exportPKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
如果不执行这个操作,在后面安装MFS的过程中,执行命令
./configure--enable-mfsmount时可能出现"checking forFUSE... no configure: error: mfsmountbuild was forced, but fuse development package is not installed"这样的错误,而不能正确安装MFS客户端程序。
2、解包 tar zxvf moosefs-2.0.72-1.tar.gz
3、切换目录 cd mfs-2.0.72
4、创建用户 useradd mfs -s /sbin/nologin
5、配置 ./configure--prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs--enable-mfsmount
6、编译安装 make ; make install
◆检查MFS客户端安装的结果。通过查看目录/usr/local/mfs/bin目录的文件,应该发现如下文件:[root@localhostnmxxt /]# ll/usr/local/mfs/bin/
total560
lrwxrwxrwx1 mfs mfs 8 May 13 17:44mfsappendchunks -> mfstools
lrwxrwxrwx1 mfs mfs 8 May 13 17:44mfscheckfile -> mfstools
lrwxrwxrwx1 mfs mfs 8 May 13 17:44 mfsdeleattr-> mfstools
lrwxrwxrwx1 mfs mfs 8 May 13 17:44 mfsdirinfo-> mfstools
lrwxrwxrwx1 mfs mfs 8 May 13 17:44 mfsfileinfo-> mfstools
lrwxrwxrwx1 mfs mfs 8 May 13 17:44mfsfilerepair -> mfstools
lrwxrwxrwx1 mfs mfs 8 May 13 17:44 mfsgeteattr -> mfstools
lrwxrwxrwx1 mfs mfs 8 May 13 17:44 mfsgetgoal-> mfstools
lrwxrwxrwx1 mfs mfs 8 May 13 17:44mfsgettrashtime -> mfstools
lrwxrwxrwx1 mfs mfs 8 May 13 17:44mfsmakesnapshot -> mfstools
-rwxr-xr-x1 mfs mfs 385463 May 13 17:44 mfsmount
lrwxrwxrwx1 mfs mfs 8 May 13 17:44 mfsrgetgoal-> mfstools
lrwxrwxrwx1 mfs mfs 8 May 13 17:44mfsrgettrashtime -> mfstools
lrwxrwxrwx1 mfs mfs 8 May 13 17:44 mfsrsetgoal-> mfstools
lrwxrwxrwx1 mfs mfs 8 May 13 17:44mfsrsettrashtime -> mfstools
lrwxrwxrwx1 mfs mfs 8 May 13 17:44 mfsseteattr-> mfstools
lrwxrwxrwx1 mfs mfs 8 May 13 17:44 mfssetgoal-> mfstools
lrwxrwxrwx1 mfs mfs 8 May 13 17:44mfssettrashtime -> mfstools
-rwxr-xr-x1 mfs mfs 137 May 13 17:44 mfssnapshot
-rwxr-xr-x1 mfs mfs 171919 May 13 17:44 mfstools
二、挂接和使用MFS文件系统
1、创建挂接点 mkdir /usr/xxtsrc/mfs
2、挂接MFS /usr/local/mfs/bin/mfsmount /mnt/mfs-H 192.168.1.237.注意,所有的MFS都是挂接同一个元数据服务器master,而不是其他数据存储服务器chunkserver !
[root@localhostmnt]# /usr/local/mfs/bin/mfsmount -H 192.168.1.237 /usr/xxtsrc/mfs
mfsmasteraccepted connection with parameters: read-write,restricted_ip ; root mapped toroot:root
3、通过使用df -h查看磁盘使用情况来检查是否被挂接成功。下图是挂接的虚拟VIP地址
三、挂接和使用meta文件系统(垃圾箱)
首先需要说明一下mfsmount的常用的参数:
-H master的IP地址
-P 客户端挂接master端的端口(如果master端的挂接端口已经改变)
-p 客户端挂接master需要的密码,该密码在master端的mfsexports.cfg文件中。
-S 挂载MASTER端根目录下的子目录,前提是必须通过挂载根目录后,创建相应的子目录,才可以挂载
-m 用于挂载mfsmeta文件系统,配合垃圾箱功能使用,默认挂载点是/mnt/mfsmeta该目录没有,需要自己创建。
-w 用于改变默认挂载点。
例1: /usr/local/mfs/bin/mfsmount /usr/xxtsrc/mfs -H 192.168.1.237 -p
例2: /usr/local/mfs/bin/mfsmount /usr/xxtsrc/mfs -H 192.168.1.237 -S /test -p
例3: /usr/local/mfs/bin/mfsmount /usr/xxtsrc mfsmeta -H192.168.1.237 -p –m
例4: /usr/local/mfs/bin/mfsmount -w /usr/xxtsrc/mfsmeta-test -H192.168.1.237 -p -m
2、垃圾箱恢复意外删除的文件
通过加入-m这个参数挂载mfsmeta文件系统时,必须在MASTER端的mfsexports.cfg里,必须打开如下内容的注释:
例如我的mfsexports.cfg配置文件是这样的
192.168.1.0/24 . rw
192.168.1.0/24 / rw,alldirs,maproot=0
在客户端直接执行
/usr/local/mfs/bin/mfsmount /usr/xxtsrc/mfsmeta -H 192.168.1.237 -m
注意:
a) /usr/xxtsrc/mfsmeta这个目录不需要执行chown -R mfs.mfs,直接在ROOT用户下创建该目录即可
b) 在这个目录下进行恢复意外删除文件的时候,必须使用ROOT账户进行操作。
c) 原来的位置下不能有一个已存在的与被删文件同名的文件,否则恢复不会成功。
d) 用一个-m的选项这样可以挂接一个辅助的文件系统MFSMETA,这么做的目的是对于意外的从MooseFS卷上删除文件或者是为了释放磁盘空间而移动的文件
进行恢复。使用该命令后只是执行了恢复性的操作,并不是客户端挂接master的操作,这个点要分清。
恢复具体流程
a) 执行完上述命令后,会在/mnt/mfsmeta生成reserved和trash 出现这两个目录
b) 在trash下,有一个undel的目录,还有一些被删除的以8位16进制命名的目录,并且以"|"作为目录符号,再加上被删除文件名字。(如果文件名字大于系统支持的255最大长度时,将从左到右进行裁剪,直到满足255)
规则:00000009|1,1代表删除的文件。
0000002E|123|txt 代表123目录下txt文件,如果123目录被一起删除,恢复的时候123这个目录也会被一同恢复出来。
c) 如果想恢复文件,把00000009|1该文件移动到/mnt/mfsmeta/trash/undel下,文件即可恢复。
d) reserved这个目录的作用是针对那些已被彻底删除但目前正被打开着的文件。
垃圾箱文件保留期默认是1天,86400秒
/usr/local/mfs/bin/mfsgettrashtime/mnt/mfs
执行效果:
/mnt/mfs: 86400
/usr/local/mfs/bin/mfssettrashtime
/usr/local/mfs/bin/mfssettrashtime3600 /mnt/mfs
执行效果:
/mnt/mfs:
inodes with trashtime changed: 3
inodes with trashtime not changed: 0
inodes with permission denied: 0
参数说明:
-r 表示递归修改这个目录下所有文件属性,不带-r表示修改本级目录。
如果将时间设置为0,表示不启用垃圾箱功能。
/usr/local/mfs/bin/mfsgetgoal/mnt/mfs/123/123
执行效果
/mnt/mfs/123/123: 2
/usr/local/mfs/bin/mfscheckfile /mnt/mfs/123/123
执行效果
/mnt/mfs/123/123:
2 copies: 1 chunks
查看文件拷贝具体信息
/usr/local/mfs/bin/mfsfileinfo/mnt/mfs/123/123
执行效果
/mnt/mfs/123/123:
chunk 0:000000000000001D_00000001 / (id:29 ver:1)
copy 1:192.168.1.1:9422
copy 2:192.168.9.5:9422
注:
a) 一个文件数据长度为零,并且也没有对此文件设置为0份拷贝的时候,这个文件查看拷贝信息的时候,会出现如下:/mnt/mfs/123/123:(通俗一点说,就是空文件无法获取到信息的。
查看目录具体信息,等同于du -sh
/usr/local/mfs/bin/mfsdirinfo/mnt/mfs
执行效果
/mnt/mfs:
inodes: 3 文件总数
directories: 2 目录数
files: 1 文件数
chunks: 1 块数
length: 31 文件大小总和
size: 70656 块长度总和
realsize: 141312 磁盘空间的使用包括所有的拷贝
设置文件拷贝份数
/usr/local/mfs/bin/mfssetgoal 2/mnt/mfs
执行效果
/mnt/mfs:
inodes with goal changed: 3
inodes with goalnot changed: 0
inodes withpermission denied: 0
参数说明
-r 表示递归修改这个目录下所有文件属性,不带-r表示修改本级目录。
注:
a) 拷贝份数尽量和chunkserver这个服务的数量保持一致,比较易于管理,数据额安全性也得到保障。
b) 上面这个命令产生的效果是:改变当前目录的属性,如果当前目录下已经存在一些文件,这些已存在文件的拷贝属性不会发生变化,只有新建的文件才会按照新的拷贝属性进行复制。
c) 递归修改这个目录下所有文件的拷贝份数属性后,所有文件的拷贝份数的变化需要一定的时间才会发生变化。
Client端大文件传输过程中,强制拔下master主机电源,造成master非法关闭,使用mfsmaster -a修复后,master日志报告有坏块:
Jan 19 17:22:17 ngmaster mfsmaster[3250]: chunkserver hasnonexistent chunk (000000000002139F_00000001), so create it for future deletion
Jan 19 17:22:18 ngmaster mfsmaster[3250]:(192.168.5.232:9422) chunk: 000000000002139F creation status: 20
Jan 19 17:25:18 ngmaster mfsmaster[3250]: chunk000000000002139F has only invalid copies (1) - please repair it manually
Jan 19 17:25:18 ngmaster mfsmaster[3250]: chunk000000000002139F_00000001 - invalid copy on (192.168.5.232 - ver:00000000)
Jan 19 17:26:43 ngmaster mfsmaster[3250]: currentlyunavailable chunk 000000000002139F (inode: 135845 ; index: 23)
Jan 19 17:26:43 ngmaster mfsmaster[3250]: * currentlyunavailable file 135845: blog.xxx.cn-access_log200904.tar.gz
/usr/local/mfs/bin/mfsfilerepairblog.xxx.cn-access_log200904.tar.gz
blog.xxt.cn-access_log200904.tar.gz:
chunks not changed: 23
chunks erased: 1
chunks repaired: 0
查看master日志,发现:
Jan 19 17:30:17 ngmaster mfsmaster[3250]: chunk hasn'tbeen deleted since previous loop - retry
Jan 19 17:30:17 ngmaster mfsmaster[3250]:(192.168.5.232:9422) chunk: 000000000002139F deletion status: 13
Jan 19 17:35:16 ngmaster mfsmaster[3250]: chunk hasn'tbeen deleted since previous loop - retry
Jan 19 17:35:16 ngmaster mfsmaster[3250]:(192.168.5.232:9422) chunk: 000000000002139F deletion status: 13
Client端执行以下操作后,master不再报告相关信息:
mv blog.xxt.cn-access_log200904.tar.gzblog.xxt.cn-access_log200905.tar.gz
/usr/local/mfs/bin/mfsmakesnapshot/mnt/mfs/123/tmp2 /mnt/mfs/111/
此命令是一个CP的过程,会自动将tmp2这个文件cp到111目录下。也可以针对一个目录来操作。
/usr/local/mfs/bin/mfsappendchunks/mnt/mfs/111/shot/mnt/mfs/123/123 /mnt/mfs/123/tmp2
将1个以上的源文件做成一个包,这里是将123和tmp2这两个文件的块追加到shot的块文件中。
注:
源和目标必须都属于mfs体系,即不能将mfs体系中的文件快照到其他文件系统。
1.2、mfs子系统测试
破坏性测试
一、测试数据存储服务器
我用5个服务器组成了MFS的存储平台,其中一个是master,其余四个服务器是chunkserver.先停止一个chunkserver服务,然后在某个MFS客户端往挂接点的目录(/mnt/mfs)里复制数据或者创建目录/文件、或者读取文件、或者删除文件,观察操作是否能正常进行。再停止第2个chunkserver,重复执行上述操作;然后再停止第3个服务器,执行类似的文件读些操作。减少chunkserver试验后,我们再来逐步增加chunkserver服务器,然后对MFS执行读写等相关访问操作,检验其正确性。
通过增减chunkserver服务器的测试,服务的可靠性确实不错,哪怕只剩下最后一个服务器,也能正常提供存储访问服务。
二、测试元数据服务器
元数据服务器最重要的文件在目录 /usr/local/mfs/var/mfs ,MFS每一个数据的变化,都被记录在这个目录的文件里,我们可以通过备份这个目录的全部文件,来保障整个MFS文件系统的可靠性.在正常情况下,元数据服务器的改变日志文件(changelogs) 实时地、自动地复制到所有的数据存储服务器,并且以changelog.*.mfs的形式命名。换句换说,即使元数据服务器报废了,也能再部署一个元数据服务器,然后从数据存储服务器chunkserver取得恢复所需要的文件。
(一)本地测试
1、停止元数据服务 /usr/local/mfs/sbin/mfsmaster stop
2、备份元数据服务器数据 cd /usr/local/mfs/var; tar -czvf mfs.tgz mfs
3、删除目录 mv mfs mfs.bk 或 rm –rf mfs
4、启动元数据服务 ../sbin/mfsmaster start 启动失败,提示不能初始化数据。
5、解包 tar zxvf mfs.tgz
6、执行恢复启动操作 .. /sbin/mfsmaster -a
8、在MFS客户端检查MFS存储的数据是否跟恢复前一致?能否正常访问等等。
(二)迁移测试
1、安装新的MFS元数据服务器。
2、从当前的元数据服器(master)或日志备份服务器(mfsmetalogger)复制备份文件 metadata.mfs.back到新的元服务器目录(metadata.mfs.back需要定时备份).
3、从当前的元数据服器(master)或日志备份服务器(mfsmetalogger)复制元数据服务器数据目录(/usr/local/mfs/var/mfs)到这个新的元数据服务器。
4、停止原先的那个元数据服务器(关闭计算机或停止它的网络服务)。
5、更改新的元数据服务器的ip为原来那个服务器的ip.
6、执行数据恢复启动操作,其命令为:mfsmaster -a
8、在MFS客户端检查MFS存储的数据是否跟恢复前一致?能否正常访问等等。
1.3、mfsclient读写测试
这块的误差受局域网硬件和网络的影响,在测试环境中,效果不太理想,基本是用dd命令执行写入的
测试写入:
timedd if=/dev/zero of=/mnt/mfs/1.img bs=1M count=5000
5242880000bytes (5.2 GB) copied, 70.9792 seconds, 73.9 MB/s
timedd if=/dev/zero of=/mnt/mfs/1.img bs=100K count=10000
1024000000bytes (1.0 GB) copied, 12.9659 seconds, 79.0 MB/s
测试读取:
timedd if=/mnt/mfs/1.old of=/dev/null
5242880000bytes (5.2 GB) copied, 35.99 seconds, 146 MB/s
同时测试读写:
timedd if=/mnt/mfs/1.img of=/mnt/mfs/1.old bs=1M
102400000bytes (102 MB) copied, 1.39368 seconds, 73.5 MB/s
测试删除:
timerm –rf *
real 0m0.828s
user 0m0.000s
sys 0m0.788s