基础知识
-
什么是MFS文件系统:
-
MooseFS是一个具有容错性的网络分布式文件系统。它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。
-
MooseFS文件系统结构包括一下四种角色:
-
管理服务器master
-
管理服务器:负责各个数据存储服务的管理文件读写调度,文件空间回收以及恢复,多节点拷贝
-
元数据日志服务器:
-
负责备份master服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在master server出现问题的时候解体器 进行工作
-
数据存储服务器data server(chunk servers)
-
真正存储用户数据的服务器存储文件时,首先把文件分成块,然后这些块在数据服务器chunkserver之间赋值(复制份数可以手工指定,建议设置副本数为数据服务器可以为多个,并且数据越多,可使用的“磁盘空间越大,”可靠性也越高客户端挂载使用client computers使用MFS文件系统来存储和访问的主机名称为MFS的客户端,成功挂载MFS系统以后,就可以像以前NFS一样共享这个虚拟性的存储了。
-
特性
-
通用文件系统,不需要修改上层应用就可以使用
-
可以在线扩容,体系架构可伸缩性极强。
-
部署简单。
-
高可用,可设置任意的文件冗余程度
-
可回收在指定时间内删除的文件
-
提供netapp,emc,ibm等商业存储的snapshot特性
-
google filesystem的一个c实现。
-
提供web gui监控接口。
-
提高随机读或写的效率
-
提高海量小文件的读写效率
-
MFS的读数据过程:
client当需要一个数据时,首先向master server发起查询请求;
管理服务器检索自己的数据,获取到数据所在的可用数据服务器位置ip|port|chunkid;
管理服务器将数据服务器的地址发送给客户端;
客户端向具体的数据服务器发起数据获取请求;
数据服务器将数据发送给客户端; -
MFS的写数据过程:
当客户端有数据写需求时,首先向管理服务器提供文件元数据信息请求存储地址(元数据信息如:文件名|大小|份数等);
管理服务器根据写文件的元数据信息,到数据服务器创建新的数据块;
数据服务器返回创建成功的消息;
管理服务器将数据服务器的地址返回给客户端(chunkIP|port|chunkid);
客户端向数据服务器写数据;
数据服务器返回给客户端写成功的消息;
客户端将此次写完成结束信号和一些信息发送到管理服务器来更新文件的长度和最后修改时间
MFS的删除文件过程:
客户端有删除操作时,首先向Master发送删除信息;
Master定位到相应元数据信息进行删除,并将chunk server上块的删除操作加入队列异步清理;
响应客户端删除成功的信号
MFS修改文件内容的过程:
客户端有修改文件内容时,首先向Master发送操作信息;
Master申请新的块给.swp文件,
客户端关闭文件后,会向Master发送关闭信息;
Master会检测内容是否有更新,若有,则申请新的块存放更改后的文件,删除原有块和.swp文件块;
若无,则直接删除.swp文件块。
MFS重命名文件的过程:
客户端重命名文件时,会向Master发送操作信息;
Master直接修改元数据信息中的文件名;返回重命名完成信息;
1、分布式文件系统mfs平台的搭建
- 实验环境
- rhel 7.3
主机 | ip |
---|---|
server1(master) | 172.25.60.1 |
server2(chunk-server) | 172.25.60.2 |
server3(chunk-server) | 172.25.60.3 |
founction60(client) | 172.25.60.250 |
- master(servre1)
- 安装mfs文件系统的master端:
yum install -y moosefs-master-3.0.103-1.rhsystemd.x86_64.rpm moosefs-cli-3.0.103-1.rhsystemd.x86_64.rpm moosefs-cgiserv-3.0.103-1.rhsystemd.x86_64.rpm moosefs-cgi-3.0.103-1.rhsystemd.x86_64.rpm
- 观察到配置文件写的都是mfsmaster,所以要在每一个节点加上解析,告诉其他节点server1是mfsmaster
写入解析文件:vim /etc/hosts
172.25.60.1 mfsmaster
- 开启服务:
systemctl start moosefs-master
systemctl start moosefs-cgiserv
- 查看端口是否开启:
netstat -antlp
四个端口:
- 此时在web端可以产看到:
172.25.60.1:9425
- chunkserver1(server2)端:
- 先添加上本地解析:
vim /etc/hosts
172.25.15.1 mfsmaster
- 给server2加一个虚拟硬盘 virto
- 安装chunkserver:
yum install -y moosefs-chunkserver-3.0.103-1.rhsystemd.x86_64.rpm
- 查看新加入的虚拟磁盘:
fdisk -l
- 分区:
fdisk /dev/vda
-->n -->p–>enter–>enter–>p–>w
- 格式化:
mkfs.xfs /dev/vda1
- 在/mnt 下新建目录:
mkdir chunk1
- 挂载:
mount /dev/vda1 /mnt/chunk1
- 给chunk1下写入文件,以做测试 :
cd /mnt/chunk1/
cp /etc/* .
- 查看是否挂载成功:
df
- 将挂载信息放在配置文件中:
vim /etc/mfs/mfshdd.cfg
/mnt/chunk1
- 查看服务用户没有执行权限,如果没有就加执行权限
ll -d /mnt/chunk1
chown mfs.mfs /mnt/chunk1
- 开启:
systemctl start moosefs-chunkserver
- server3和server2操作一致
- client端(真机)
- 安装client:
rpm -ivh moosefs-client-3.0.103-1.rhsystemd.x86_64.rpm
- 在/mnt下创建目录:
mkdir mfs
- 将挂载信息写入配置文件:
vim /etc/mfs/mfsmount.cfg
/mnt/mfs
- 将解析写入:
vim /etc/hosts
- 挂载
mfsmount
- 此时在浏览器上可以看到添加的信息
2、分布式文件存储
- 在client端的/mnt/mfs/下创建目录
mkdir dir1
mkdir dir2
- 查看(mfsgetgoal 获取查看mfssetgoal 设置)
mfsgetgoal dir1/
mfsgetgoal dir2
- 将dir1设置成1:
mfssetgoal -r 1 dir1/
- 给dir1写入文件
cd dir1
cp /etc/passwd .
mfsfileinfo passwd ###查看,dir1下写入的是一份
dd if=/dev/zero of=bigfile1 bs=1M count=200
mfsfileinfo bigfile1
- 给dir2写入文件
cd ../dir2
cp /etc/fstab .
mfsfileinfo fstab
dd if=/dev/zero of=bigfile2 bs=1M count=200
mfsfileinfo bigfile2 ##查看,这时dir2写入的是两份,有备份
- 这时在server2或者3端,将服务关闭:
systemctl stop moosefs-chunkserver
- 这时在client端查看后dir1下文件没有,dir2上文件只剩1份:
mfsfileinfo bigfile1
mfsfileinfo bigfile2
- 将服务端重新打开后,文件就会恢复:
systemctl start moosefs-chunkserver
- 将dir1下的元数据文件passwd删除后恢复(这时要确保所有服务都开启)
- 先将dir1下的passwd删除:
rm -rf passwd
- 查看文件可以恢复的时间:
mfsgettrashtime .
- 在/mnt下创建目录,用于恢复文件
mkdir mfsmeta
- 挂载:
mfsmount -m /mnt/mfsmeta/
- 进入到垃圾箱中查找文件:
cd /mnt/mfsmeta/trash/
- 查找passwd文件
find -name *passwd
- 进入到查找到的目录下
cd 004
- 将该文件移动到undel下
mv 00000004\|dir1\|passwd undel/
- 这时查看文件恢复
cd /mnt/mfs/dir1
cat passwd
如果是正常关闭master,则在server1上的/var/lib/mfs 会看到metadata.mfs文件;如果不是正常关闭,则会是metadata.mfs.back文件。如果不是正常关闭的条件下重新开启,则要moosefs-master -a可以成功打开,修改配置文件后 vim /usr/lib/systemd/system/moosefs-master.service
将start 改为 -a即可