MooseFS介绍 #具体down几台机器数据不丢失 和副本数量 有关
1.MooseFS是一个具有容错性的网络分布式文件系统。它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源
2.MooseFS旨在为数据中心提供容错,高可用,高性能,可扩展的通用网络分布式文件系统。最初是专有软件,它于2008年5月5日作为开源向公众发布
高可靠性:每份数据可以设置多个副本(多份数据),并可以存储在不同的主机上
可扩展性:可以很轻松的通过增加主机磁盘容量或增加主机数量来动态扩展整个文件系统的存储量
可容错性:我们可以通过对mfs进行系统设置,实现当数据文件被删除后一段时间内,依然存放在主机的回收站中,以备误删恢复数据
数据一致性:即使文件被写入/访问时,我们依然可以轻松完成对文件一致性的快照
3.官网地址:http://www.moosefs.com/
MooseFS组成:MooseFS遵循与Fossil(文件系统),Google File System,Lustre或Ceph类似的设计原则
文件系统包括三个组件:
元数据服务器(Master) - 维护和管理文件的位置(布局),文件访问和命名空间层次结构。当前版本的MooseFS支持多个元数据服务器和自动故障转移。客户端只与MDS通信以检索/更新文件的布局和属性; 数据本身直接在客户端和块服务器之间传输。元数据服务器是用户空间守护程序 ; 元数据保存在内存中,并且懒惰地存储在本地磁盘上。
元数据日志服务器(Metalogger)- 纪录数据的改动情况,定期从MDS中提取元数据以存储它以进行备份。从版本1.6.5开始,这是一个可选功能。
块服务器(Chunk Server) - 存储数据并可选地在它们之间进行复制。虽然可扩展性限制尚未发布,但可能有很多。迄今为止报告的最大集群包括160台服务器。[7] Chunk服务器也是一个用户空间守护程序,它依赖于底层本地文件系统来管理实际存储。
客户端 - 与Master和ChunkServer交谈。MooseFS客户端通过FUSE将文件系统挂载到用户空间。
MFS读过程
客户端向Master发送读请求
Master去缓存的数据库(非MySQL)中搜索客户端所需数据的位置,并告知客户端(Chunk Server IP、Chunk编号)
客户端去指定Chunk Server的对应Chunk编号读取数据
客户端通知Master读取完毕
MFS写过程
客户端向Master发送写请求
Master通知Chunk Server(谁空闲,如空闲新建Chunk编号),找到后将知道的Chunk Server IP和编号告知客户端
客户端向指定IP和编号存储数据
客户端告知Master写入完毕
Master通知Metalogger有新数据写入(Matelogger纪录新增加文件位置和对应Chunk Server),日志记录完毕后,连接关闭
MooseFS系统特点
1.轻量 易配置 易维护
2.开发活跃 社区也比较活跃 资料丰富
3.括容成本低 支持在线扩容 不影响业务
4.以文件系统的方式展示
5.磁盘利用率较高
6.可设置删除文件的空间回收时间,避免误删文件丢失及恢复不及时影响业务
7.系统负载,即数据读写分配到所有的服务器上
8.可以设置文件备份的副本数量
数据存储方式
文件以chunk大小存储,每chunk最大为64M。小于64M的,该chunk的大小即为该文件大小,超过64M的文件将被均分,每一份(chunk)的大小以不超过64M为原则;文件可以有多份copy,即除原始文件以外,该文件还存储的份数。当goal为1时,表示只有一份copy,这份copy会被随机存到一台chunkserver上。当goal的数大于1时,每一份copy会被分别保存到其它chunkserver上。goal的大小不要超过chunkserver的数量,否则多出的copy,不会有chunkserver去存,goal设置再多实际上也就没有意义的。copy的份数,一般设为大于1份,这样如果有一台chunkserver坏掉后,至少还有一份copy,当这台又被加进来后,会将失去的那份copy补回来,始终保持原有的copy数。而如果goal设为1,那么当存储该copy的chunkserver坏掉,之后又重新加入回来,copy数将始终是0,不会恢复到之前的1个copy
chunkserver上的剩余存储空间要大于1GB,新的数据才会被允许写入,否则,你会看到No space left的提示
多个chunker并不影响写的速度,但是能加快读的速度,在原来的基础上增加一个chunker时,数据会自动同步到新增的chunker上以达到数据的平衡和均衡
###########mfs分布式文件系统############
#3台虚拟机实验
##获取mfs安装包,可在管网下载
##server1上做:
lftp 172.25.0.250
mirror 3.0.105
##安装mfs所需包
yum install -y moosefs-master-3.0.105-1.rhsystemd.x86_64.rpm
moosefs-cli-3.0.105-1.rhsystemd.x86_64.rpm
moosefs-cgi-3.0.105-1.rhsystemd.x86_64.rpm
moosefs-cgiserv-3.0.105-1.rhsystemd.x86_64.rpm
安装完成后会生成mfs用户
##做解析(后面所有节点都要做)
vim /etc/hosts
172.25.0.1 server1 mfsmaster
#这里叫mfsmaster是因为配置文件/etc/mfs/mfsmaster.cfg里面是mfsmaster
##启动master
systemctl start moosefs-master
查看端口发现9419 9420 9421三个端口打开
9419:metalogger监听的端口,默认的,和源数据日志结合。定期和master主机同步数据
9420:用于chunkserver连接的默认端口地址
9421:用于clientserver连接的默认端口
##启动图形
systemctl start moosefs-cgiserv
打开了9425端口
点击server的+号,info的-号,可以看到当前没有chunkserver加入,因为还没配置
#######部署chunkserver########
##server2上做:
安装:
rpm -ivh moosefs-chunkserver-3.0.105-1.rhsystemd.x86_64.rpm
做解析:
172.25.0.1 server1 mfsmaster
添加一块磁盘存放数据: /dev/vdb
分一个区,并格式化为xfs ##分一个区是因为分区表就算破坏了,也容易恢复
mkfs.xfs /dev/vdb1
##创建挂载点
mkdir /mnt/chunk1
##挂载
mount /dev/vdb1 /mnt/chunk1
##拷贝文件测试
cp /etc/passwd /mnt/chunk1/
##修改目录权限
chown mfs.mfs /mnt/chunk1
##修改配置文件
vim /etc/mfs/mfshdd.cfg
最后一行加上:
/mnt/chunk1
##做解析
vim /etc/hosts
172.25.0.1 server1 mfsmaster
##开启服务
systemctl start moosefs-chunkserver
可以看到开启了9422端口
图形化也可以看到server2加入了server选项
######部署server3######
安装软件
做解析
server3不添加磁盘
#建立目录
mkdir /mnt/chunk2
#修改配置文件
vim /etc/mfs/mfshdd.cfg
最后一行加上:
/mnt/chunk2
##做解析
vim /etc/hosts
172.25.0.1 server1 mfsmaster
##开启服务
systemctl start moosefs-chunkserver
#此处有报错
Jun 12 22:50:09 server3 mfschunkserver: hdd space manager: can’t create lock file ‘/mnt/chunk2/.lock’: EACCES (Permission denied)
#解决办法
chown mfs.mfs /mnt/chunk2
图形化也可以看到server3也加入了server选项
###########配置客户端(物理机做客户端)##########
##安装客户端
rpm -ivh moosefs-client-3.0.105-1.rhsystemd.x86_64.rpm
##解析
172.25.0.1 server1 server1.example.org bbs.westos.org mfsmaster
##创建挂载点
mkdir /mnt/mfs
##编辑配置文件
vim /etc/mfs/mfsmount.cfg
最后一行加上:
/mnt/mfs
##挂载
[root@foundation0 ~]# mfsmount
##查看
[root@foundation0 ~]# df
mfsmaster:9421 38771712 1665280 37106432 5% /mnt/mfs
##建立目录测试
mkdir /mnt/mfs/dir1
mkdir /mnt/mfs/dir2
##查看信息
[root@foundation0 mfs]# mfsgetgoal dir1/
dir1/: 2
[root@foundation0 mfs]# mfsgetgoal dir2/
dir2/: 2 ##可以看到两个目录都备份了2份
##改变备份份数
[root@foundation0 mfs]# mfssetgoal -r 1 dir1
dir1:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
##拷贝文件测试
cp /etc/passwd /mnt/mfs/dir1
cp /etc/group /mnt/mfs/dir2
##查看
[root@foundation0 dir1]# mfsfileinfo passwd
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
[root@foundation0 dir2]# mfsfileinfo group
group:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
copy 2: 172.25.0.3:9422 (status:VALID)
可以看到passwd备份了一份,在server3上
表示dir1目录中备份一份,dir2两份
###########################################################
tree /mnt/chunk2/
发现客户端上能正常查看到数据。而存储服务器上只能看到文件碎片
###########################################################
##关闭server2测试
[root@server2 ~]# systemctl stop moosefs-chunkserver
[root@foundation0 dir1]# mfsfileinfo passwd
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
no valid copies !!!
[root@foundation0 dir2]# mfsfileinfo group
group:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.0.3:9422 (status:VALID)
dir2目录中还有一份,dir1中没有,这时打开passwd文件虚拟机就会卡住,因为数据不在本机了
############客户端离散存储测试################
#默认情况下,chunkserver对数据的备份是按块备份的,每块50MB
##在dir1目录
[root@foundation0 dir1]# dd if=/dev/zero of=bigfile bs=1M count=200
##查看
[root@foundation0 dir1]# mfsfileinfo bigfile
bigfile:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
chunk 1: 0000000000000004_00000001 / (id:4 ver:1)
copy 1: 172.25.0.3:9422 (status:VALID)
chunk 2: 0000000000000005_00000001 / (id:5 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
chunk 3: 0000000000000006_00000001 / (id:6 ver:1)
copy 1: 172.25.0.3:9422 (status:VALID)
看到文件分为4份,在server2和server3上交叉存储
##在dir2目录
[root@foundation0 dir2]# dd if=/dev/zero of=bigfile1 bs=1M count=200
##查看
[root@foundation0 dir2]# mfsfileinfo bigfile1
bigfile1:
chunk 0: 0000000000000007_00000001 / (id:7 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
copy 2: 172.25.0.3:9422 (status:VALID)
chunk 1: 0000000000000008_00000001 / (id:8 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
copy 2: 172.25.0.3:9422 (status:VALID)
chunk 2: 0000000000000009_00000001 / (id:9 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
copy 2: 172.25.0.3:9422 (status:VALID)
chunk 3: 000000000000000A_00000001 / (id:10 ver:1)
copy 1: 172.25.0.2:9422 (status:VALID)
copy 2: 172.25.0.3:9422 (status:VALID)
可以看到在每个节点都备份了2份
##关闭server2,dir1中的文件都不可用
[root@server2 ~]# systemctl stop moosefs-chunkserver.service
##查看
[root@foundation0 dir1]# mfsfileinfo bigfile
bigfile:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
no valid copies !!!
chunk 1: 0000000000000004_00000001 / (id:4 ver:1)
no valid copies !!!
chunk 2: 0000000000000005_00000001 / (id:5 ver:1)
no valid copies !!!
chunk 3: 0000000000000006_00000001 / (id:6 ver:1)
no valid copies !!!
[root@foundation0 dir2]# mfsfileinfo bigfile1
bigfile1:
chunk 0: 0000000000000007_00000001 / (id:7 ver:1)
copy 1: 172.25.0.3:9422 (status:VALID)
chunk 1: 0000000000000008_00000001 / (id:8 ver:1)
copy 1: 172.25.0.3:9422 (status:VALID)
chunk 2: 0000000000000009_00000001 / (id:9 ver:1)
copy 1: 172.25.0.3:9422 (status:VALID)
chunk 3: 000000000000000A_00000001 / (id:10 ver:1)
copy 1: 172.25.0.3:9422 (status:VALID)
只有server3上的可用
###############moose-master的开启和关闭################
##开启
master开启时,默认会在/var/lib/mfs目录中生成metadata.mfs.back文件
##关闭
master关闭时,metadata.mfs.back文件会变为metadata.mfs
‘做下面实验前,最好先卸载物理机的挂载,关闭chunkserver’
##但是如果master异常关闭,就不能通过systemctl start moosefs-master命令来启动
[root@server1 ~]# ps ax | grep mfsmaster
1831 ? S< 0:00 /usr/sbin/mfsmaster start
1832 ? S< 0:00 mfsmaster (data writer)
1860 pts/0 S+ 0:00 grep –color=auto mfsmaster
[root@server1 ~]# kill -9 1831
[root@server1 ~]# systemctl start moosefs-master
Job for moosefs-master.service failed because the control process exited with error code. See “systemctl status moosefs-master.service” and “journalctl -xe” for details.
查看日志发现找不到metadata.mfs
Jun 8 15:09:41 server1 mfsmaster: can’t find metadata.mfs – try using option ‘-a’
##使用命令行也不能开启
[root@server1 ~]# mfsmaster start
open files limit has been set to: 16384
working directory: /var/lib/mfs
lockfile created and locked
initializing mfsmaster modules …
exports file has been loaded
topology file has been loaded
loading metadata …
can’t find metadata.mfs – try using option ‘-a’
init: metadata manager failed !!!
error occurred during initialization – exiting
##加上-a参数
[root@server1 ~]# mfsmaster start -a
成功
##要使用systemd方式,可以对启动脚本做修改
[root@server1 ~]# vim /usr/lib/systemd/system/moosefs-master.service
ExecStart=/usr/sbin/mfsmaster start -a
##再次尝试
[root@server1 ~]# systemctl daemon-reload
[root@server1 ~]# systemctl start moosefs-master #注意:此启动方式不要和前一个 mfsmaster start -a混淆
正常
################mfs数据恢复##################
##删除一个文件
[root@foundation0 dir1]# rm -fr passwd
##查看文件在垃圾箱存在时间
[root@foundation0 dir1]# mfsgettrashtime /mnt/mfs/dir1/
/mnt/mfs/dir1/: 86400 ##86400s,也就是1天
##创建数据恢复的目录
[root@foundation0 ~]# mkdir /mnt/mfsmeta
##挂载目录
[root@foundation0 ~]# mfsmount -m /mnt/mfsmeta/
mfsmaster accepted connection with parameters: read-write,restricted_ip
‘这个挂载后df命令看不到,mount命令可以看到’ mount -l
##目录里会有两个子目录
[root@foundation0 mfsmeta]# ls
sustained trash
删除的数据在trash目录里
##查找passwd文件
[root@foundation0 trash]# find -name passwd
./004/00000004|dir1|passwd
##恢复文件
[root@foundation0 trash]# cd 004/
[root@foundation0 004]# ls
00000004|dir1|passwd undel
[root@foundation0 004]#
[root@foundation0 004]# mv 00000004|dir1|passwd undel/
##查看
[root@foundation0 dir1]# ls
bigfile passwd
[root@foundation0 dir1]# pwd
/mnt/mfs/dir1
成功恢复