一 、前言
(1)MFS原理
MFS是一个具有容错性的网络分布式文件系统,它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。
(2)分布式原理
分布式文件系统是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。简单来说,就是把一些分散的(分布在局域网内各个计算机上)共享文件夹,集合到一个文件夹内(虚拟共享文件夹)。对于用户来说,要访问这些共享文件夹时,只要打开这个虚拟共享文件夹,就可以看到所有链接到虚拟共享文件夹内的共享文件夹,用户感觉不到这些共享文件是分散在各个计算机上的。
分布式文件系统的好处是集中访问、简化操作、数据容灾,以及提高文件的存取性能。
二 、MFS介绍
(1)MFS文件系统的组成
元数据服务器(Master):在整个体系中负责管理文件系统,维护元数据。
元数据日志服务器(MetaLogger):备份Master服务器的变化日志文件,文件类型为changelog_ml.*.mfs。当Master服务器数据丢失或者损坏时,可以从日志服务器中取得文件,进行修复。
数据存储服务器(Chunk Server):真正存储数据的服务器。存储文件时,会把文件分块保存,在数据服务器之间进行复制。数据服务器越多,能使用的“容量”就越大,可靠性就越高,性能也就越好。
客户端(Client):可以像挂载NFS一样挂载MFS文件系统,其操作是相同的。
MFS工作示意图
(2)MFS读取数据的处理过程
客户端向元数据服务器发出读请求
元数据服务器把所需数据存放的位置(Chunk Server的IP地址和Chunk编号)告知客户端
客户端向已知的Chunk Server请求发送数据
Chunk Server向客户端发送数据
(3)MFS写入数据的处理过程
客户端向元数据服务器发送写入请求
元数据服务器与Chunk Server进行交互(只有当所需的分块Chunks存在的时候才进行交互),但元数据服务器只在某些服务器创建新的分块Chunks,创建成功后由元数据服务器告知客户端,可以在哪个Chunk Server的哪些Chunks写入数据。
客户端向指定的Chunk Server写入数据
该Chunk Server与其他Chunk Server进行数据同步,同步成功后Chunk Server告知客户端数据写入成功
客户端告知元数据服务器本次写入完毕
(4)MFS的删除文件过程
客户端有删除操作时,首先向Master发送删除信息;
Master定位到相应元数据信息进行删除,并将chunk server上块的删除操作加入队列异步清理;
响应客户端删除成功的信号
MFS修改文件内容的过程
客户端有修改文件内容时,首先向Master发送操作信息;
Master申请新的块给.swp文件,
客户端关闭文件后,会向Master发送关闭信息;
Master会检测内容是否有更新,若有,则申请新的块存放更改后的文件,删除原有块和.swp文件块;
若无,则直接删除.swp文件块。
(5)MFS重命名文件的过程
客户端重命名文件时,会向Master发送操作信息;
Master直接修改元数据信息中的文件名;返回重命名完成信息;
(6)MFS遍历文件的过程
遍历文件不需要访问chunk server,当有客户端遍历请求时,向Master发送操作信息;
Master返回相应元数据信息;
客户端接收到信息后显示
三 、MFS部署
(1)规划节点
主机 |
IP地址 |
作用 |
server1 |
192.168.32.133 |
master |
server2 |
192.168.32.152 |
chunk server |
server3 |
192.168.32.153 |
chunk server |
foundation1 |
192.168.32.154 |
master |
(2)Yum源配置
每个节点的Yum源都是相同的。
#curl "http://ppa.moosefs.com/MooseFS-3-el7.repo" > /etc/yum.repos.d/MooseFS.repo
下载完repo文件后,将repo文件内的gpgcheck关闭。
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# ls
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo
CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo 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
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
enabled=1
将每个节点的selinux和防火墙都关闭。
(3)master配置
在所有节点进行master的解析
[root@server1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.32.133 server1 mfsmaster
安装moosefs。(主配置文件在/etc/mfs/mfsmaster.cfg)
[root@server1 ~]#yum install moosefs-master moosefs-cgi moosefs-cgiserv moosefs-cli -y
启动服务和cgi-server
[root@server1 ~]#systemctl enable --now moosefs-master
[root@server1 ~]#systemctl enable --now moosefs-cgiserv.service
启动成功后查看端口
[root@server1 ~]#netstat -antpl
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 1792/mfsmaster
tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 1792/mfsmaster
tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 1792/mfsmaster
tcp 0 0 0.0.0.0:9425 0.0.0.0:* LISTEN 1815/python2
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1110/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1391/master
tcp 0 36 192.168.32.133:22 192.168.32.1:29751 ESTABLISHED 1579/sshd: root@pts
tcp 0 0 192.168.32.133:9421 192.168.32.154:58412 ESTABLISHED 1792/mfsmaster
tcp 0 0 192.168.32.133:9420 192.168.32.152:49116 ESTABLISHED 1792/mfsmaster
tcp 0 0 192.168.32.133:9420 192.168.32.153:59464 ESTABLISHED 1792/mfsmaster
tcp6 0 0 :::22 :::* LISTEN 1110/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1391/master
现在我们可以看到开启服务后打开了9419,9420,9421,9425这几个端口。其中9421端口为监听客户端连接的端口,9419端口为用于监听metalogger(冷备)、masters和supervisors连接的端口,9420端口为chunkserver连接的侦听端口,9425端口为cgi-server的端口,可以在浏览器上访问192.168.32.133:9425
四 、chunk server配置
(1)server2配置
安装moosefs-chunkserver
[root@server2 mfs]# yum install moosefs-chunkserver -y
创建存储路径。
[root@server2 mfs]# mkdir /mnt/chunk1
[root@server2 mfs]# chown mfs.mfs /mnt/chunk1/ //设置权限
制定存储路径。
[root@server2 mfs]# vi /etc/mfs/mfshdd.cfg
[root@server2 mfs]# tail -1 mfshdd.cfg
/mnt/chunk1
启动moosefs-chunkserver服务。
[root@server2 mfs]# systemctl enable --now moosefs-chunkserver
[root@server2 mfs]# netstat -antpl //查看启动的端口
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 1880/mfschunkserver
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1111/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1409/master
tcp 0 0 192.168.32.152:9422 192.168.32.154:33868 ESTABLISHED 1880/mfschunkserver
tcp 0 196 192.168.32.152:22 192.168.32.1:29790 ESTABLISHED 1603/sshd: root@pts
tcp 0 0 192.168.32.152:49116 192.168.32.133:9420 ESTABLISHED 1880/mfschunkserver
tcp6 0 0 :::22 :::* LISTEN 1111/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1409/master
(2)server3配置
安装moosefs-chunkserver。
[root@server3 mfs]# yum install moosefs-chunkserver -y
创建存储路径。
[root@server3 mfs]# mkdir /mnt/chunk2
[root@server3 mfs]# chown mfs.mfs /mnt/chunk2/ //设置权限
制定存储路径。
[root@server3 mfs]# vi /etc/mfs/mfshdd.cfg
[root@server3 mfs]# tail -1 mfshdd.cfg
/mnt/chunk1
启动moosefs-chunkserver服务。
[root@server3 mfs]# systemctl enable --now moosefs-chunkserver
[root@server3 mfs]# netstat -antpl //查看启动的端口
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 11669/mfschunkserve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1111/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1390/master
tcp 0 0 192.168.32.153:46720 192.168.100.50:80 TIME_WAIT -
tcp 0 0 192.168.32.153:44106 39.155.141.16:80 TIME_WAIT -
tcp 0 0 192.168.32.153:59464 192.168.32.133:9420 ESTABLISHED 11669/mfschunkserve
tcp 0 0 192.168.32.153:45396 46.17.113.51:80 TIME_WAIT -
tcp 0 0 192.168.32.153:57304 211.68.71.120:80 TIME_WAIT -
tcp 0 36 192.168.32.153:22 192.168.32.1:29842 ESTABLISHED 1604/sshd: root@pts
tcp 0 0 192.168.32.153:9422 192.168.32.154:43252 ESTABLISHED 11669/mfschunkserve
tcp6 0 0 :::22 :::* LISTEN 1111/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1390/master
可以看出开启了一个9422端口,并且打开了一个随即端口45240和master的9420端口进行通信。
启动后查看网页端,可以发现server2、server3已经加入集群了。
五 、初步使用Mfs
(1)client客户端配置
安装moosefs-client。
[root@foundation1 ~]# yum install moosefs-client -y
[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)
[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份。
[root@foundation1 mfs]# mfssetgoal -r 1 data1/ \\将备份数改为了1份。
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中。
[root@server3 ~]# systemctl stop moosefs-chunkserver
[root@foundation1 mfs]# cat data2/fstab
# /etc/fstab
# Created by anaconda on Thu May 2 18:01:16 2019
[root@foundation1 mfs]# mfsfileinfo data1/passwd
data1/passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
no valid copies !!!
所以当我们将server3的mfs服务关闭后,查看data2的文件会正常访问,当查看data1时访问文件会卡住。
现在恢复server3。
恢复后查看data1中的文件就可以正常查看
[root@server3 ~]# systemctl stop moosefs-chunkserver
[root@foundation1 mfs]# cat data2/fstab
# /etc/fstab
# Created by anaconda on Thu May 2 18:01:16 2019
[root@foundation1 mfs]# mfsfileinfo data1/passwd
data1/passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
no valid copies !!!
接下来进行切分的,默认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,这样就可以保证写入和读取的速度,这也就是分布式文件系统的意义。