MFS分布式对象存储
1.简介
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。一个典型的网络可能包括多个供多用户访问的服务器。
应用场景
适用于需要海量数据存储
解决方案:分布式存储,构建一个巨大的存储空间
目标:使用一个软件对多台服务进行统一管理配置方案
多台服务器对外表现为一个整体,是一整个集群
MFS分布式存储的优点:
- Free(GPL)通用文件系统
- 可以在线扩容,体系架构可伸缩性极强。
- 部署简单
- 高可用,可设置任意的文件冗余程度(提供比raid10更高的冗余级别,而绝对不会影响读或者写的性能,只会加速)
- 可回收在指定时间内删除的文件(“回收站”提供的是系统级别的服务,提供类似即时回滚特性
- 提供了类似于EMC,IBM等商业存储的snapshot(快照)特性。(可以对整个文件甚至在正在写入的文件创建文件的快照)
2.MFS工作原理和设计架构
角色 | 角色作用 |
---|---|
管理服务器managing server (master) | 负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复、多节点拷贝 |
元数据日志服务器Metalogger server(Metalogger) | 负责备份master 服务器的变化日志文件,文件类型为changelog_ml.*.mfs ,以便于在master server 出问题的时候提供数据找回功能 |
数据存储服务器data servers (chunk servers) | 负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数据传输. |
客户机挂载使用client computers | 通过fuse 内核接口挂接远程管理服务器上所管理的数据存储服务器,看起来共享的文件系统和本地unix 文件系统使用一样的效果. |
MFS的读数据过程
- 当客户端需要数据的时候,首先向master server发起查询请求
- 管理服务器检索自己的数据,获取到数据所在的可用数据服务器位置ip|port|chunkid
- 管理服务器将数据服务器的地址发送给客户端
- 客户端向具体的数据服务器发起数据获取请求
- 数据服务器将数据发送给客户端
MFS的写数据过程
- 当客户端有数据写需求的时候,首先向管理服务器提供文件元数据信息请求存储地址(元数据信息如:文件名|大小|份数等)
- 管理服务器根据写文件的元数据信息,到数据服务器创建新的数据块
- 数据服务器返回创建成功的消息
- 管理服务器将数据服务器的地址返回给客户端(客户端的ip地址|端口号|chunkid)
- 客户端向数据服务器写数据
- 数据u服务器返回给 客户端写成功的消息
- 客户端将此次写完成结束信号和一些信息发送到管理服务器来更新文件的长度和最后修改时间
MFS的修改或删除文件过程
- 客户端有删除操作的时候,首先向master发送删除信息
- master定位到相应元数据信息进行删除,并将chunk server上块的删除操作加入队列异步清理
- 响应客户端删除成功的信号MFS修改文件内容的过程客户端有修改文件内容时,首相向master发送操作信息
- master申请新的块给.swp文件,客户端关闭文件后,会向master发送关闭信息
- master会检测内容是否有更新,若有,那就申请新的块存放更改后的文件,删除原有块和.swp文件块
- 若无,则直接删除.swp文件块
MFS重命名文件的过程
- 客户端重命名文件时,会向master发送操作信息
- master直接修改元数据信息中的文件名
- 返回重命名完成信息
MFS遍历文件的过程
- 遍历文件不需要访问chunk server,当有客户端遍历请求的时候,会向master发送操作信息
- master返回相应元数据信息
- 客户端接收到信息后显示
注:
- Master记录着管理信息,比如:文件路径|大小|存储的位置(ip,port,chunkid)|份数|时间等,元数据信息存在于内存中,会定期写入metadata.mfs.back文件中,定期同步到metalogger;操作实时写入changelog.*.mfs,实时同步到metalogger server中。master启动将metadata.mfs载入内存,重命名为metadata.mfs.back文件。
- 文件以chunk大小存储,每chunk最大为64M,小于64M的,该chunk的大小即为该文件大小(验证实际chunk文件略大于实际文件),超过64M的文件将被切分,以每一份(chunk)的大小不超过64M为原则;块的生成遵循规则:目录循环写入(00-FF 256个目录循环,step为2)、chunk文件递增生成、大文件切分目录连续。
- Chunkserver上的剩余存储空间要足够大,新的数据才会被允许写入,否则,你会看到No space left on device的提示,实际中,测试发现当磁盘使用率达到95%左右的时候,就已经不行写入了,当时可用空间为1.9GB。
- 文件可以有多份copy,当goal为1时,文件会被随机存到一台chunkserver上,当goal的数大于1时,copy会由master调度保存到不同的chunkserver上,goal的大小不要超过chunkserver的数量,否则多出的copy,不会有chunkserver去存。
3.MFS安装部署配置实验
准备环境
IP | 身份 |
---|---|
192.168.88.10 | Client server |
192.168.88.20 | Master server |
192.168.88.30 | Metalogger server |
192.168.88.40 | Chunk server 1 |
192.168.88.50 | Chunk server 2 |
192.168.88.60 | Chunk server 3 |
192.168.88.70 | Chunk server 4 |
Master server
安装
#安装依赖
yum -y install gcc zlib-devel
#添加用户不进行登录
useradd -r -s /sbin/nologin mfs
#解压源码包
tar -xf moosefs-3.0.101-1.tar.gz
#切换目录
cd moosefs-3.0.101
#进行预编译
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmetalogger --disable-mfsmount
#安装
make && make install
配置
#让mfs可以在其他路径下执行命令
ln -s /usr/local/mfs/bin/* /usr/local/bin/
ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
#切换目录
cd /usr/local/mfs/etc/mfs
#备份一份文件
cp -a mfsmaster.cfg.sample mfsmaster.cfg
cp -a mfstopology.cfg.sample mfstopology.cfg
cp -a mfsexports.cfg.sample mfsexports.cfg
--------------------------------------------------------------------------
vim mfsexports.cfg
#客户端IP 允许挂载的目录 客户端拥有的权限
192.168.0.0/24 / rw,alldirs,maproot=0:0 # /标识MFS的根
192.168.0.0/24 . rw # .标识MFSMETA 文件系统
# ip:*、单IP、网段、IP范围都可
# 权限:
ro 只读模式共享
rw 读写方式共享
alldirs 允许挂载任何指定的子目录
maproot 映射为root用户组还是指定的用户组
password 指定客户端密码
---------------------------------------------------------------------------
管理
cd /usr/local/mfs/var/mfs
cp -a metadata.mfs.empty metadata.mfs
systemctl restart moosefs-master
netstat -antp
tcp 0 0 0.0.0.0:9419 0.0.0.0:* LISTEN 24997/mfsmaster
tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 24997/mfsmaster
tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 24997/mfsmaster
Metalogger server
安装
yum -y install gcc zlib-devel #安装依赖
tar -xf moosefs-3.0.101-1.tar.gz #解压安装包
cd moosefs-3.0.101/ #切换目录
useradd -r -s /sbin/nologin mfs #添加用户
#进行预编译
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmetalogger --disable-mfsmount
#安装
make && make install
配置
ln -s /usr/local/mfs/bin/* /usr/local/bin/
ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
cd /usr/local/mfs/etc/mfs
cp -a mfsmetalogger.cfg.sample mfsmetalogger.cfg
--------------------------------------------------------------
vim mfsmetalogger.cfg
MASTER_HOST = 192.168.88.20
---------------------------------------------------------------
管理
systemctl start moosefs-metalogger
netstat -antp |grep mfs
Chunk server (1-4)
安装前需要给四个虚拟主机添加四块硬盘并重启
安装
yum -y install gcc zlib-devel
tar -xf moosefs-3.0.101-1.tar.gz
cd moosefs-3.0.101/
useradd -r -s /sbin/nologin mfs
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount --disable-mfsmetalogger
make && make install
配置
ln -s /usr/local/mfs/bin/* /usr/local/bin/
ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
cd /usr/local/mfs/etc/mfs
cp -a mfschunkserver.cfg.sample mfschunkserver.cfg
---------------------- --------------------------------------------
vim mfschunkserver.cfg
MASTER_HOST = 192.168.88.20 #确认Master server位置
------------------------------------------------------------------
cp -a mfshdd.cfg.sample mfshdd.cfg
-------------------------------------------------------------------
vim mfshdd.cfg
/chunkdir #添加挂载点
-------------------------------------------------------------------
fdisk /dev/sdb
mkfs.xfs /dev/sdb1
mkdir /chunkdir
-------------------------------------------------------------------------
#第一种挂载方法
mount /dev/sdb1 /chunkdir #建议写入/etc/fstab
#第二种挂载方法
vim /etc/fstab
/dev/sdb1 /chunkdir xfs defaults 0 0
mount -a
-------------------------------------------------------------------------
chown -R mfs.mfs /chunkdir #注意在挂载完成后,修改目录归属
#添加一块磁盘并创建分区,然后挂载到指定的挂载点下(使用ext4文件系统格式化)
管理
systemctl enable --now moosefs-chunkserver
ps -ef | grep mfs
Client server
安装
yum -y install gcc zlib-devel fuse fuse-devel fuse-libs
useradd -r -s /sbin/nologin mfs
tar -xf moosefs-3.0.101-1.tar.gz
cd moosefs-3.0.101
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver --disable-mfsmetalogger
make && make install
配置
mkdir /data
mkdir /meta
ln -s /usr/local/mfs/sbin/* /usr/local/sbin
ln -s /usr/local/mfs/bin/* /usr/local/bin/
mfsmount /data -H 192.168.88.20 #挂载mfs数据盘
mfsmount -m /meta -H 192.168.88.20 #挂载mfs回收站
测试
cd /data/ #切换目录
#将内容写入文件
echo "hello world" >> hello.txt
echo "hello world" >> world.txt
echo "hello world" >> worl.txt
#使用tree命令查看Chunk server下的chunkdir路径
查看四台机器我们会发现存入的文件是会有偏移的
客户端删除文件后在我们的master server的meta下的trash目录下,里面有许多的十六进制目录
这样表示已经删除一个文件,undel可以还原到之前文件所在的路径
4.MFS高级特性
MFS设置goal冗余(副本)
文件副本——目的是做文件冗余,增强数据可靠性。比磁盘阵列安全性高的多。
目标(goal),是指文件被拷贝的份数,默认是两份。使用mfssetgoal进行拷贝份数设置,设定了拷贝的份数后是可以通过mfsgetgoal 命令来证实的,也可以通过mfsrsetgoal 来改变设定。
-r 可以实现对目录树结构的递归
mfssetgoal 文件名 #获取目标文件在 chunkserver 上的存放总数
mfsgetgoal 指定数量 文件名 #设置目标文件在 chunkserver 上的存放总数
mfssetgoal -r 指定文件数量 文件名 #修改目标文件的存放份数
mfsfileinfo 文件名
#获取目标文件具体存放信息(映射文件名称,id。存放在哪个chunkserver 上)
#注意:文件副本最大数量取决于 chunkserver 数量,超出的数量不会增加。
MFS回收站
一个删除文件能够存放在一个“ 垃圾箱”的时间就是一个隔离时间, 这个时间可以用mfsgettrashtime 命令来验证,也可以用mfssettrashtime 命令来设置。如:
mfsgettrashtime 文件名
#查看一个文件被删除后在回收站中的保留时间(默认是 86400,单位是秒,86400 表示一天)
问题 1:如何恢复被误删除的文件呢?
答:在回收站中有个 undel 目录
mv 文件名 undel #将在回收站中的文件移动到 undel 目录下,还原指定文件
注意:如果在源文件同一个路径下有个新的同名文件,那么恢复不会成功。
问题 2:如何修改文件被删除后在回收站中的保留时间
答:
mfssettrashtime 604800 文件名
#将指定文件被删除后在回收站中的保留时间修改为 604800 秒(一周的时间)
mfsgettrashtime 文件名 #查看修改效果
注:即使是回收站中保留时间期限已过,chunkserver 中也不一定会将数据删除,chunkserver 再写入
新数据时,会优先写入未使用过的连续的 chunk 块(前提是在同一个硬盘分区中)。只有当剩余空间不足时,
会将在客户端失去映射关系的旧文件数据(回收站中已经到期的文件数据)覆盖掉,用来存储新文件的数据。
MFS启动和关闭
启动MFS集群
最安全的启动MooseFS 集群(避免任何读或写的错误数据或类似的问题)的方式是按照以下命令步骤:
- 启动mfsmaster 进程
- 启动所有的mfschunkserver 进程
- 启动mfsmetalogger 进程(如果配置了mfsmetalogger)
- 当所有的chunkservers 连接到MooseFS master 后,任何数目的客户端可以利用mfsmount 去挂接被export 的文件系统。(可以通过检查master 的日志或是CGI 监视器来查看是否所有的chunkserver被连接)。
停止MFS集群
- 安全的停止MooseFS 集群:
- 在所有的客户端卸载MooseFS 文件系统(用umount 命令或者是其它等效的命令)
- 用mfsmaster stop 命令停止master 进程
- 用mfschunkserver stop 命令停止chunkserver 进程
- 用mfsmetalogger stop 命令停止metalogger 进程
MFS master 故障修复
一旦mfsmaster 崩溃(例如因为主机或电源失败),需要最后一个元数据日志changelog 并入主要的metadata 中。这个操作时通过mfsmetarestore 工具做的,最简单的方法是:
[root@localhost ~]# /usr/local/mfs/bin/mfsmetarestore -a
[root@localhost ~]# mfsmaster -a
#自动扫描对应目录下是否存在数据持久化文件,并进行数据恢复
如果master 数据被存储在MooseFS 编译指定地点外的路径,则要利用-d 参数指定使用,如:
[root@localhost ~]# /usr/local/mfs/bin/mfsmetarestore -a -d /opt/mfsmaster
MFS master 启动监控服务
[root@localhost ~]# /usr/local/mfs/sbin/mfscgiserv
#使用浏览器访问192.168.88.20:9425,注意master主机名
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
注意:
- 凡是用#注释掉的变量均使用其默认值
- 修改DATA_PATH指定的目录要权限为mfs,chown -R mfs:mfs /usr/local/mfs/var/mfs
- mfsexports 访问控制对于那些老用户是没用的
- 注意开通监听的端口