分布式文件系统(Distributed File Systemm)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。简单来说,就是把一些分散的(分布在局域网内各个计算机上)共享文件夹,集合到一个文件夹内(虚拟共享文件夹)。对于用户来说,要访问这些共享文件夹时,只要打开这个虚拟共享文件夹,就可以看到所有链接到虚拟共享文件夹内的共享文件夹,用户感觉不到这些共享文件是分散在各个计算机上的。分布式文件系统的好处是集中访问、简化操作、数据容灾,以及提高文件的存取性能。
MFS是一个具有容错性的网络分布式文件系统,它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。
元数据服务器(Master)
:在整个体系中负责管理文件系统,维护元数据。
元数据日志服务器(MetaLogger)
:备份Master服务器的变化日志文件,文件类型为changelog_ml.*.mfs
。当Master服务器数据丢失或者损坏时,可以从日志服务器中取得文件,进行修复。
数据存储服务器(Chunk Server)
:真正存储数据的服务器。存储文件时,会把文件分块保存,在数据服务器之间进行复制。数据服务器越多,能使用的“容量”就越大,可靠性就越高,性能也就越好。
客户端(Client)
:可以像挂载NFS一样挂载MFS文件系统,其操作是相同的。
.swp
文件,.swp
文件块;.swp
文件块。部署可以参考官网: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源是相同的
可以通过以下命令获取:
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
安装:
[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
:
以下以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已经加入集群。
安装客户端:
[root@foundation1 ~]# yum install moosefs-client -y
新建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
[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
[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,这样就可以保证写入和读取的速度,这也就是分布式文件系统的意义。