mfs详解与部署
一、MFS详解
分布式原理:
分布式文件系统(Distributed File Systemm)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。简单来说,就是把一些分散的(分布在局域网内各个计算机上)共享文件夹,集合到一个文件夹内(虚拟共享文件夹)。对于用户来说,要访问这些共享文件夹时,只要打开这个虚拟共享文件夹,就可以看到所有链接到虚拟共享文件夹内的共享文件夹,用户感觉不到这些共享文件是分散在各个计算机上的。分布式文件系统的好处是集中访问、简化操作、数据容灾,以及提高文件的存取性能。
MFS原理:
MFS是一个具有容错性的网络分布式文件系统,它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。
MFS文件系统的组成
-
元数据服务器(Master)
:在整个体系中负责管理文件系统,维护元数据。 -
元数据日志服务器(MetaLogger)
:备份Master服务器的变化日志文件,文件类型为changelog_ml.*.mfs
。当Master服务器数据丢失或者损坏时,可以从日志服务器中取得文件,进行修复。 -
数据存储服务器(Chunk Server)
:真正存储数据的服务器。存储文件时,会把文件分块保存,在数据服务器之间进行复制。数据服务器越多,能使用的“容量”就越大,可靠性就越高,性能也就越好。 -
客户端(Client)
:可以像挂载NFS一样挂载MFS文件系统,其操作是相同的。
MFS读取数据的处理过程:
- 客户端向元数据服务器发出读请求
- 元数据服务器把所需数据存放的位置(Chunk Server的IP地址和Chunk编号)告知客户端
- 客户端向已知的Chunk Server请求发送数据
- Chunk Server向客户端发送数据
MFS写入数据的处理过程:
- 客户端向元数据服务器发送写入请求
- 元数据服务器与Chunk Server进行交互(只有当所需的分块Chunks存在的时候才进行交互),但元数据服务器只在某些服务器创建新的分块Chunks,创建成功后由元数据服务器告知客户端,可以在哪个Chunk Server的哪些Chunks写入数据。
- 客户端向指定的Chunk Server写入数据
- 该Chunk Server与其他Chunk Server进行数据同步,同步成功后Chunk Server告知客户端数据写入成功
- 客户端告知元数据服务器本次写入完毕
MFS的删除文件过程
- 客户端有删除操作时,首先向Master发送删除信息;
- Master定位到相应元数据信息进行删除,并将chunk server上块的删除操作加入队列异步清理;
- 响应客户端删除成功的信号
MFS修改文件内容的过程
- 客户端有修改文件内容时,首先向Master发送操作信息;
- Master申请新的块给
.swp
文件, - 客户端关闭文件后,会向Master发送关闭信息;
- Master会检测内容是否有更新,若有,则申请新的块存放更改后的文件,删除原有块和
.swp
文件块; - 若无,则直接删除
.swp
文件块。
MFS重命名文件的过程
- 客户端重命名文件时,会向Master发送操作信息;
- Master直接修改元数据信息中的文件名;返回重命名完成信息;
MFS遍历文件的过程
- 遍历文件不需要访问chunk server,当有客户端遍历请求时,向Master发送操作信息;
- Master返回相应元数据信息;
- 客户端接收到信息后显示
二、MFS的部署
部署可以参考官网:https://moosefs.com/download/#current
主机准备
主机 | ip | 作用 |
---|---|---|
server1 | 172.25.1.1 | master |
server2 | 172.25.1.2 | chunk server |
server3 | 172.25.1.3 | chunk server |
foundation1 | 172.25.1.250 | master |
主机版本:rhel7.6
所有主机的selinux和防火墙均属于关闭状态。
yum源
对所有节点,yum源是相同的
可以通过以下命令获取:
curl "http://ppa.moosefs.com/MooseFS-3-el7.repo" > /etc/yum.repos.d/MooseFS.repo
如果时el6或者el8直接将el7更改即可。
下载完repo文件后将gpgcheck关闭
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# ls
MooseFS.repo redhat.repo rhel.repo
[root@server1 yum.repos.d]# vim MooseFS.repo
[root@server1 yum.repos.d]# cat MooseFS.repo
[MooseFS]
name=MooseFS $releasever - $basearch
baseurl=http://ppa.moosefs.com/moosefs-3/yum/el7
gpgcheck=0 #改为0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
enabled=1
同时在所有节点
作master的解析:
# vim /etc/hosts
# cat /etc/hosts
172.25.1.1 server1 mfsmaster
master配置
安装:
[root@server1 ~]# yum install moosefs-master moosefs-cgi moosefs-cgiserv moosefs-cli -y
其主配置文件是/etc/mfs/mfsmaster.cfg
启动服务和cgi-server:
[root@server1 ~]# systemctl enable --now moosefs-master
[root@server1 ~]# systemctl enable --now moosefs-cgiserv.service
启动后查看端口:
[root@server1 ~]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:9419 0.0.0.0:* LISTEN 3821/mfsmaster
tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 3821/mfsmaster
tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 3821/mfsmaster
tcp 0 0 0.0.0.0:9425 0.0.0.0:* LISTEN 3852/python2
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3097/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3300/master
tcp 0 0 172.25.1.1:22 172.25.1.250:53068 ESTABLISHED 3315/sshd: root@pts
tcp6 0 0 :::22 :::* LISTEN 3097/sshd
tcp6 0 0 ::1:25 :::* LISTEN 3300/master
可以看到开启服务后打开了9419,9420,9421,9425几个端口,其中,9421
为监听客户端连接的端口,9419
为用于监听metalogger(冷备)、masters和supervisors连接的端口,9420
为chunkserver连接的侦听端口,9425为cgi-server的端口,可以在浏览器访问172.25.1.1:9425
:
可以看出的当前就只有一个master。
chunk server配置
以下以server2为例,server3的操作和server2类似,首先安装:
[root@server2 ~]# yum install moosefs-chunkserver -y
在chunk server中,/etc/mfs/mfshdd.cfg
用来指定其存储路径
创建存储路径:
[root@server2 mfs]# mkdir /mnt/chunk1
[root@server2 mfs]# chown mfs.mfs /mnt/chunk1/ #更改所有者和所有组
制定存储路径:
[root@server2 mfs]# vim mfshdd.cfg
[root@server2 mfs]# tail -1 mfshdd.cfg
/mnt/chunk1
配置后启动服务:
[root@server2 mfs]# systemctl enable --now moosefs-chunkserver
服务启动后查看开启的端口:
[root@server2 mfs]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:9422 0.0.0.0:* LISTEN 3874/mfschunkserver
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3087/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3309/master
tcp 0 0 172.25.1.2:45240 172.25.1.1:9420 ESTABLISHED 3874/mfschunkserver
tcp 0 0 172.25.1.2:22 172.25.1.250:49848 ESTABLISHED 3632/sshd: root@pts
tcp6 0 0 :::22 :::* LISTEN 3087/sshd
tcp6 0 0 ::1:25 :::* LISTEN 3309/master
可以看出开启了一个9422端口,并且打开了一个随即端口45240和master的9420端口进行通信。启动后查看网页端:
可以看到server2已经加入了集群。
在server3中将chunk1改为chunk2即可。启动后查看网页端:
可以看出看出两个chunk server已经加入集群。
client客户端配置
安装客户端:
[root@foundation1 ~]# yum install moosefs-client -y
三、初步使用mfs
新建mfs目录:
[root@foundation1 ~]# cd /mnt/
[root@foundation1 mnt]# mkdir mfs
挂载该目录:
[root@foundation1 mfs]# mfsmount /mnt/mfs/
查看挂载情况:
[root@foundation1 mfs]# mount
mfsmaster:9421 on /mnt/mfs type fuse.mfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
可以看到挂载的是mfsmaster(server1)的9421端口。
创建测试文件目录:
[root@foundation1 mfs]# mkdir data1
[root@foundation1 mfs]# mkdir data2
[root@foundation1 mfs]# mfsgetgoal data1/ #若报错可以退出这个目录重新进,然后再新建
data1/: 2
[root@foundation1 mfs]# mfsgetgoal data2/
data2/: 2
以上结果表示两个目录都保存了2份。
可以使用以下命令将备份数改为1份:
[root@foundation1 mfs]# mfssetgoal -r 1 data1/
data1/:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
[root@foundation1 mfs]#
[root@foundation1 mfs]# mfsgetgoal data1/
data1/: 1
[root@foundation1 mfs]# mfsgetgoal data2/
data2/: 2
可以看到data1已经保存为1份.拷贝测试文件:
[root@foundation1 mfs]# cp /etc/passwd data1/
[root@foundation1 mfs]# cp /etc/fstab data2/
查看拷贝文件的信息:
[root@foundation1 mfs]# mfsfileinfo data1/passwd
data1/passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 172.25.1.3:9422 (status:VALID)
[root@foundation1 mfs]#
[root@foundation1 mfs]# mfsfileinfo data2/fstab
data2/fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.1.2:9422 (status:VALID)
copy 2: 172.25.1.3:9422 (status:VALID)
可以看到再data1中的文件只有一个备份保存在server3,而在data2中的文件有两个备份,保存在server2和server3各一份。
当我们把server3的mfs服务关闭后:
[root@server3 ~]# systemctl stop moosefs-chunkserver
查看data2中的文件:
[root@foundation1 mfs]# cat data2/fstab
#
# /etc/fstab
# Created by anaconda on Thu May 2 18:01:16 2019
#
。。。。。。
可以正常查看,查看data1中的文件:
[root@foundation1 mfs]# mfsfileinfo data1/passwd
data1/passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
no valid copies !!!
可以看出没有可用拷贝,访问文件会卡住。
现在恢复server3:
[root@server3 ~]# systemctl start moosefs-chunkserver
恢复后查看data1中的文件就可以正常查看:
[root@foundation1 mfs]# cat data1/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
......
接下来进行切分的实验,默认chunk的大小为64M,当文件大于64M时会进行切分:
在data1中新建一个100M的文件:
[root@foundation1 data1]# dd if=/dev/zero of=bigfile bs=1M count=100
查看这个文件的信息:
[root@foundation1 data1]# mfsfileinfo bigfile
bigfile:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 172.25.1.3:9422 (status:VALID)
chunk 1: 0000000000000004_00000001 / (id:4 ver:1)
copy 1: 172.25.1.2:9422 (status:VALID)
可以看出被切分成两个chunk,这样就可以保证写入和读取的速度,这也就是分布式文件系统的意义。