分布式文件系统简介
分布式文件系统(Distributed File Systemm)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。
简单来说,就是把一些分散的(分布在局域网内各个计算机上)共享文件夹,集合到一个文件夹内(虚拟共享文件夹)。
对于用户来说,要访问这些共享文件夹时,只要打开这个虚拟共享文件夹,就可以看到所有链接到虚拟共享文件夹内的共享文件夹,用户感觉不到这些共享文件是分散在各个计算机上的。
分布式文件系统的好处是集中访问、简化操作、数据容灾,以及提高文件的存取性能。
MFS简介
MooseFS是一个具有容错性的网络分布式文件系统。
它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。
MFS的组成
1.元数据服务器(Master在整个体系中负责管理文件系统,维护元数据。
2.元数据日志服务器(MetaLogger:备份Master服务器的变化日志文件,文件类型为changelog_ml.*.mfs
。当Master服务器数据丢失或者损坏时,可以从日志服务器中取得文件,进行修复。
3.数据存储服务器(Chunk Server:
真正存储数据的服务器。
存储文件时,会把文件分块保存,在数据服务器之间进行复制。
数据服务器越多,能使用的“容量”就越大,可靠性就越高,性能也就越好。
4.客户端(Client:可以像挂载NFS一样挂载MFS文件系统,其操作是相同的。
MFS的工作过程
MFS读取数据的处理过程
#客户端向元数据服务器发出读请求
#元数据服务器把(元数据)所需数据存放的位置
(Chunk Server的IP地址和Chunk编号)告知客户端
(一份大的数据会被分块,存储在不同的数据服务器上)
#客户端向已知的Chunk Server请求发送数据
#Chunk Server向客户端发送数据
MFS写入数据的处理过程
分为create创建的形式和update 修改文件的形式:
#客户端向元数据服务器发送写入请求
#元数据服务器与Chunk Server进行交互(只有当所需的分块Chunks存在的时候才进行交互),
但元数据服务器只在某些服务器创建新的分块Chunks,创建成功后由Chunk Server告知元数据服务器操作成功。
#元数据服务器告知客户端,可以在哪个Chunk Server的哪些Chunks写入数据
(副本数是由master来维护的)
#客户端向指定的Chunk Server写入数据
#该Chunk Server与按照要求和其他Chunk Server进行数据同步,同步成功后Chunk Server告知客户端数据写入成功
#客户端告知元数据服务器本次写入完毕
环境部署
参考官网:
https://moosefs.com/download/#current
实验环境:
172.25.2.7 ser7 master 结点
172.25.2.8 ser8 数据结点1 (Chunk结点)
172.25.2.9 ser9 数据结点2
172.25.2.250 真机 客户端
在ser7master结点上:
curl "http://ppa.moosefs.com/MooseFS-3-el7.repo" > /etc/yum.repos.d/MooseFS.repo
yum install moosefs-master moosefs-cgi moosefs-cgiserv moosefs-cli -y
[root@ser7 ~]# scp /etc/yum.repos.d/MooseFS.repo ser9:/etc/yum.repos.d/
root@ser9's password:
MooseFS.repo 100% 168 56.7KB/s 00:00 scp /etc/yum.repos.d/MooseFS.repo ser8:/etc/yum.repos.d/
root@ser8's password:
MooseFS.repo 100% 168 59.9KB/s 00:00
[root@ser7 ~]# scp /etc/yum.repos.d/MooseFS.repo ser9:/etc/yum.repos.d/
root@ser9's password:
MooseFS.repo 100% 168 56.7KB/s 00:00
进行配置
[root@ser7 ~]# cd /etc/mfs/
[root@ser7 mfs]# ls
mfsexports.cfg mfsmaster.cfg mfstopology.cfg
mfsexports.cfg.sample mfsmaster.cfg.sample mfstopology.cfg.sample
[root@ser7 mfs]# vim mfsmaster.cfg # 主配置文件不需要改动
所有结点做解析
[root@ser7 mfs]# vim /etc/hosts
172.25.2.7 ser7 mfsmaster
设置服务开机自启
[root@ser7 mfs]# systemctl enable --now
开启监控
[root@ser7 mfs]# systemctl enable --now moosefs-cgiserv.service
Created symlink from /etc/systemd/system/multi-user.target.wants/moosefs-cgiserv.service to /usr/lib/systemd/system/moosefs-cgiserv.service.
moosefs-master
查看端口
[root@ser7 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:9419 0.0.0.0:* LISTEN 18027/mfsmaster
tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 18027/mfsmaster
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 15561/grunt
tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 18027/mfsmaster
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 3695/X
tcp 0 0 0.0.0.0:9425 0.0.0.0:* LISTEN 18084/python2
9425端口是cgi
在浏览器中访问
此时还没有chunk server数据结点,所以server这里是空的
chunk数据结点:,er8和ser9的操作基本一致,这里以ser8为例:
[root@ser8 ~]# yum install moosefs-chunkserver -y
[root@ser8 mfs]# vim /etc/hosts
172.25.2.7 ser7 mfsmaster
[root@ser8 ~]# cd /etc/mfs/
[root@ser8 mfs]# vim mfshdd.cfg #指定存储路径
创建存储目录
[root@ser8 mfs]# mkdir /mnt/chunk1
[root@ser8 mfs]# chown mfs.mfs /mnt/chunk1/
[root@ser8 mfs]# id mfs
uid=987(mfs) gid=981(mfs) groups=981(mfs)
[root@ser8 mfs]# vim mfshdd.cfg
在文件的最后添加 /mnt/chunk1
后续扩展硬盘时,可以把硬盘挂载在 /mnt/chunk1目录
设置开机自启
[root@ser8 mfs]# systemctl enable --now moosefs-chunkserver
Created symlink from /etc/systemd/system/multi-user.target.wants/moosefs-chunkserver.service to /usr/lib/systemd/system/moosefs-chunkserver.service.
chunkserver监听9422端口,并且随机打开一个端口和master的9420端口连接
[root@ser8 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 17758/mfschunkserve
tcp 0 0 0.0.0.0:111 0.0.0.0:* LIS
tcp 0 0 172.25.2.8:22 172.25.2.250:51314 ESTABLISHED 13718/sshd: root@pt
tcp 0 0 172.25.2.8:53568 172.25.2.7:9420 ESTABLISHED 17758/mfschunkserve
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::6000 :::* LISTEN
在ser9上创建/mnt/chunk2作为数据共享目录,其他操作一样
客户端结点:
[root@foundation2 ~]# curl "http://ppa.moosefs.com/MooseFS-3-el7.repo" > /etc/yum.repos.d/MooseFS.repo
[root@foundation2 ~]# yum install moosefs-client -y
[root@foundation2 ~]# vim /etc/hosts
172.25.2.7 ser7 mfsmaster
测试使用
在客户端:
在客户端创建空目录:
[root@foundation2 ~]# mkdir /mnt/mfs
[root@foundation2 ~]# cd /mnt/mfs
[root@foundation2 mfs]# ls
挂载
[root@foundation2 mfs]# mfsmount /mnt/mfs/
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
客户端和master通信使用的是master的9421端口
[root@foundation2 mfs]# mount
mfsmaster:9421 on /mnt/mfs type fuse.mfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
master的9419是和元数据服务器通信的,
当master宕机,可以通过它的日志,
接管master的服务
第一次创建时失败;[root@foundation2 mfs]# mkdir data1
[root@foundation2 mfs]# mkdir data2
[root@foundation2 mfs]# mfsgetgoal data1
data1: realpath error on (/mnt/mfs/data1): ENOENT (No such file or directory)
[root@foundation2 mfs]#
[root@foundation2 ~]# cd /mnt/mfs/
[root@foundation2 mfs]# ls # 发现什么都没有
再创建一次就好了
[root@foundation2 mfs]# mkdir data1
[root@foundation2 mfs]# mkdir data2
[root@foundation2 mfs]# mfsgetgoal data1
data1: 2
[root@foundation2 mfs]# mfsgetgoal data2
data2: 2
[root@foundation2 mfs]#
设置data1只拷贝一份
[root@foundation2 mfs]# mfssetgoal -r 1 data1/
data1/:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
拷贝文件
[root@foundation2 mfs]# cd data1
[root@foundation2 data1]# cp /etc/passwd .
data2设置拷贝2份,并拷贝文件
[root@foundation2 mfs]# mfsgetgoal data2
data2: 2
[root@foundation2 mfs]# cd data2
[root@foundation2 data2]# cp /etc/fstab .
[root@foundation2 data2]#
查看各自的信息
[root@foundation2 mfs]# mfsfileinfo data1/passwd
data1/passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 172.25.2.9:9422 (status:VALID)
[root@foundation2 mfs]# mfsfileinfo data2/fstab
data2/fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.2.8:9422 (status:VALID)
copy 2: 172.25.2.9:9422 (status:VALID)
[root@foundation2 mfs]#
测试挂掉ser9
[root@ser9 ~]# systemctl stop moosefs-chunkserver
data1不能再访问,因为没有数据副本,访问时会卡住
[root@foundation2 mfs]# mfsfileinfo data1/passwd
data1/passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
no valid copies !!!
[root@foundation2 mfs]# cat data1/passwd
^C
[root@foundation2 mfs]#
不影响data2的访问,因为它还有一个副本
[root@foundation2 mfs]# mfsfileinfo data2/fstab
data2/fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.2.8:9422 (status:VALID)
[root@foundation2 mfs]#
[root@foundation2 mfs]# cat data2/fstab
#
# /etc/fstab
# Created by anaconda on Wed Sep 18 11:55:54 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=53330ac3-2cac-48c4-9c46-64024d00f9db / xfs defaults 1 1
UUID=8c24d78d-aee2-442f-8a00-096702190618 /boot xfs defaults 1 2
UUID=B4A6-8FCA /boot/efi vfat umask=0077,shortname=winnt 0 0
UUID=b44de218-851b-41d7-9180-1aabc6322866 swap swap defaults 0 0
测试大文件会在数据结点上分开存储
[root@foundation2 mfs]# cd data1
[root@foundation2 data1]# dd if=/dev/zero of=bigfile bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 2.42444 s, 43.3 MB/s
发现文件被分到两个结点存储
[root@foundation2 data1]# mfsfileinfo bigfile
bigfile:
chunk 0: 0000000000000005_00000001 / (id:5 ver:1)
copy 1: 172.25.2.9:9422 (status:VALID)
chunk 1: 0000000000000006_00000001 / (id:6 ver:1)
copy 1: 172.25.2.8:9422 (status:VALID)
在ser8和ser9下,文件是这样存储的
[root@ser8 mfs]# cd /mnt/chunk1/
[root@ser8 chunk1]# ls
00 10 20 30 40 50 60 70 80 90 A0 B0 C0 D0 E0 F0
01 11 21 31 41 51 61 71 81 91 A1 B1 C1 D1 E1 F1
02 12 22 32 42 52 62 72 82 92 A2 B2 C2 D2 E2 F2
03 13 23 33 43 53 63 73 83 93 A3 B3 C3 D3 E3 F3
04 14 24 34 44 54 64 74 84 94 A4 B4 C4 D4 E4 F4
05 15 25 35 45 55 65 75 85 95 A5 B5 C5 D5 E5 F5
06 16 26 36 46 56 66 76 86 96 A6 B6 C6 D6 E6 F6
07 17 27 37 47 57 67 77 87 97 A7 B7 C7 D7 E7 F7
08 18 28 38 48 58 68 78 88 98 A8 B8 C8 D8 E8 F8
09 19 29 39 49 59 69 79 89 99 A9 B9 C9 D9 E9 F9
0A 1A 2A 3A 4A 5A 6A 7A 8A 9A AA BA CA DA EA FA
0B 1B 2B 3B 4B 5B 6B 7B 8B 9B AB BB CB DB EB FB
0C 1C 2C 3C 4C 5C 6C 7C 8C 9C AC BC CC DC EC FC
0D 1D 2D 3D 4D 5D 6D 7D 8D 9D AD BD CD DD ED FD
0E 1E 2E 3E 4E 5E 6E 7E 8E 9E AE BE CE DE EE FE
0F 1F 2F 3F 4F 5F 6F 7F 8F 9F AF BF CF DF EF FF