一、MooseFS


  • MooseFS是一个具有容错性的网络分布式文件系统。它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。
  • Moose文件系统(MooseFS)是由Core Technology开发的开源,POSIX兼容的分布式文件系统。MooseFS旨在为数据中心提供容错,高可用,高性能,可扩展的通用网络分布式文件系统。最初是专有软件,它于2008年5月5日作为开源向公众发布。
  • 目前有两个版本的MooseFS:
    MooseFS - 根据GPLv2许可发布,
    MooseFS专业版(MooseFS Pro) - 以二进制包形式的专有许可证发布。
  • 官网地址:http://www.moosefs.com/

二、组成


MooseFS遵循与Fossil(文件系统),Google File System,Lustre或Ceph类似的设计原则。文件系统包括三个组件:

  • 元数据服务器(Master) - 维护和管理文件的位置(布局),文件访问和命名空间层次结构。当前版本的MooseFS支持多个元数据服务器和自动故障转移。客户端只与MDS通信以检索/更新文件的布局和属性; 数据本身直接在客户端和块服务器之间传输。元数据服务器是用户空间守护程序 ; 元数据保存在内存中,并且懒惰地存储在本地磁盘上。
  • 元数据日志服务器(Metalogger)- 纪录数据的改动情况,定期从MDS中提取元数据以存储它以进行备份。从版本1.6.5开始,这是一个可选功能。
  • 块服务器(Chunk Server) - 存储数据并可选地在它们之间进行复制。虽然可扩展性限制尚未发布,但可能有很多。迄今为止报告的最大集群包括160台服务器。[7] Chunk服务器也是一个用户空间守护程序,它依赖于底层本地文件系统来管理实际存储。
  • 客户端 - 与Master和ChunkServer交谈。MooseFS客户端通过FUSE将文件系统挂载到用户空间。

三、原理


MFS读过程

  • 客户端向Master发送读请求
  • Master去缓存的数据库(非MySQL)中搜索客户端所需数据的位置,并告知客户端(Chunk Server IP、Chunk编号)
  • 客户端去指定Chunk Server的对应Chunk编号读取数据
  • 客户端通知Master读取完毕

MFS写过程

  • 客户端向Master发送写请求
  • Master通知Chunk Server(谁空闲,如空闲新建Chunk编号),找到后将知道的Chunk Server IP和编号告知客户端
  • 客户端向指定IP和编号存储数据
  • 客户端告知Master写入完毕
  • Master通知Metalogger有新数据写入(Matelogger纪录新增加文件位置和对应Chunk Server),日志记录完毕后,连接关闭

四、功能


为实现高可靠性和高性能,MooseFS提供以下功能:

  • 容错 - MooseFS使用复制,可以跨块服务器复制数据,每个文件/目录设置复制比率(N)。如果(N-1)个副本失败,则数据仍然可用。目前,MooseFS没有提供任何其他容错技术。因此,对于非常大的文件的容错需要大量的空间--N *文件大小而不是文件大小+(N * stripeize),如RAID 4,RAID 5或RAID 6的情况。MooseFS版本4.x PRO将具有RAID6。
  • 条带化 - 大文件分为块(最多64 兆字节),可以存储在不同的块服务器上,以实现更高的聚合带宽。
  • 负载平衡 - MooseFS尝试平等地使用存储资源,当前算法似乎只考虑消耗的空间。
  • 安全性 - 除了经典的POSIX文件权限之外,自1.6版本发布以来,MooseFS提供了一个简单的,类似NFS的身份验证 / 授权。
  • 相干快照 - 快速,低开销的快照。
  • 透明的“垃圾桶” - 删除的文件将保留一段可配置的时间。
  • 数据分层/存储类 - 可以“标记”服务器,创建称为“存储类”的标签定义,并决定数据存储在哪些类型的服务器上[8]
  • “项目”配额支持
  • POSIX锁,flock锁支持

四、数据存储方式


  • 文件以chunk大小存储,每chunk最大为64M。小于64M的,该chunk的大小即为该文件大小,超过64M的文件将被均分,每一份(chunk)的大小以不超过64M为原则;文件可以有多份copy,即除原始文件以外,该文件还存储的份数。当goal为1时,表示只有一份copy,这份copy会被随机存到一台chunkserver上。当goal的数大于1时,每一份copy会被分别保存到其它chunkserver上。goal的大小不要超过chunkserver的数量,否则多出的copy,不会有chunkserver去存,goal设置再多实际上也就没有意义的。copy的份数,一般设为大于1份,这样如果有一台chunkserver坏掉后,至少还有一份copy,当这台又被加进来后,会将失去的那份copy补回来,始终保持原有的copy数。而如果goal设为1,那么当存储该copy的chunkserver坏掉,之后又重新加入回来,copy数将始终是0,不会恢复到之前的1个copy
  • chunkserver上的剩余存储空间要大于1GB,新的数据才会被允许写入,否则,你会看到No space left的提示
  • 多个chunker并不影响写的速度,但是能加快读的速度,在原来的基础上增加一个chunker时,数据会自动同步到新增的chunker上以达到数据的平衡和均衡
  • MFS分布式文件系统

五、部署MFS


环境准备

Role IP OS RPM
Master 192.168.0.21 CentOS6.7_64bit mfs-1.6.27-5.tar.gz
MetaLogger 192.168.0.22 CentOS6.7_64bit mfs-1.6.27-5.tar.gz
Chunk Server 1 192.168.0.23 CentOS6.7_64bit mfs-1.6.27-5.tar.gz
Chunk Server 2 192.168.0.24 CentOS6.7_64bit mfs-1.6.27-5.tar.gz
Client 192.168.0.25 CentOS6.7_64bit mfs-1.6.27-5.tar.gz fuse-2.9.2.tar.gz

搭建Master Server

a.安装环境包并创建用户

vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.0.21
NETMASK=255.255.255.0
yum -y install zlib-devel    //安装依赖环境
useradd -s /sbin/nologin mfs    //创建mfs运行用户
tar -zxvf mfs-1.6.27-5.tar.gz -C /usr/src/ && cd /usr/src/mfs-1.6.27    //解包
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount    //配置选项
make && make install    //编译并安装
cd /usr/local/mfs/
ll                         //看下安装完成生成的目录
drwxr-xr-x 2 root root 4096 Dec  3 11:24 bin         //客户端工具
drwxr-xr-x 3 root root 4096 Dec  3 11:24 etc         //服务器的配置文件都放在该目录中 
drwxr-xr-x 2 root root 4096 Dec  3 11:24 sbin       //服务端启动程序。如:元数据服务器端程序 mfsmaster、数据存储服务器端服务程序mfschunkserver 
drwxr-xr-x 4 root root 4096 Dec  3 11:24 share     //文档 
drwxr-xr-x 3 root root 4096 Dec  3 11:24 var         //元数据目录(可在配置文件中自定义到其他目录)

b.复制文件

cd /usr/local/mfs/etc/mfs/
cp mfsmaster.cfg.dist mfsmaster.cfg    //Master配置文件
cp mfstopology.cfg.dist mfstopology.cfg    //输出目录配置文件
cp mfsexports.cfg.dist mfsexports.cfg    //元数据日志
cp /usr/local/mfs/var/mfs/metadata.mfs.empty /usr/local/mfs/var/mfs/metadata.mfs
//首次安装 master 时,会自动生成一个名为 metadata.mfs.empty 的元数据文件 metadata,该文件是空的。MooseFS master 运必须有文件 metadata.mfs

c.启动Master Server
master 会打开 9420 端口等待 chunkserver 数据存储服务器连接

/usr/local/mfs/sbin/mfsmaster start    //启动master服务
ps -ef | grep mfs
 ll /usr/local/mfs/var/mfs/         //查看生成的日志文件
    -rw-r----- 1 mfs mfs     95 Dec 24 14:30 metadata.mfs
    -rw-r----- 1 mfs mfs     95 Dec 24 14:28 metadata.mfs.back.1
    -rw-r--r-- 1 mfs mfs      8 Dec 24 14:13 metadata.mfs.empty
    -rw-r----- 1 mfs mfs     10 Dec 24 14:28 sessions.mfs
    -rw-r----- 1 mfs mfs 762516 Dec 24 14:30 stats.mfs
/usr/local/mfs/sbin/mfsmaster stop     //服务的关闭方法
/usr/local/mfs/sbin/mfscgiserv start    //启动web统计
IE --> 192.168.0.21:9425    //访问web统计界面

搭建MetaLogger Server

a.安装环境包并创建用户

vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.0.22
NETMASK=255.255.255.0
yum -y install zlib-devel
useradd -s /sbin/nologin mfs
tar -zxvf mfs-1.6.27-5.tar.gz -C /usr/src/ && cd /usr/src/mfs-1.6.27
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
make && make install

b.复制文件

cd /usr/local/mfs/etc/mfs/
cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
vim mfsmetalogger.cfg
MASTER_HOST = 192.168.0.21
//MASTER_HOST,这个文件中需要修改的是 MASTER_HOST 变量,这个变量的值是 MASTER SERVER 的 IP 地址 

c.启动Metalogger Server

/usr/local/mfs/sbin/mfsmetalogger start
ps -ef | grep mfs

搭建Chunk Server 1

a.安装环境包并创建用户

vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.0.23
NETMASK=255.255.255.0
yum -y install zlib-devel
useradd -s /sbin/nologin mfs
tar -zxvf mfs-1.6.27-5.tar.gz -C /usr/src/ && cd /usr/src/mfs-1.6.27
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount
make && make install

b.复制文件

cd /usr/local/mfs/etc/mfs/
cp mfschunkserver.cfg.dist mfschunkserver.cfg
cp mfshdd.cfg.dist mfshdd.cfg
vim mfschunkserver.cfg
MASTER_HOST = 192.168.0.21
vim mfshdd.cfg
/data
//数据存放的目录,一般为一块磁盘的挂载目录
mkdir /data
chown -R mfs:mfs /data

c.启动Chunk服务

/usr/local/mfs/sbin/mfschunkserver start
ps -ef | grep mfs

搭建Chunk Server2

a.安装环境包并创建用户

vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.0.24
NETMASK=255.255.255.0
yum -y install zlib-devel
useradd -s /sbin/nologin mfs
tar -zxvf mfs-1.6.27-5.tar.gz -C /usr/src/ && cd /usr/src/mfs-1.6.27
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount
make && make install

b.复制文件

cd /usr/local/mfs/etc/mfs/
cp mfschunkserver.cfg.dist mfschunkserver.cfg
cp mfshdd.cfg.dist mfshdd.cfg
vim mfschunkserver.cfg
MASTER_HOST = 192.168.0.21
vim mfshdd.cfg
/data
mkdir /data && chown mfs:mfs /data

c.启动Chunk服务

/usr/local/mfs/sbin/mfschunkserver start
ps -ef | grep mfs

client挂载MFS文件系统

a.安装fuse

vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.0.25
NETMASK=255.255.255.0
tar -zxvf fuse-2.9.2.tar.gz -C /usr/src/ && cd /usr/src/fuse-2.9.2
./configure && make && make install
vim /etc/profile
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
source /etc/profile

b.安装MFS客户端

useradd -s /sbin/nologin mfs
tar -zxvf ~/mfs-1.6.27-5.tar.gz -C /usr/src/ && cd /usr/src/mfs-1.6.27
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver --enable-mfsmount
make && make install

c.挂载MFS文件系统

modprobe fuse      //加载fuse模块到内核
vim /etc/rc.local    //开机自动加载
modprobe fuse
/usr/local/mfs/bin/mfsmount /media -H 192.168.0.21    //挂载
[root@mfs_client ~]# /usr/local/mfs/bin/mfssetgoal -r 1 -H /media/
//更改随机copy的次数
[root@mfs_client ~]# /usr/local/mfs/bin/mfsgetgoal -H /media/
//查看当前copy的次数