MFS概述
MooseFS,是一个具备冗余容错功能的分布式网络文件系统,它将数据分别存放在多个物理server或单独disk或partition上,确保一份数据有多个备份副本,对于访问MFS的client或user来说,整个分布式网络文件系统集群看起来就像一个资源一样,从MFS对文件操作的情况看,相当于一个类unix的FS(ext{3,4}、nfs);
a、mfs是一个分层的目录树结构
b、存储支持POSIX标准的文件属性(权限,最后访问和修改时间)
c、支持特殊的文件。如:块设备,字符设备,管道、套接字、链接文件(符合链接、硬链接)
d、支持基于IP和密码的访问方式;
MooseFS的特性
a、高可靠性,每一份数据可以设置多个备份(多分数据),并可以存储在不同的主机上
b、高可扩展性,可以很轻松的通过增加主机的磁盘容量或增加主机数量来动态扩展整个文件系统的存储量
c、高可容错性,我们可以通过对mfs进行系统设置,实现当数据文件被删除后的一段时间内,依旧存放于主机的回收站中,以备误删除恢复数据
d、高数据一致性,即使文件被写入、访问时,我们依然可以轻松完成对文件的一致性快照
MooseFS的优点
a、轻量、易配置、易维护
b、易于扩展,支持在线扩容。不影响业务
c、开发活跃,社区也活跃,资料丰富
d、以文件系统方式展示:如存图片,虽然存储在chunkserver上的数据是二进制文件,但是在挂载mfs的client端仍旧以图片文件形式展示,便于数据备份
e、硬盘利用率高。测试需要较大磁盘空间
f、可设置删除的空间回收时间,避免误删除文件丢失就恢复不及时影响业务
g、系统负载,即数据读写分配到所有的服务器上
h、可设置文件备份的副本数量,一般建议3份,未来硬盘容量也要是存储单份的容量的三倍
MooseFS的缺点
a、master目前是单点(虽然会把数据信息同步到备份服务器,但是恢复需要时间,因此,会影响上线,针对这个问题,可以通过drbd+heartbeat方案或者drbd+inotify方案解决),master和backup之间的同步,类似mysql的主从不同。但是现在master的单点已经修复了
b、master服务器对主机的内存要求略高
c、默认metalogger复制元数据时间较长(可调整)
MooseFS系统应用场所
1、大规模高并发的线上数据存储及访问(小文件,大文件都适合)
2、大规模的数据处理,如日志分析,小文件强调性能不用HDFS。
有大多的应用不适合分布式文件系统,不建议大家为了使用而使用。
尽量在前端加cache应用,而不是一味的 扩充文件系统
其他分布式系统:
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严重依赖内核,需要重新编译内核。
MooseFS结构及原理
1)MFS的组成
元数据服务器(Master):在整个体系中负责管理文件系统,维护元数据,目前不支持高可用。
元数据日志服务器(MetaLogger):备份Master服务器的变化日志文件,当master服务器损坏,可以从日志服务器中取得文件恢复。
数据存储服务器(Chunk Server):真正存储数据的服务器,服务器越多,容量就越大,可靠性越高,性能越好。
客户端(Client): 可以像挂载NFS一样 挂载MFS文件系统
2)MFS读数据的处理过程
客户端向元数据服务器发出读请求
元数据服务器把所需数据存放的位置(Chunk Server的IP地址和Chunk编号)告知客户端
客户端向已知的Chunk Server请求发送数据
Chunk Server向客户端发送数据
.3)写入的过程
客户端向元数据服务器发送写入请求
元数据服务器与Chunk Server进行交互,但元数据服务器只在某些服务器创建新的分块Chunks,创建成功后由hunk Servers告知元数据服务器操作成功
元数据服务器告知客户端,可以在哪个Chunk Server的哪些Chunks写入数据
客户端向指定的Chunk Server写入数据
该Chunk Server与其他Chunk Server进行数据同步,同步成功后Chunk Server告知客户端数据写入成功
客户端告知元数据服务器本次写入完毕
注意:master服务器会把元数据metadada信息放在内存,对内存要求高,一百万个文件chunkserver,大概需要300M的内存空间
实验环境
mfs master :192.168.1.100
mfs backup :192.168.1.101
data server01 :192.168.1.102 增加10G硬盘
data server02 :192.168.1.103 增加10G硬盘
data server02 :192.168.1.104 增加10G硬盘
mfs client :192.168.1.105
所有电脑操作: 1、hosts文件配置 cat >> /etc/hosts << EOF 192.168.1.100 master 192.168.1.101 backup 192.168.1.102 data1 192.168.1.103 data2 192.168.1.104 data3 192.168.1.105 clinet EOF
2、关闭防火墙 # /etc/init.d/iptables stop
3、时间同步 ntpdate cn.pool.ntp.org
4、修改主机名
hostname 主机名
主服务器部署(mfs master)
1、下载安装包 软件包链接: https://pan.baidu.com/s/11_BcT5ahW01FAx73WT5q1w 密码:ibuy
2、创建用户和组 useradd -s /sbin/nologin -M mfs
3、安装依赖包 yum install -y gcc gcc-c++ zlib-deve fuse-devel fuse
4、安装源码包(几台都通用) tar xf mfs-1.6.27-1.tar.gz cd mfs-1.6.27 ./configure --prefix=/application/mfs-1.6.27 --with-default-user=mfs --with-default-group=mfs make && make install
5、配置文件 cd /application/mfs-1.6.27/etc/mfs cp mfsexports.cfg.dist mfsexports.cfg cp mfsmaster.cfg.dist mfsmaster.cfg 主配置文件 mfsmaster 暂时不需要改
6、配置 mfsexports cat >mfsexports.cfg<<EOF #Allow "meta". * .rw # Allow everything but "meta". 192.168.1.0/24 / rw,alldirs,mapall=mfs:mfs,password=111111 EOF
7、启动master cd /application/mfs/var/mfs cp metadata.mfs.empty metadata.mfs chown -R mfs.mfs /application /application/mfs/sbin/mfsmaster start
主文件说明: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) # 凡是用#注释掉的变量均使用其默认值
被挂载目录及访问权限:
mfsexport.cfg
192.168.1.0/24 / rw,alldirs,mapall=mfs:mfs,password=111111 第一部分:客户端的IP地址 *:代表所有的IP地址 192.168.100.71:代表单个IP地址 192.168.100.0/24:代表整个网段 192.168.100.71-192.168.100.100:代表指定网段 第二部分:被挂载的目录 /:标识MFS根 .:标识MFSMETA文件系统 第三部分:客户端拥有的权限 ro:代表只读模式 rw:代表读写方式共享 alldirs:允许挂载任何指定的子目录 admin:管理员权限
配置主服务器的图像监控
/application/mfs/sbin/mfscgiserv start host = '192.168.5.71' #后期可以设置成VIP port = 80 主服务器mfs master的图像监控mfscgiserv,这是一个用Python编写的一个web服务器,它的监控端口是9425. 启动后我们就可以用浏览器就即刻可以比肩全面的监控master、backup及所有客户端挂载的状况信息及相关操作等
端口解析
master《=====》backup:9419 也就是master和backup之间通信用9419端口通信 master《=====》chunk:9420 也就是master和data之间通信用9420端口 master sever module:listen on:9421 也就是提供服务给client的端口
master web port:9425 也就是master的web管理端口
master关闭
/application/mfs/sbin/mfsmaster stop 停止 /application/mfs/sbin/mfsmaster –s 关闭 /application/mfs/sbin/mfsmaster -a 修复性启动
元数据服务器部署(masterlogger)
1、master端打包,并传到Metalogger server上 tar zcvf mfs.tar.gz /application scp mfs.tar.gz 192.168.4.17:/root/ mv mfs.tar.gz / tar xf mfs.tar.gz
2、启用配置文件 cd /application/mfs/etc/mfs cp mfsmetalogger.cfg.dist mfsmetalogger.cfg vim mfsmetalogger.cfg MASTER_HOST = 192.168.1.100 去掉注释,添加master服务器的ip地址,可以是主机名、域名、IP ,主机名或域名要在/etc/hosts里指定
3、添加用户和组,并设置权限,并启动
useradd -s /sbin/nologin -M mfs
chown -R mfs.mfs /application
/application/mfs/sbin/mfsmetalogger start 只有进程无监听的端口 masterlogger性能不应该低于master,一旦主服务器master宕机,我们只要导入备份信息changelogs到元数据文件,备份服务器可直接替换故障的master。
元数据配置文件(mfsmetalogger)
# 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 # BACK_META_KEEP_PREVIOUS = 3 保持之前的元数据备份 # META_DOWNLOAD_FREQ = 24 元数据备件文件的下载请求频率。默认24小时,即每隔一天从master server 的/usr/local/mfs/var/mfs/下载此文件metadata.mfs.back。当元数据服务关闭或出现故障时,metadata.mfs.back文件会自动消失,此时要恢复整个mfs,需要从元数据日志服务器中取得该文件。这个文件与日志文件共同使用才能够恢复整个被损坏的分布式文件系统。 # MASTER_RECONNECTION_DELAY = 5 MASTER_HOST = 192.168.1.100 只需要修改这一行,改成master server的IP或主机名 # MASTER_PORT = 9419 # MASTER_TIMEOUT = 60 # deprecated, to be removed in MooseFS 1.7 # LOCK_FILE = /var/run/mfs/mfsmetalogger.lock
数据存储服务器 (chunkservers)
1、master端打包,并传到chunk server上 tar zcvf mfs.tar.gz /application scp mfs.tar.gz 192.168.1.103:/root/ mv mfs.tar.gz / tar xf mfs.tar.gz
2、分区格式化磁盘
parted /dev/vdb mklabel gpt
parted /dev/vdb mkpart primary 1 100%
parted /dev/vdb p
mkfs.ext4 /dev/vdb1
3、启用配置文件 cd /application/mfs/etc/mfs/ cp mfschunkserver.cfg.dist mfschunkserver.cfg vim mfschunkserver.cfg MASTER_HOST = 192.168.1.100 去掉注释,添加master服务器的ip地址 cp mfshdd.cfg.dist mfshdd.cfg vim mfshdd.cfg /data 这是给MFS的分区,生产环境下最好使用独立的分区或磁盘挂载到此目录下,可以是多个。
4、添加用户和组,并设置权限,并启动 useradd -s /sbin/nologin -M mfs chown -R mfs.mfs /application
chown -R mfs.mfs /data/ /application/mfs/sbin/mfschunkserver start
注:#df -h的结果与web监控界面显示的不一样,相差256M,当mfs上的data空间剩余256m时将不会再存内容,master向data申请空间是按最小256m申请的,低于256m将不再申请空间;
数据存储配置文件:
主配置文件(mfschunkserver.cfg) # WORKING_USER = mfs # WORKING_GROUP = mfs # SYSLOG_IDENT = mfschunkserver # LOCK_MEMORY = 0 # NICE_LEVEL = -19 # DATA_PATH = /usr/local/mfs/var/mfs # MASTER_RECONNECTION_DELAY = 5 # BIND_HOST = * MASTER_HOST = 192.168.1.18 # MASTER_PORT = 9420 # MASTER_TIMEOUT = 60 # CSSERV_LISTEN_HOST = * 监听来自客户端的连接,这里的客户端指其他chunk server。 # CSSERV_LISTEN_PORT = 9422 # HDD_CONF_FILENAME = /usr/local/mfs/etc/mfshdd.cfg 设置分配给mfs使用的磁盘空间文件的位置 # HDD_TEST_FREQ = 10块周期性测试10 # deprecated, to be removed in MooseFS 1.7 # LOCK_FILE = /var/run/mfs/mfschunkserver.lock # BACK_LOGS = 50 # CSSERV_TIMEOUT = 5 注意:CHUNKSERVER共享出去的磁盘需要大于1G以上,否则会提示空间不足,另外CHUNKSERVER也会占用几百M的空间
客户端部署(client server)
1、master端打包,并传到chunk server上 tar zcvf mfs.tar.gz /application scp mfs.tar.gz 192.168.1.103:/root/ mv mfs.tar.gz / tar xf mfs.tar.gz
2、加载fuse模块 modprobe fuse lsmod |grep fuse 方法(1)设置开机自动加载fuse到内核 echo "/modprobe fuse" >/etc/sysconfig/modules/fuse.modules chmod 755 /etc/sysconfig/modules/fuse.modules 方法(2)设置开机自动加载fuse到内核 echo "modprobe fuse" >>/etc/ec.modules chmod 755 /etc/rc.modules
3、添加用户和组,创建mfs挂载目录 mkdir /mnt/mfs #这个是挂载的数据目录 mkdir /mnt/mfsmeta #这个是挂载的回收站目录 useradd -s /sbin/nologin -M mfs chown -R mfs.mfs /application chown -R mfs.mfs /mnt/mfs chown -R mfs.mfs /mnt/mfsmeta
4、挂载 /application/mfs/bin/mfsmount /mnt/mfs -H 192.168.1.100 -o mfspassword=111111 正常挂载 /application/mfs/bin/mfsmount -m /mnt/mfs-trash -H 192.168.1.100 -o mfspassword=111111 挂载回收站 /application/mfs/bin/mfsmount -H 192.168.1.100 –S /web 挂载子目录
mfsmount:可用参数
-H:管理服务器IP -P:管理服务器端口 -S:指出被挂接mfs 目录的子目录,默认是/目录,就是挂载整个mfs 目录 -m:这样可以挂载一个辅助的文件系统mfsmeta,辅助文件系统可以在如下两个方面恢复丢失的数据
强制卸载: umount -lf /mnt/mfs
设备备份副本
1、查看副本数量 mfsfileinfo test1.txt (默认副本是1份) mfsgetgoal test1.txt 2、设置副本数量 mfssetgoal -r 3 a1 3、大文件存放: mfs的数据存放是分多个chunk,每个chunk大小为64m,一个文件若超过64m会占多个chunk; 4、查看删除文件时间 mfsgettrashtime 10m.img (默认86400,1天) 5、设置文件删除时间 mfssettrashtime -r 1200 /a2 6、还原文件 mfsmount 192.168.1.100 -m /mnt/mfs-trash/ 挂载回收站 mv 0000002|a2|oldboy.txt undel/ 移动删除的文件到 undel下
启动顺序:
mfsmaster-->mfsdata-->mfsbackup-->client
关闭顺序:
client先umount-->mfsdata-->mfsdata-->mfsmaster
MFS灾难恢复
整个MFS体系中,直接断电只有master server进程有可能无法启动,可以在master上使用命令 mfsmetarestore -a修复
MFS元数据通常有两部分的数据,分别如下:
(1)主要元数据文件metadata.mfs,当mfsmaster运行时会被命名为metadata.back.mfs。
(2)元数据改变日志 changelog.*.mfs,存储了过去N小时的文件变更。
在Master 发生故障时,可以从MetaLogger中恢复,步骤如下:
(1)安装一台mfsmaster,利用同样的配置来配置这台mfsmaster,mfsmaster进程先不要启动
(2)将metalogger上/application/mfs/var/mfs/目录下所有日志文件复制到mfsmaster相应的目录中。
(3)利用mfsmetarestore命令合并数据元changelogs。
恢复日志文件 tar -czvf mfs.tar.gz /application/mfs/var/mfs scp mfs.tar.gz 192.168.1.101:/application/mfs/var/ cd /application/mfs/var mv mfs/ /tmp tar xf mfs.tar.gz mfsmetarestore -m metadata_ml.mfs.back -o metadata.mfs changelog_ml.*.mfs /application/mfs/sbin/mfsmaster start 启动报错,执行 mfsmetarestore –a 自动修复
注意:要实时备份master日志文件!!!
master单点解决:
1、部署多个mfsbackup;
2、heartbeat+drbd实现mfsmaster的HA(drbd最好将安装路径同步);
haresource示例:
master1 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/drbd::ext3 mfs Ipaddr::192.168.2.103/24/eth0 mfsmaster
3、keepalived+inotify,对inotify的监控要准确;