MFS存储
MFS简介
定义
# MFS:
MooseFS 是一个具备'冗余容错功能的分布式网络文件系统',它将数据分别存放在多个物理服务器或单独磁盘或分区上,确保一份数据有多个备份副本,然而对于访问 MFS 的客户端或者用户来说,整个分布式网络文件系统集群看起来就像一个资源一样,从其对文件系统的情况看 MooseFS 就相当于 UNIX 的文件系统
FUSE:用户空间文件系统
特性
1)高可靠性:每一份数据可以设置多个备份(多分数据),并可以存储在不同的主机上
2)高可扩展性:可以很轻松的通过增加主机的磁盘容量或增加主机数量来动态扩展整个文件系统的存储量
3)高可容错性:我们可以通过对mfs进行系统设置,实现当数据文件被删除后的一段时间内,依旧存放于主机的回收站中,以备误删除恢复数据
4)高数据一致性:即使文件被写入、访问时,我们依然可以轻松完成对文件的一致性快照
缺点
Master 社区版:目前是单点,虽然会把数据信息同步到备份服务器,但是恢复需要时间
Master 服务器对主机的内存要求略高
默认 Metalogger 复制元数据时间较长(可调整)
# 内存使用问题:
处理一百万个文件chunkserver,大概需要300M的内存空间。据此,推算如果未来要出来1个亿的文件chunkserver,大概需要30G内存空间
应用场景:
大规模高并发的线上数据存储及访问(小文件,大文件都适合)
大规模的数据处理,如日志分析,小文件强调性能不用 HDFS
两种分布式方案
分布式一
将一个单独的文件拆分为3个文件,分别放在3个机器上。客户端读取数据从3太服务器同时读取
优点:当数据比较大时,可利用多台机器的磁盘I/O,读取速度快、
缺点:只适用数据量大的环境上
分布式二
当有一组文件时,将文件分别放在不同的服务器上,此时无论数据的大小到适用,并且保留了文件的完整性。
(MFS选用的就是此种分布式)
MFS 组件说明
MFS 结构及其原理
角色说明
管理服务器 managing server 简称 master
这个组件的角色是管理整个mfs文件系统的主服务器,除了分发用户请求外,还用来存储整个文件系统中每个数据文件的 metadata 信息,metadate(元数据)信息包括文件(也可
以是目录,socket,管道,块设备等)的大小,属性,文件的位置路径等
承接用户请求、存储元数据信息
客户端连接Master服务器请求获取数据,M在自己内存中检索,返回Chunkserver的ip、端口以及数据的id给C,C根据返回的报文连接到Chunkserver上,数据获取完成后返回给客户端
缺点:发起多次TCP连接
元数据备份服务器 Metadata backup servers 简称 metalogger
这个组件的作用是备份管理服务器 master 的变化的 metadata 信息日志文件,文件类型为 changelog_ml.*.mfs 。以便于在管理服务器出问题时,可以经过简单的操作即可让新
的主服务器进行工作
# 备份Mster 节点元数据信息,一般在MFS集群中拥有多
数据存储服务器组 data servers(chunk servers)简称 data
这个组件就是真正存放数据文件实体的服务器了,这个角色可以有多台不同的物理服务器或不同的磁盘及分区来充当,当配置数据的副本多于一份时,据写入到一个数据服务器后,会根据算法在其他数据服务器上进行同步备份
#真实存储数据的服务器节点,可以基于磁盘目录乃至分区,可以轻松扩容
客户机服务器组(client servers)简称 client:
这个组件就是挂载并使用 mfs 文件系统的客户端,当读写文件时,客户端首先会连接主管理服务器获取数据的 metadata 信息,然后根据得到的 metadata 信息,访问数据服务器
读取或写入文件实体,mfs 客户端通过 fuse mechanism 实现挂载 mfs 文件系统的,因此,只有系统支持 fuse,就可以作为客户端访问 mfs 整个文件系统
#FUSE(用户空间文件系统),位于用户空间,跨平台性强。
MFS的数据操作流程
查询数据
# 遍历查询 ls /root
C 连接 M 发送遍历目录请求,M 检索元数据信息返回至 C,C 展现数据查看文件内容 cat a.txt
C 连接 M 发起查看文件请求,M 检索元数据信息,返回 chunkip port id 至 C
C 连接对应的 chunkserver 的 块,读取数据
删除数据
# 删除 rm filename
C 连接 M 发起删除文件请求
M 删除对应文件的元数据信息,并且将删除真实文件数据块的操作加入的对应节点的异步清除队列中,到达清除时间后,chunkserver负责清除自己的无效块数据,返回成功请求致C
增加数据
# copy
C 连接 M 发送拷贝文件请求,发送目标元数据信息
M 选择最优节点,要求创建新块
chunkserver 创建完新块以后,返回块ID 至 M
M 将新块 ID 返回至 C
C 连接至对应chunkserver 新块写入数据,写入完成后,向 M 发送关闭文件请求
M 连接新块确认数据信息,更新元数据
修改文件(vi xxx)
文件是新文件
C 连接 M 发起创建文件请求,M 选择对应 chunkserver 创建新块
chunkserve 创建新块(临时块) 返回至 M,
M 返回 chunkserver ip port id 至 C,C 连接对应 chunkserver 写入数据
C 向 M 发起关闭文件请求,M 连接 chunkserver 查看块
如果块为空,更新元数据信息,如果块有数据
按照 64 MB 分配原则,创建块拷贝临时块数据至 新块,更新元数据信息
文件是已经存在
C 连接 M 发起修改文件请求
M 连接至 CHUNKSERVER ,通知创建临时块拷贝源块数据
CHunkserver 临时块 IP PORT ID 发送至M
M 将 临时块 IP PORT ID 发送给 C
C 连接至对应的临时块修改数据,修改完成后,通知 M 关闭文件响应
M 连接临时块对比源块数据
如果数据一致,删除临时块,更新元数据信,如果数据不一致
按照 64MB 原则,创建新块,将临时块数据拷贝至新块,删除临时块以及源块,
更新元数据信息
MFS 补充描述
存储文件变更(持久化)
Master 记录着管理信息,比如:文件路径|大小|存储的位置(ip,port,chunkid)|份数|时间等元数据信息存在于内存中,会定期写入metadata.mfs.back 文件中,定期同步到 metalogger,操作实时写入changelog.*.mfs ,实时同步到 metalogger 中。Master 启动将 metadata.mfs 载入内存,重命名为 metadata.mfs.back 文件
时时写入加轮替changelog.*.mfs
changelog.*.mfs + metadata.mfs =metadata.mfs.back #保证数据的完整性
存储块分割
文件以 chunk 大小存储,每 chunk 最大为 64M,小于 64M 的,该 chunk 的大小即为该文件大小(验证实际 chunk 文件略大于实际文件),超过 64M 的文件将被切分,以每一份(chunk的大小不超过 64M 为原则;块的生成遵循规则:目录循环写入( 00-FF 256 个目录循环,step 为 2)、chunk 文件递增生成、大文件切分目录连续
MFS 存储可用性
Chunkserver 上的剩余存储空间要大于 1GB(Reference Guide 有提到),新的数据才会被允许写入,否则,你会看到 No space left on device 的提示,实际中,测试发现当磁盘使用率达到 95% 左右的时候,就已经不行写入了,当时可用空间为 1.9GB
MFS 副本可用性
文件可以有多份 copy,当 goal 为 1 时,文件会被随机存到一台 chunkserver 上,当
goal 的数大于 1 时,copy 会由 master 调度保存到不同的 chunkserver 上,goal 的大小不要超过 chunkserver 的数量,否则多出的 copy,不会有 chunkserver 去存
MFS分布式文件系统部署
MFS文件系统简介
MFS文件系统的4个角色
管理服务器 --- Master Server
元数据日志服务器 --- Metalogger
数据存储服务器 --- Chunk Server
客户端 --- Client
角色作用
# 管理服务器--mfsmaster:
有时也称为元数据服务器,负责管理各个数据存储服务器,调度文件读写,回收文件空间以及恢复多节点拷贝。
# 元数据服务器-mfsmetalogger:
负责备份管理服务器的变化日志,文件类型为changelog_ml.*.mfs,以便于在管理服务器出现问题时接替期进行工作。这类服务器是在mfs1.6版本后新增的服务,可以把元数据日
志保留在管理服务器中,也可以单独存在一台服务器中。为保证数据的安全性和可靠性,建议单独使用一台服务器来存放元数据日志,需要注意的是,元数据日志守护进程跟管理服务器在同一个服务器,备份元数据日志服务器作为它的客户端,从管理服务器取得日志文件进行备份。
# 数据存储服务器-mfschunkserver:
这类是真正存储用户数据的服务器。在存储文件时,首先把文件分成块,然后把这些块在数据存储服务器之间互相复制,同事,数据存储服务器还负责连接管理服务器,听从管理服务器调度,并为客户提供数据传输。数据存储服务器可以有多个,并且数量越多,可靠性越高。MFS可用的磁盘空间也越大。
# 客户端-mfsclient:
客户端通过fuse内核接口挂载远程服务器上所管理的数据存储服务器,使共享的文件系统和使用本地linux文件系统的效果看起来一样的。
MFS分布式文件系统安装
实验环境说明
1、关闭防火墙、selinux
2、所有节点配置时间同步服务器
3、节点说明
192.168.190.111 MfsMaster
192.168.190.112 MfsMetalogger
192.168.190.113 MfsChunkServer1
192.168.190.114 MfsChunkServer2
192.168.190.115 MfsClient
4、源码包下载地址:源码包下载地址是:
http://ppa.moosefs.com/src/moosefs-3.0.84-1.tar.gz
源码包安装
安装 master server 管理服务器(192.168.190.111)
1) 编译安装
yum -y install pcre pcre-devel zlib zlib-devel gcc*
tar -zxf moosefs-3.0.84-1.tar.gz
cd moosefs-3.0.84
useradd -s /sbin/nologin -M mfs
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default
-group=mfs
make && make install
cd /usr/local
chown -R mfs.mfs mfs/
ln -s /usr/local/mfs/bin/* /usr/local/bin/
ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
ls mfs/
bin #存放CLient端的命令
etc #角色配置文件模版目录
sbin #角色存放
share #监控网站位置
var #空模版文件
2) mfsmaster.cfg(master端配置文件)
cd /usr/local/mfs/etc/mfs
cp -a mfsmaster.cfg.sample mfsmaster.cfg # 无需修改
# vim mfsmaster.cfg
# 配置文件说明
WORKING_USER = mfs
WORKING_GROUP = mfs
SYSLOG_IDENT = mfsmaster #在syslog中的表示,说明这是mfsmaster产生的
LOCK_MEMORY = 0 # 是否执行mlockall()以避免mfsmaster内存溢出(默认为0)
NICE_LEVEL = -19 # 运行的优先级(默认-19,注意,这进程必须是root启动 )
DATA_PATH = /usr/local/mfs/var/mfs (重要)
#数据存放路径,该目录下有三大类文件,changelog,sessions,stats
EXPORTS_FILENAME = /usr/local/mfs/etc/mfs/mfsexports.cfg (重要)
#被挂载目录以及其权限控制文件的存放位置
BACK_LOGS = 50 #元数据的改变日志文件数量(默认是50)
MATOML_LISTEN_HOST = * (重要)
# 元数据日志服务器监听的IP地址(默认是*,代表任何IP)
MATOML_LISTEN_PORT = 9419 (重要) # 元数据日志服务器监听的端口地址,默认是9419
MATOCS_LISTEN_HOST = * # 用于存储服务器(Chunk Server)连接的IP地址
MATOCS_LISTEN_PORT = 9420 # 是存储服务器(Chunk server)连接的端口地址
REPLICATIONS_DELAY_INIT = 300 # 延迟复制的时间(默认是300)
CHUNKS_LOOP_MIN_TIME = 300 # chunks 的回环率
CHUNKS_SOFT_DEL_LIMIT = 10
CHUNKS_WRITE_REP_LIMIT = 2,1,1,4
#在一个循环里复制到一个CHUNK Server的最大chunks数目
CHUNKS_READ_REP_LIMIT = 10,5,2,5
MATOCL_LISTEN_HOST = *
MATOCL_LISTEN_PORT = 9421
3) mfsexports.cfg(权限文件)
cp -a mfsexports.cfg.sample mfsexports.cfg
vim mfsexports.cfg #末尾处添加即可
192.168.190.0/24 . rw,alldirs,maproot=0
#配置文件说明
10.10.10.0/24 #表示MFSMETA文件系统
rw.alldirs,maproot=0 #表示客户端拥有的权限。所有客户端都有权限挂载
#权限部分选项如下:
#ro 只读模式共享
#rw 读写方式共享
#alldirs 允许挂载任何指定的子目录
#maproot 映射为root用户还是指定的用户
#password 指定客户端密码
4) metadata.mfs
#将metadata.mfs加载到内存中
cd /usr/local/mfs/var/mfs/
cp -a metadata.mfs.empty metadata.mfs
ll #确保文件的所有者所属主为 mfs.mfs
5)启动master server
mfsmaster start
mfscgiserv #查看监控信息(端口以及监控地址)
#starting simple cgi server (host: any , port: 9425 ,
#rootpath: /usr/local/mfs/share/mfscgi)
#浏览器查看MFS自带的监控(搭建的时候用,可以看到挂载信息以及共享的磁盘信息等)
#(disk 以及 mount)
192.168.190.111:9425
netstat -lnpt #查看监听端口,确保启动成功A
#ctive Internet connections (only servers)Proto Recv-Q Send-Q Local
#State PID/Program name '''tcp 0 0 0.0.0.0:9419
#5944/mfsmaster tcp 0 0 0.0.0.0:9420
#5944/mfsmaster '''
说明:停止master server,安全停止master server是非常必要的,千万不要kill,而是利
用自带的命令mfsmaster来安全停止master server,mfsmaster stop,我们安装后采用默认
的配置,没有做任何更改,所以默认的日志是写入/var/log/messages。
192.168.190.112 安装元数据日志服务器
1)编译安装
yum -y install pcre pcre-devel zlib zlib-devel gcc*
tar -zxf moosefs-3.0.84-1.tar.gz
cd moosefs-3.0.84
useradd -s /sbin/nologin -M mfs
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default
-group=mfs
make && make install
cd /usr/local
chown -R mfs.mfs mfs/
ln -s /usr/local/mfs/bin/* /usr/local/bin/
ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
2) mfsmetalogger.cfg
cd /usr/local/mfs/etc/mfs
cp -a mfsmetalogger.cfg.sample mfsmetalogger.cfg
vim mfsmetalogger.cfg
52 MASTER_HOST = 192.168.190.111#取消注释并修改为主服务器的地址
55 MASTER_PORT = 9419 #取消注释
39 META_DOWNLOAD_FREQ = 2
#元数据备份文件下载请求频率,默认是24小时,即每2小时从master server上下载一个
#metadata.mfs文件,当元数据服务器关闭或者故障的时候,metadata.mfs.back文件将消失,
#此时需要从元数据日志服务器中取得这个文件。注
#意,这个文件和日志文件共同使用才能恢复整个已损坏的分布式文件系统...只需要更改上面2
#行就行了,其他保持默认即可如果没有特殊要求。
#MASTER_HOST = 10.10.10.12 # master server 的地址
3)启动元数据服务器
mfsmetalogger start # 启动命令
ls /usr/local/mfs/var/mfs # 查看工作目录下是否有元数据文件
#changelog_ml_back.0.mfs changelog_ml_back.1.mfs metadata.mfs.empty
# metadata_ml.mfs.back
#lsof -i :9419 # 确保端口在使用中COMMAND
#PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEmfsmetalo 7446 mfs
#8u IPv4 19768 0t0 TCP
#172.16.160.192:48103->172.16.160.191:9419 (ESTABLISHED)
#cd /usr/local/mfs/var/mfs/
# 查看工作目录下是否有元数据文件
192.168.190.113/114 安装数据存储服务器
1)编译安装
#两台虚拟机分别添加一块新磁盘,并分区
fdisk /dev/sdb
n-p-1-w
mkfs.ext4 /dev/sdb1
partprobe /dev/sdb1
mkdir /mfs
/bin/mount -t ext4 /dev/sdb1 /mfs
echo "/bin/mount -t ext4 /dev/sdb1 /mfs" >> /etc/rc.local
yum -y install pcre pcre-devel zlib zlib-devel gcc*
tar -zxf moosefs-3.0.84-1.tar.gz
cd moosefs-3.0.84
useradd -s /sbin/nologin -M mfs
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default
-group=mfs
make && make install
cd /usr/local
chown -R mfs.mfs mfs/
ln -s /usr/local/mfs/bin/* /usr/local/bin/
ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
2)mfschunkserver
cd /usr/local/mfs/etc/mfs/
cp -a mfschunkserver.cfg.sample mfschunkserver.cfg
vim mfschunkserver.cfg
MASTER_HOST = 192.168.190.111 # 取消注释 指明master server服务器地址
MASTER_PORT = 9420 #取消注释 指明master server 端口
HDD_CONF_FILENAME = /usr/local/mfs/etc/mfs/mfshdd.cfg #取消注释
# 这个指明哪个配置文件来配置共享磁盘的
3)mfshdd
cp -a mfshdd.cfg.sample /usr/local/mfs/etc/mfs/mfshdd.cfg
vim mfshdd.cfg #末尾添加
/mfs
chown -R mfs.mfs /mfs/
4)启动服务
mfschunkserver start
#浏览器查看MFS自带的监控,(disk)是否有挂载信息
192.168.190.111:9425
#ps -ef | grep mfsmfs
#405681002:14 ? 00:00:00 mfschunkserver startroot
#4062517565002:15 pts/000:00:00grep mfs
10.10.10.14 安装数据存储服务器(fuse)
1)编译安装
yum -y install fuse fuse-devel fuse-libs
yum -y install pcre pcre-devel zlib zlib-devel gcc*
tar -zxf moosefs-3.0.84-1.tar.gz
cd moosefs-3.0.84
useradd -s /sbin/nologin -M mfs
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default
-group=mfs --disable-mfsmaster --disable-mfschunkserver
make && make install
mkdir /mfsclient
cd /usr/local
chown -R mfs.mfs mfs/
ln -s /usr/local/mllfs/bin/* /usr/local/bin/
ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
mfsmount /mfsclient/ -H 192.168.190.111#-H 指定 master server IP
mount
#192.168.190.111:9421 on /mfsclient typefuse.mfs(rw,nosuid,nodev,allow_other)
cd /mfsclient/
while 2>1; do; echo "1" >> 1.txt; done
du -sh 1.txt
cat 1.txt
cp -a /var/log/messages /mfsclient/
mfsgetgoal messages #查看默认的goal的数量
mfsfileinfo messages #查看保存在哪几个chunkserver上
mfssetgoal 1 messages #修改goal的数量
2)测试
#关闭其中一台Chunkserver,查看
mfsfileinfo messages
#打开关闭的Chunkserver,查看
mfsfileinfo messages
#看出的动态添加,动态扩容
特殊功能
误删除处理,垃圾回收站机制
mfsgettrashtime messages #查看被删除后文件保存时间(不能低于6万秒)
mfssettrashtime 64800 /mnt/mfs/messages #修改删除文件保存时间
rm -rf messages
mkdir /back
chown mfs.mfs /back
mfsmount -m /back -H 192.168.190.111
cd /back
#sustained #持久化数据目录 trash 垃圾箱的块文5件目录
tree . >> /root/file.info
vim /root/file.info
mv 002/00000002\|1.txt /back/trash/undel/
#undel 放在此目录内代表不删除了
cd /mfsclient/ #查看内容是否被找回
#批量找回自己写脚本
快照功能
# client
mkdir bb
chown mfs.mfs bb/
mfsmakesnapshot 1.txt bb/
cd bb/
冗余 goal 设置
mfssetgoal 3 /mfs/test1
mfssetgoal /mfs/test1
mfsfileinfo /mfs/test1
还原 master
#将master服务器,恢复快照,模拟masters服务器损毁,尝试恢复
#新增一个master服务器,配置好需要配置的服务。
cd /usr/local/mfs/var/mfs/
rm -rf *
#元数据服务器操作
cd /usr/local/mfs/var/mfs/
scp -r * root@192.168.190.111:/usr/local/mfs/var/mfs/
#master服务器操作
chown -R mfs.mfs *
mfsmaster -a #-a代表修复并启动,若不加-a会报错
#client端测试是否恢复。
MFS高可用
注:本文为博主查阅多方资料整理而成,如有侵权请留言联系博主删除。
学习新东西,不要忘记复习旧知识,这样你才能更好!