一、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
环境准备
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的次数