首页 » 运维相关 » 分布式 » MOOSEFS分布式文件系统介绍和部署

MOOSEFS分布式文件系统介绍和部署

 

简单介绍MOOSEFS工作原理

 

MFS文件系统结构

 

角色

角色作用

管理服务器

managing server (master)

负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝

元数据日志服务器

Metalogger server(Metalogger)

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

数据存储服务器

data servers (chunkservers)

负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数据传输.

客户机挂载使用

client computers

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

 

MFS基础网络拓扑图

mfs1.jpg

实验环境

本次实验均在VMWARE虚拟机下进行实验

  1. 机器配置

    内存:256M

    CPU:单核

     

  2. 虚拟机数量

    4

     

  3. 系统

    操作系统:RedHat 4U4

    内核版本:2.6.9-42.ELsmp

     

    操作系统:Redhat 5.3MFS-CLIENT端使用的环境)

    内核版本:2.6.18-128.el5

 

  1. MFS版本

mfs-1.6.14

 

  1. 使用其他补丁的版本

    fuse-2.8.3

pkgconfig-0.21-2.el5

 

 

安装流程

MFS-MASTER安装

  1. MFS-MASTER安装

  1. 下载源码包

    http://pro.hit.gemius.pl/hitredir/id=1007_2OM3IJvULucytAjEoZifZuFnMc7hqxV5WTnaEn.P7/url=moosefs.com/tl_files/mfscode/mfs-1.6.14.tar.gz

  2. tar zxvf mfs-1.6.14.tar.gz

  3. useradd mfs -s /sbin/nologin

  4. ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs

  5. make ; make install

  6. cd /usr/local/mfs/etc

  7. cp mfsmaster.cfg.dist mfsmaster.cfg

  8. cp mfsexports.cfg.dist mfsexports.cfg

 

2、MFS-MASTER配置

a) 默认配置文件不做任何修改,即可以启动MFS-MASTER端

b) 简单介绍配置文件的具体参数 

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    数据存放路径,此目录下大致有三类文件,changelogsessionsstats

 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            在一个loop设备中可以删除chunks的最大数 (默认: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

注意mfsexports 访问控制对于那些老客户是没用的

LOCK_FILE=/var/run/mfs/mfsmaster.lock 避免启动多次启动同一个守护进程

 

   c)  vi mfsexports.cfg

       192.168.198.0/24        /       rw

192.168.1.0/24         /       rw,alldirs,maproot=0,password=passcode

10.0.0.0-10.0.0.5      /test   rw,maproot=nobody,password=test

 

第一部分:客户端的ip 地址

第二部分:被挂接的目录

第三部分:客户端拥有的权限

 

        第二部分说明

        /   标识MooseFS

       

 

        第三部分详细说明

        ro 只读模式共享

rw 读写的方式共享

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

maproot映射为root,还是指定的用户(0表示ROOT)

password 指定客户端密码

   

    d)  启动MFS-MASTER

        /usr/local/mfs/sbin/mfsmaster start

        关闭MFS-MASTER

        /usr/local/mfs/sbin/mfsmaster -s

   

    e)  首次启动会提示缺少元数据

        解决:

        cp /usr/local/mfs/var/mfs/metadata.mfs.empty /usr/local/mfs/var/mfs/metadata.mfs

 

       f)  再次启动MFSMASTER

       g)  检查是否启动成功

              netstat –nlp

              ps –ef|grep mfs

      

  1. 日志观察

tail –f /var/log/message

   

  mfsmetalogger的安装

  1. mfsmetalogger的安装

    1. ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs

    2. make ; make install

    3. useradd mfs -s /sbin/nologin

    4. cd /usr/local/mfs/etc

    5. cp mfsmetalogger.cfg.dist mfsmetalogger.cfg

       

  2. 配置mfsmetalogger

    1. vi mfsmetalogger.cfg

WORKING_USER =mfs     运行master server 的用户

WORKING_GROUP = mfs   运行master server 的用户组

SYSLOG_IDENT =mfsmetalogger    mfsmetaloggersyslog中的标识,说明是mfsmetalogger 产生的 LOCK_MEMORY = 0   是否执行mlockall()以避免mfsmaster 进程溢出(默认为0

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

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_HOST = 192.168.198.60   MFS-MASTER的IP

MASTER_PORT = 9419             MFS-MASTER的端口

MASTER_TIMEOUT = 60       可能是用于下载文件超时的重试时间

LOCK_FILE = /var/run/mfs/mfsmetalogger.lock 避免启动多次启动同一个守护进程

 

    1. 启动mfsmetalogger

      /usr/local/mfs/sbin/mfsmetalogger start   

      关闭MFS-METALOGGER

      /usr/local/mfs/sbin/mfsmetalogger -s

       

    2. 检查是否启动成功

              netstat –nlp

              ps –ef|grep mfs

      

    1. 日志观察

tail –f /var/log/messag

 

 

 

 

chunkserver的安装

  1. chunkserver的编译安装

  1. ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs

  2. make ; make install

  3. useradd mfs -s /sbin/nologin

  4. cd /usr/local/mfs/etc

  5. cp mfschunkserver.cfg.dist mfschunkserver.cfg

  6. cp mfshdd.cfg.dist mfshdd.cfg

 

  1. 配置chunkserver

  1. vi mfschunkserver.cfg

WORKING_USER = mfs     运行master server 的用户

WORKING_GROUP = mfs         运行master server 的用户组

DATA_PATH = /usr/local/mfs/var/mfs  数据存放路径

LOCK_FILE = /var/run/mfs/mfschunkserver.lock 避免启动多次启动同一个守护进程

SYSLOG_IDENT = mfschunkserver   chunkserversyslog中的标识,说明是chunkserver 产生

#BACK_LOGS = 50                

MASTER_RECONNECTION_DELAY = 30  重新连接延时30秒

MASTER_HOST = 192.168.198.60 元数据服务器的名称或地址,可以是主机名,也可以是ip 地址

MASTER_PORT = 9420          MFS-MASTER的端口

MASTER_TIMEOUT = 60             连接MASTER的超时时间

CSSERV_LISTEN_HOST = *      数据复制服务器地址

CSSERV_LISTEN_PORT = 9422 这个监听端口用于与其它数据存储服务器间的连接,通常是数据复制

CSSERV_TIMEOUT = 60         数据复制的超时时间

CSTOCS_TIMEOUT = 60         未知???

HDD_CONF_FILENAME = /usr/local/mfs/etc/mfshdd.cfg 分配给MFS 使用的磁盘空间配置文件的位置

  1. vi mfshdd.cfg

    /hdd     chunkserver端挂载点,就是chunkserver这个机器真实存在的目录

   

  1. 启动mfschunkserver

    /usr/local/mfs/sbin/mfschunkserver start

关闭MFS-METALOGGER

/usr/local/mfs/sbin/mfschunkserver -s

 

  1. 检查是否启动成功

              netstat –nlp || ps –ef|grep mfs

      

  1. 日志观察

tail –f /var/log/messag

 

MFS-CLIENT的安装

  1. MFS-CLIENT的安装

注:开始时,我使用的是REDHAT4u4,内核版本是2.6.9-42.ELsmp,client必须安装FUSE,全称filesystem-userspace,经过多次安装后,都无法加载fuse.ko的模块,通过查看内核编译选项,需要打开filesystem userspace 的支持,由于系统太老,缺少ISO,决定将系统平台迁移到redhat 5.3,内核版本为:2.6.18-128.el5;再次进行FUSE的编译安装,问题依旧,无法编译出内核需要的模块,决定进行内核编译安装,下载版本linux-2.6.27.24.tar

  1. tar xzf linux-2.6.27.24.tar –C /usr/src

  2. cd /usr/src/linux-2.6.27.24

  3. make menuconfig

  4. 选择file system,找到FILESYSTEM USERSPACE选项,空格,编译为动态模块

  5. 选择device drivers, 找到USERSPACE DRIVERS,空格

  6. 保存退出

  7. make bzImage

  8. make modules

  9. make modules_install

  10. cp System.map /boot/System.map-2.6.27.24

  11. cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.27.24

  12. mkinitrd initrd-2.6.27.24.img 2.6.27.24

    出现如下错误

    No module dm-mem-cache found for kernel 2.6.27.24, aborting.

    解决如下:

    mkinitrd --without-dmraid initrd-2.6.27.24.img 2.6.27.24

  13. 添加grub.conf文件信息

    内容如下

title CentOS (2.6.27.24)

  root (hd0,0)

  kernel /vmlinuz-2.6.27.24 ro root=LABEL=/ rhgb quiet

      initrd /initrd-2.6.27.24.img

保存退出

  1. reboot选择新的内核启动

n)modprobe -l |grep fuse还是没有发现FUSE

o) tar xzf fuse-2.8.3.tar.gz

    ./configure

    make && make install

p) make CONFIG_FUSE_FS=m -C /usr/src/linux-2.6.27.24 M=/usr/src/linux-2.6.27.24/fs/fuse modules

q) cd /usr/src/linux-2.6.27.24/fs/fuse/

r)mkdir /lib/modules/2.6.27.24/kernel/fs/fuse

s)cp fuse.ko /lib/modules/2.6.27.24/kernel/fs/fuse

t) depmod -a

u) modprobe -l | grep fuse

添加成功

  1. 光盘安装pkgconfig-0.21-2.el5

  2. 定义环境变量

    echo ‘export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH’ >>/etc/profile

    source /etc/profile

  3. useradd mfs -s /sbin/nologin

  4. 编译MOOSEFS

    1. 编译安装

./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs  --enable-mfsmount

 make && make install

    1. 配置挂载点

      mkdir /mnt/mfs

      chown –R mfs:mfs /mnt/mfs

      /usr/local/mfs/bin/mfsmount /mnt/mfs -H 192.168.198.60 -p

        mfsmount参数说明

        -H master的IP地址

        -p master用于与客户端连接的端口

-S 挂载MASTER端根目录下的子目录,前提是必须通过挂载根目录后,创建相应的子目录,才可以挂载

    c) 挂载时,默认提示输入密码,没有密码直接回车即可;

    d) 验证是否成功

        df –h

 

2.6.18内核对应的版本是fuse-2.7.1

备注:由于之前下载的fuse-2.8.3版本太高,将版本降至fuse-2.7.1安装,另外系统需要安装kernel-devel包,安装FUSE步骤

./configure=/usr/src/kernels/内核版本号

make

make install

会生产fuse.ko文件,如果/lib/modules/内核版本/kernel/fs/fuse里没有东西,查看make install记录,将fuse.ko文件复制到这里。

depmod –a

modprobe –l |grep fuse

加载成功 


使用MFS文件系统

1、CLIENT端挂载MFS

mfsmount参数说明

-H master的IP地址

-p master用于与客户端连接的端口

-S 挂载MASTER端根目录下的子目录,前提是必须通过挂载根目录后,创建相应的子目录,才可以挂载

-m 用于挂载mfsmeta文件系统,配合垃圾箱功能使用,默认挂载点是/mnt/mfsmeta

-w 用于改变默认挂载点

 

具体使用:

例1: /usr/local/mfs/bin/mfsmount /mnt/mfs -H 192.168.198.60 -p

例2: /usr/local/mfs/bin/mfsmount /mnt/mfs -H 192.168.198.60 -S /test -p

例3: /usr/local/mfs/bin/mfsmount /mnt/mfsmeta -H 192.168.198.60 / -p –m

例4: /usr/local/mfs/bin/mfsmount –w /mnt/mfsmeta-test -H 192.168.198.60 / -p -m

 

2、从垃圾箱恢复意外删除的文件

通过-m这个参数挂载mfsmeta文件系统时,必须在MASTER端的mfsexports.cfg里,必须打开如下内容的注释:

*    .     rw

 

客户端直接执行

/usr/local/mfs/bin/mfsmount /mnt/mfsmeta -H 192.168.198.60  / -p –m

注:

    1. /mnt/mfsmeta这个目录不需要执行chown –R mfs.mfs,直接在ROOT下创建该目录

    2. 在这个目录下进行恢复意外删除文件的时候,必须使用ROOT账户进行操作

    3. 原来的位置下不能有一个已存在的与被删文件同名的文件,否则恢复不会成功。

       

恢复流程:

  1. ./reserved  ./trash 出现这两个目录

  2. ./trash下,有一个./undel的目录,还有一些被删除的816进制命名的目录,并且以"|"作为目录符号,再加上被删除文件名字。(如果文件名字大于系统支持的255最大长度时,将从左到右进行裁剪,直到满足255

    规则:00000009|11代表删除的文件。

    0000002E|123|tst 代表123目录下tst文件,如果123目录被一起删除,恢复的时候123这个目录也会被一同恢复出来。

  3. 如果想恢复文件,把00000009|1该文件移动到/mnt/mfsmeta/trash/undel下,文件即可恢复。

  4. ./reserved这个目录的作用是针对那些已被彻底删除但目前正被打开着的文件。

 

 

  1. 垃圾箱相关设定

垃圾箱文件保留期默认是1天,86400

查看垃圾箱保留期时间

/usr/local/mfs/bin/mfsgettrashtime /mnt/mfs

执行效果:

/mnt/mfs: 86400

/usr/local/mfs/bin/mfssettrashtime

 

设置垃圾箱保留期

/usr/local/mfs/bin/mfssettrashtime 3600 /mnt/mfs

执行效果:

/mnt/mfs:

inodes with trashtime changed:                        3

inodes with trashtime not changed:                    0

inodes with permission denied:                        0

 

参数说明:

-r 表示递归修改这个目录下所有文件属性,不带-r表示修改本级目录。

如果将时间设置为0,表示不启用垃圾箱功能。

 

  1. 设置文件拷贝份数

查看文件设置拷贝份数

/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.198.62:9422

          copy 2: 192.168.198.64:9422

注:

      1. 一个文件数据长度为零,并且也没有对此文件设置为0份拷贝的时候,这个文件查看拷贝信息的时候,会出现如下:/mnt/mfs/123/123:(通俗一点说,就是空文件无法获取到信息的。

 

查看目录具体信息,等同于du -s

/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 goal not changed:                     0

 inodes with permission denied:                    0

 

参数说明

-r 表示递归修改这个目录下所有文件属性,不带-r表示修改本级目录。

 

注:

  1. 拷贝份数尽量和chunkserver这个服务的数量保持一致,比较易于管理,数据额安全性也得到保障。

  2. 上面这个命令产生的效果是:改变当前目录的属性,如果当前目录下已经存在一些文件,这些已存在文件的拷贝属性不会发生变化,只有新建的文件才会按照新的拷贝属性进行复制。

  3. 递归修改这个目录下所有文件的拷贝份数属性后,所有文件的拷贝份数的变化需要一定的时间才会发生变化。

 

  1. 修复损坏的块 --(该实验未能模拟出来,从网络上摘抄,以后可能会有用)

    Client端大文件传输过程中,强制拔下master主机电源,造成master非法关闭,使用mfsmetarestore -a修复后,master日志报告有坏块:

    Jan 19 17:22:17 ngmaster mfsmaster[3250]: chunkserver has nonexistent 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]: chunk 000000000002139F has only invalid copies (1) - please repair it manually

    Jan 19 17:25:18 ngmaster mfsmaster[3250]: chunk 000000000002139F_00000001 - invalid copy on (192.168.5.232 - ver:00000000)

    Jan 19 17:26:43 ngmaster mfsmaster[3250]: currently unavailable chunk 000000000002139F (inode: 135845 ; index: 23)

    Jan 19 17:26:43 ngmaster mfsmaster[3250]: * currently unavailable file 135845: blog.xxx.cn-access_log200904.tar.gz

Client端使用mfsfilerepair修复

/usr/local/mfs/bin/mfsfilerepair blog.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't been 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't been 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.gz blog.xxt.cn-access_log200905.tar.gz

 

  1. 快照

mfsmakesnapshot

    /usr/local/mfs/bin/mfsmakesnapshot /mnt/mfs/123/tmp2  /mnt/mfs/111/

此命令是一个CP的过程,会自动将tmp2这个文件cp到111目录下。也可以针对一个目录来操作。

 

mfsappendchunks

/usr/local/mfs/bin/mfsappendchunks /mnt/mfs/111/shot /mnt/mfs/123/123 /mnt/mfs/123/tmp2

将1个以上的源文件做成一个包,这里是将123和tmp2这两个文件的块追加到shot的块文件中。

注:

源和目标必须都属于mfs体系,即不能将mfs体系中的文件快照到其他文件系统。

灾难恢复实验

master

服务器损坏或是master无法启动

该实验模拟当MASTER得服务器出现宕机,或是master无法启动时,导致整个MFS存储系统无法正常提供服务,为保证快速恢复,特提出下列解决方案。

  1. Metalogger server搭建这个服务,并保证其数据的完整性。)

这个服务是moosefs 1.6之后推出的一个服务,是为了解决master端单点故障而推出的一个服务。该进程会同步复制master端的元数据和日志信息,有了这些文件后,可以轻松恢复mfsmaster的工作。

  1. 以下所有实验都基于Metalogger server来实现的。

 

实验1

         master机器损坏

         想法:由于Metalogger server这端拥有master所有变化的信息和元数据,所以在这台服务器上直接启用master进程,看看效果如何?

   

   

 


原文链接:MOOSEFS分布式文件系统介绍和部署,转载请注明来源!

0