MooseFS 是一种分布式文件系统,它把数据分散存放在多个物理服务器上,前面只放置一台负责”调度"元数据服务器,最终呈现给用户的则是一个统一的资源。相对于集中式文件系统来说,分布式系统拥有更好的扩展性、稳定性、数据的安全性。
MFS 分布式工作原理
(1) 分布式
mfs 的分布式文件系统就是把一些分散在多台计算机上的共享文件夹,集合到一个共享文件夹内;用户要访问这些文件夹的时候,只要打开一个文件夹,就可以的看到所有链接到此文件夹内的共享文件夹。
(2) MFS原理
MFS是一个具有容错性的网络分布式文件系统,它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。
MFS的组成
(1) 元数据服务器(Master):在整个体系中负责管理文件系统,维护元数据,目前不支持高可用。
(2) 元数据日志服务器(MetaLogger):备份Master服务器的变化日志文件,当master服务器损坏,可以从日志服务器中取得文件恢复。
(3) 数据存储服务器(Chunk Server):真正存储数据的服务器,服务器越多,容量就越大,可靠性越高,性能越好。
(4) 客户端(Client): 可以像挂载NFS一样 挂载MFS文件系统。
MFS读数据的处理过程
客户端向元数据服务器发出请求,元数据服务器把所需数据存放的位置(Chunk Server的IP地址和Chunk编号)告知客户端;客户端向已知的Chunk Server请求发送数据,Chunk Server向客户端发送数据。
写入的过程
客户端向元数据服务器发送写入请求,元数据服务器与Chunk Server进行交互,但元数据服务器只在某些服务器创建新的分块Chunks,创建成功后由chunk Servers告知元数据服务器操作成功;元数据服务器告知客户端,可以在哪个Chunk Server的哪些Chunks写入数据;客户端向指定的Chunk Server写入数据,该Chunk Server与其他Chunk Server进行数据同步,同步成功后Chunk Server告知客户端数据写入成功;客户端告知元数据服务器本次写入完毕 。
实验环境介绍:4 台主机
IP | 主机名 | |
---|---|---|
client | 172.25.254.250 | foundation39 |
master | 172.25.25.5 | server5 |
chunk1 | 172.25.25.6 | server6 |
chunk2 | 172.25.25.7 | server7 |
[root@server1 3.0.115]# yum install moosefs-cgi-3.0.115-1.rhsystemd.x86_64.rpm \
moosefs-cli-3.0.115-1.rhsystemd.x86_64.rpm \
moosefs-cgiserv-3.0.115-1.rhsystemd.x86_64.rpm \
moosefs-master-3.0.115-1.rhsystemd.x86_64.rpm -y 安装所需要的包
[root@server1 ~]# cd /etc/mfs/ ##配置目录
[root@server1 mfs]# ls
mfsexports.cfg mfsmaster.cfg mfstopology.cfg
mfsexports.cfg.sample mfsmaster.cfg.sample ##模板 mfstopology.cfg.sample
[root@server1 mfs]# systemctl start moosefs-master.service ##开启服务
[root@server1 mfs]# systemctl start moosefs-cgiserv.service
[root@server1 mfs]# netstat -antlp ##端口查看
如图所示,当在 master 安装完成之后,如果只开启 moosefs-master.service
服务时,会开启三个端口号;
如图所示,当再开启 moosefs-cgiserv.service
服务时,会再开启一个端口号;其中 9425 是用来管理 mfs 的端口;
此时在访问网页 172.25.25.5:9425
时,虽然可以访问到 mfs 的信息,但是速度非常慢,而且部分数据不会显示;
需要在编辑本地解析文件,写入解析:
[root@server5 mfs]# vim /etc/hosts
[root@server5 mfs]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.25.250 foundation39.ilt.example.com
172.25.25.1 server1
172.25.25.2 server2
172.25.25.3 server3
172.25.25.4 server4
172.25.25.5 server5 mfsmaster ##master 的解析
172.25.25.6 server6
172.25.25.7 server7
172.25.25.8 server8
[root@server5 mfs]#
写入解析之后,此时 master 段基本信息已经配置完成;在网页便可以访问。
显示的信息中:disk为后端 chunkserver 的磁盘,exports 为输出;mount 为后端的挂载。
(1)在 chunkserver 端需要安装对应的 chunk 软件包;
[root@server6 3.0.115]# yum install moosefs-chunkserver-3.0.115-1.rhsystemd.x86_64.rpm -y ##安装 chunk 端软件
[root@server6 3.0.115]# vim /etc/hosts ##mfsmaster写入本地解析
(2)生产环境下,一般会数据会放在独立的硬盘上;添加一块新的硬盘,将其作为 chunkserver 的存储硬盘;相当于做了垂直扩容。
在此添加一块大小为 10G 的硬盘来观察效果;
(服务器支持热插拔,服务器用的是sas硬盘,和普通的sata硬盘不太一样)
(3)在添加完硬盘之后需要创建分区,格式化,然后再挂载;
[root@server6 mfs]# fdisk -l ##查看新添加的硬盘名
[root@server6 mfs]# fdisk /dev/vdb ##创建分区,将内存全部给新建的分区,保存退出。
[root@server6 3.0.115]# mkfs.xfs /dev/vdb1 ##格式化设备
[root@server6 3.0.115]# mkdir /mnt/chunk1 ##新建一个数据目录
[root@server6 3.0.115]# vim /etc/fstab ##设定开机自动挂载,用 id 来挂载,防止设备名会更改
UUID="6d5e40af-85bd-4fd6-b7d2-282614bad331" /mnt/chunk1 xfs defaults 0 0
[root@server6 3.0.115]# mount -a ##刷新一下挂载,会重新识别 /etc/fstab 文件内容
查看新添加的硬盘名:
(4)修改数据目录的权限,并将数据目录写入配置文件中,
注: 先挂载设备,再修改权限;否则启动会报错。
[root@server6 3.0.115]# chown mfs.mfs /mnt/chunk1/ ##修改权限
[root@server6 3.0.115]# cd /etc/mfs/
[root@server6 mfs]# ls
mfschunkserver.cfg mfschunkserver.cfg.sample mfshdd.cfg mfshdd.cfg.sample
[root@server6 mfs]# vim mfshdd.cfg ##修改配置文件
[root@server6 mfs]# tail -n 3 mfshdd.cfg
#~/mnt/hd7
/mnt/chunk1 ##加入这行新建的目录
[root@server6 mfs]# systemctl start moosefs-chunkserver.service ##开启服务
在服务开启之后,此时可以看到 chunserver 端开启服务的端口号是 9422 ;
而此时在 master 端,会显示已经和 chunkserver 建立了连接;
此时在访问 master 时,会看到服务信息,如图中的新加的硬盘。
对于 chunkserver2,相当于是水平扩容;创建办法如同以上chunkserver 的配置;下载软件包;写入本地解析文件;创建目录;加一块硬盘,创建分区,格式化,挂载;修改权限,修改配置文件,开启服务即可。
在完成之后,在访问 master 时会有如图所示的信息。
(1)下载软件包
安装客户端软件包
[root@foundation39 3.0.115]# yum install moosefs-client-3.0.115-1.rhsystemd.x86_64.rpm -y
(2)写入本地解析文件
[root@foundation39 3.0.115]# cd /etc/mfs/
[root@foundation39 mfs]# ls
mfsmount.cfg mfsmount.cfg.sample
[root@foundation39 mfs]# vim /etc/host
host.conf hostname hosts hosts.allow hosts.deny
[root@foundation39 mfs]# vim /etc/hosts ##编辑本地解析文件,写入解析
[root@foundation39 mfs]# mkdir /mnt/mfs
[root@foundation39 mfs]# ls
mfsmount.cfg mfsmount.cfg.sample
[root@foundation39 mfs]# vim mfsmount.cfg
[root@foundation39 mfs]# tail -n 3 mfsmount.cfg
#
/mnt/mfs ##该目录为配置文件中本来就有的,将其注释打开,新建出该目录即可
(4)挂载
[root@foundation39 mfs]# cd /mnt/mfs/
[root@foundation39 mfs]# ls ##确保这个里面没有文件才可以挂载
[root@foundation15 mfs]# cd
[root@foundation15 ~]# mfsmount
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
挂载成功之后,可以看到端口信息, 9421 是连接的 master 端。
挂载信息:
[root@foundation39 ~]# cd /mnt/mfs/
[root@foundation39 mfs]# mkdir dir1
[root@foundation39 mfs]# mkdir dir2
(2)目录中默认是保存两份,可以人为的设定:
使用 mfsgetgoal 命令查看该目录副本数量,目标(goal)是指文件被复制的份数;因为当前只有2个chunkserver (后端存储)
可诶用 mfssetgoal 设定的副本数量为;
[root@foundation39 mfs]# mfsgetgoal dir1
dir1: 2
[root@foundation39 mfs]# mfsgetgoal dir2
dir2: 2
[root@foundation39 mfs]# mfssetgoal -r 1 dir1 ##设定 dir1 为默认存一份
dir1:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
[root@foundation39 mfs]# mfsgetgoal dir1
dir1: 1
[root@foundation39 mfs]# mfsgetgoal dir2
dir2: 2
此时 dir1 修改为存1份,dir2 还是默认的两份,存入数据,观察效果:
[root@foundation39 mfs]# cp /etc/passwd dir1/
[root@foundation39 mfs]# cp /etc/fstab dir2/
[root@foundation39 mfs]# cd dir1/
[root@foundation39 dir1]# mfsfileinfo passwd ## 1中只存入一份,在7号机子
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 172.25.25.7:9422 (status:VALID)
[root@foundation39 dir1]# cd ..
[root@foundation39 mfs]# cd dir2/
[root@foundation39 dir2]# mfsfileinfo fstab ## 2中存入了两份,一份在 6号机子一份在 7号机子
fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.25.6:9422 (status:VALID)
copy 2: 172.25.25.7:9422 (status:VALID)
客户端从 master 查询 chunksever(文件)存储在哪个数据块服务器上,mfsfileinfo 的信息是 master 返回给客户端的;客户端可以直接从相应的 chunkserver上取数据。
由于 dir1 的数据只存入了一份在 7号主机中,如果此时因为一些原因, 7号主机宕机之后,此时数据的查看效果如下所示;
[root@server7 ~]# systemctl stop moosefs-chunkserver
[root@foundation39 dir2]# mfsfileinfo fstab ##储存了两份数据的目录此时还可以访问数据
fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.25.6:9422 (status:VALID)
[root@foundation39 dir2]# cd ..
[root@foundation39 mfs]# cd dir1/
[root@foundation39 dir1]# mfsfileinfo passwd ##储存量一份数据的目录,此时便不能访问
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
no valid copies !!!
当再次启动 server7 上的 chunkserver 时,此时之前的数据会再次恢复。
[root@server7 ~]# systemctl start moosefs-chunkserver
[root@foundation39 dir1]# mfsfileinfo passwd ##dir 1 上的数据恢复
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 172.25.25.7:9422 (status:VALID)
[root@foundation39 dir1]# cd ..
[root@foundation39 mfs]# cd dir2/
[root@foundation39 dir2]# mfsfileinfo fstab ##dir 2上的另外一份数据恢复
fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.25.6:9422 (status:VALID)
copy 2: 172.25.25.7:9422 (status:VALID)
在建立的 dir 2 目录中存入一个100M 的数据,如下图所示,用命令 dd if=/dev/zero of=/mnt/mfs/dir2/bigfile bs=1M count=100
来生一个100M 的文件,此时可以看到当比较大的数据存入时,会被分割存入两个 chunk 中;
因为在 chunkserver 中的一个块的只能容纳 64M 的数据存储,当大于 64 时便会被分割存储;如100M 就需要两个块来存储,由于我们对于目录 dir2 的设置是存储两份,所以可以看到其生成了两份。
可以看到,dir2 中的文件一份存入 6号主机一份存入7号主机;此时此时当其中一台挂掉之后,大文件依旧完整;模拟当 6号主机挂掉时:
[root@server6 mfs]# systemctl stop moosefs-chunkserver
bigfile 文件依旧完整的存储于7号主机两个块中;
如删除 dir 1 中的文件 passwd 文件;
[root@foundation39 mfs]# cd dir1/
[root@foundation39 dir1]# ls
passwd
[root@foundation39 dir1]# rm -fr passwd ##删除 passwd
[root@foundation39 dir1]# ls
[root@foundation39 dir1]# mkdir /mnt/mfsmeta ##创建数据目录
挂载,将mfs挂载到新建的数据目录中;
[root@foundation39 dir1]# mfsmount -m /mnt/mfsmeta/ ##挂载
mfsmaster accepted connection with parameters: read-write,restricted_ip
[root@foundation39 dir1]# mount | grep mfs ##挂载信息过滤
mfsmaster:9421 on /mnt/mfs type fuse.mfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
mfsmaster:9421 on /mnt/mfsmeta type fuse.mfsmeta (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
[root@foundation39 dir1]# cd /mnt/mfsmeta/ ##挂载之后,新建的目录中会有两个文件
[root@foundation39 mfsmeta]# ls
sustained trash
可以看到2个目录sustained
和trash
,进入 trash 目录中可以看到里面有很多的回收站信息;
在 trash 目录中查找 passwd 的文件所在的位置,进入到对应的目录移动该文件至 undel 目录中,此时被删除的文件已经被恢复;如图所示:
存储类的编写类型:
格式 | 说明 |
---|---|
A,B | 一份在A,一份在B |
A,* | 一份在A,另一份随意 |
* ,* | 随机存储两份 |
AB,C+D | 一份必须在具有A和B的节点上,一份必须在有C或者D的节点上 |
A,B[X+Y] | 一份在A机房,一份在BX或者BY机房 |
A,A | 2份都在A |
AS,2B[H+S] | 一份在AS上,另外2份在B的固态盘或者机械盘上(3份) |
数据的分布
修改标签
在 server6 上修改 chunkserver1 的配置;
[root@server6 mfs]# pwd
/etc/mfs
[root@server6 mfs]# ls
mfschunkserver.cfg mfschunkserver.cfg.sample mfshdd.cfg mfshdd.cfg.sample
[root@server6 mfs]# vim mfshdd.cfg
[root@server6 mfs]# systemctl reload moosefs-chunkserver
修改文件的内容如下图所示:
访问master 的效果如下图:
在 server7 上修改 chunkserver2 的配置;
访问master 的效果如下图:
为了后面实验效果,此处在 server8 上再添加一台 chunkserver;配置如下:
[root@server8 3.0.115]# yum install moosefs-chunkserver-3.0.115-1.rhsystemd.x86_64.rpm -y ##安装软件
[root@server8 3.0.115]# vim /etc/hosts ##写入解析
[root@server8 3.0.115]# mkdir /mnt/chunk3 ##创建目录
[root@server8 3.0.115]# vim /etc/mfs/mfshdd.cfg ##写入目录
[root@server8 3.0.115]# tail -n2 /etc/mfs/mfshdd.cfg
/mnt/chunk3
[root@server8 3.0.115]# chown mfs.mfs /mnt/chunk3/ ##修改权限
[root@server8 3.0.115]# vim /etc/mfs/mfschunkserver.cfg ##修改标签
[root@server8 3.0.115]# systemctl start moosefs-chunkserver
启动服务之后,访问 master 的效果如下图所示:
使用存储类,可以更好的控制文件存储的位置。
存储类:
拥有A标签的都在同一个机房;
一个文件在A机房,也要在B机房就叫双机房,双冗余,class_AB。
创建2个副本都有A的标签,2个副本存储在A机房;和创建2个副本,一个副本存储在A机房,一个副本存储在B机房。
[root@foundation39 mfs]# mfsscadmin create 2A class_2A ##设定存储类
storage class make class_2A: ok
[root@foundation39 mfs]# mfsscadmin create AB class_AB ##设定存储类
storage class make class_AB: ok
[root@foundation39 mfs]# cd dir2/
[root@foundation39 dir2]# ls
bigfile fstab
[root@foundation39 dir2]# mfsfileinfo fstab ##此时两个在 AB
fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.25.6:9422 (status:VALID)
copy 2: 172.25.25.7:9422 (status:VALID)
[root@foundation39 dir2]# mfssetsclass class_2A fstab ##修改为2A
fstab: storage class: 'class_2A'
[root@foundation39 dir2]# mfsfileinfo fstab ###修改成功
fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.25.6:9422 (status:VALID)
copy 2: 172.25.25.8:9422 (status:VALID)
删除存储类
注意:删除之前,要将该类中的数据进行迁移,否则会出现报错
如图当删除一个存储类时,提示该存储类正在用,可以将其他的存储类加载该文件上,让要删除的存储类空余,然后将其删除。
固态盘S和机械盘H
chunk server1 设置为固态盘
[root@server6 mfs]# vim /etc/mfs/mfschunkserver.cfg
[root@server6 mfs]# systemctl reload moosefs-chunkserver
[root@server7 mfs]# vim /etc/mfs/mfschunkserver.cfg
[root@server7 mfs]# systemctl reload moosefs-chunkserver
chunk server3设置为机械盘
[root@server8 3.0.115]# vim /etc/mfs/mfschunkserver.cfg
[root@server8 3.0.115]# systemctl reload moosefs-chunkserver
此时范文 master 时的效果如下图所示:
此在客户端创建存储类,mfsscadmin create AS,BS class_ASBS
,从上图可知 ASBS 是在 6 和7 号主机,设定结果之后如图所示;
如设定存储类mfsscadmin create BS,2A[S+H] class_H
,表示一份在 BS上,另外两份在 AS 或者 AH 上;结果如图所示:
数据迁移
为了更好的观察数据迁移的实验效果设定 chunk server2 的磁盘类别如下图所示:
[root@server7 mfs]# vim /etc/mfs/mfschunkserver.cfg
[root@server7 mfs]# systemctl reload moosefs-chunkserver
数据迁移命令mfsscadmin create -C 2AS -K AS,BS -A AH,BH -d 30 classZ
,其中 -K表示保留在AS和BS上,-A表示打包数据到AH和BH上,-d 表示天数;