MooseFS是一个具有容错性的网络分布式文件系统。它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源
MooseFS旨在为数据中心提供容错,高可用,高性能,可扩展的通用网络分布式文件系统。最初是专有软件
官网地址:http://www.moosefs.com/
1 元数据服务器(Master)
2 元数据日志服务器(Metalogger)
3 块服务器(Chunk Server)
客户端
客户端向Master发送写请求
Master通知Chunk Server(谁空闲,如空闲新建Chunk编号),找到后将知道的Chunk Server IP和编号告知客户端
客户端向指定IP和编号存储数据
客户端告知Master写入完毕
Master通知Metalogger有新数据写入(Matelogger纪录新增加文件位置和对应Chunk Server),日志记录完毕后,连接关闭
准备四台主机进行实验:
172.25.13.110 :管理机master
172.25.13.120:后端存储1
172.25.13.130:都端存储2
172.25.13.140 :测试物理主机
获取mfs安装包,并安装;可在官网下载:
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用户
[root@toto1 3.0.105]# id mfs
uid=997(mfs) gid=995(mfs) groups=995(mfs)
添加本地解析(非常重要,不做的话,服务起不来)
[root@toto1 3.0.105]# vim /etc/hosts
172.25.13.110 toto1 mfsmaster
启动master
systemctl start moosefs-master
服务配置文件:/etc/mfs/mfsmaster.cfg
查看端口发现9419 9420 9421三个端口打开:
9419:metalogger监听的端口,默认的,和源数据日志结合。定期和master主机同步数据
9420:用于chunkserver连接的默认端口地址
9421:用于clientserver连接的默认端口
[root@toto1 3.0.105]# 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 2165/mfsmaster
tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 2165/mfsmaster
tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 2165/mfsmaster
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 657/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
systemctl start moosefs-cgiserv
查看9425端口是否打开
[root@toto1 3.0.105]# systemctl start moosefs-cgiserv
[root@toto1 3.0.105]# 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 2165/mfsmaster
tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 2165/mfsmaster
tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 2165/mfsmaster
tcp 0 0 0.0.0.0:9425 0.0.0.0:* LISTEN 2178/python
测试master是否配置正常:
使用物理主机访问:172.25.13.110:9425
注意:两个后端服务器的设置是一致的
安装服务:
rpm -ivh moosefs-chunkserver-3.0.105-1.rhsystemd.x86_64.rpm
安装包可以从官网进行下载:
添加本地解析(非常重要,不做的话,服务起不来)
[root@toto1 3.0.105]# vim /etc/hosts
172.25.13.110 toto1 mfsmaster
添加一块磁盘存放数据:
添加磁盘、分区、格式化、创建挂载目录/mnt/toto2、挂载
修改目录权限
chown mfs.mfs /mnt/toto2
:不修改服务无法启动
由于该服务时由mfs用户的身份进行运行操作,所有将该共享挂载目录的权限修改位mfs
修改配置文件
vim /etc/mfs/mfshdd.cfg
最后一行加上:
/mnt/toto2 # 指定共享的目录是哪一个
启动服务
systemctl start moosefs-chunkserver.service
查看9422端口已经开启:
[root@toto2 3.0.105]# 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 2492/mfschunkserver
测试:图形化可以看到两个后端服务器也加入了server选项:
安装客户端
moosefs-client-3.0.105-1.rhsystemd.x86_64.rpm
安装包可以从官网进行下载:
添加本地解析(非常重要,不做的话,服务起不来)
[root@toto1 3.0.105]# vim /etc/hosts
172.25.13.110 toto1 mfsmaster
编辑配置文件
vim /etc/mfs/mfsmount.cfg
最后一行加上:
/mnt/mfs # 指定挂载点
创建挂载点
mkdir /mnt/mfs
挂载
[root@toto4 3.0.105]# mfsmount
查看挂载情况:挂载成功
[root@toto4 3.0.105]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rhel-root 17811456 10384300 7427156 59% /
devtmpfs 930892 0 930892 0% /dev
tmpfs 941864 0 941864 0% /dev/shm
tmpfs 941864 16748 925116 2% /run
tmpfs 941864 0 941864 0% /sys/fs/cgroup
/dev/sda1 1038336 141512 896824 14% /boot
tmpfs 188376 0 188376 0% /run/user/0
mfsmaster:9421 41920512 590464 41330048 2% /mnt/mfs
建立目录测试
mkdir /mnt/mfs/dir1
mkdir /mnt/mfs/dir2
查看信息
mfsgetgoal 测试目录:显示目录的备份次数
[root@toto4 3.0.105]# mfsgetgoal /mnt/mfs/dir1
/mnt/mfs/dir1: 2
[root@toto4 3.0.105]# mfsgetgoal /mnt/mfs/dir2
/mnt/mfs/dir2: 2
显示两个目录都进行备份两次:由于只有两个都端存储服务器。
改变备份份数
改变其中一个目录的备份次数,用来作对比
mfssetgoal -r 1 /mnt/mfs/dir1
[root@toto4 dir1]# mfssetgoal -r 1 /mnt/mfs/dir1
/mnt/mfs/dir1:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
拷贝文件测试
/mnt/mfs/dir1 :只进行一次备份
[root@toto4 dir1]# cp /etc/passwd .
[root@toto4 dir1]# mfsfileinfo passwd
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 172.25.13.130:9422 (status:VALID) # 数据存储在130主机上
/mnt/mfs/dir2 :进行两次备份
[root@toto4 dir2]# cp /etc/group .
[root@toto4 dir2]# mfsfileinfo group
group:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID)
copy 2: 172.25.13.130:9422 (status:VALID) # 备份两次,分别在不同的主机上
文件的查看:
在客户端上可以查看文件的具体内容;但是在存储服务器上只能看到文件碎片。
由于dir1中的数据存储在130主机上,
dir2中的数据在120以及130主机上各自存储了一份,这时候关闭130主机,测试不同:
130主机进行操作:
[root@toto3 mnt]# systemctl stop moosefs-chunkserver
查看dir2中的文件内容:
[root@toto4 dir2]# mfsfileinfo group
group:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID) # 显示存储在120主机,由于130主机关闭
文件能够正常查看
[root@toto4 dir2]# cat group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
查看dir1中的文件内容:
[root@toto4 dir1]# mfsfileinfo passwd
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
no valid copies !!! # 显示没有数据存储
[root@toto4 dir1]# cat passwd # 由于没有数据,无法查看,一直卡在这个页面
只需要重新开启130主机即可。
文件以chunk大小存储,每chunk最大为64M。小于64M的,该chunk的大小即为该文件大小,超过64M的文件将被均分,每一份(chunk)的大小以不超过64M为原则
在dir1目录:
放入一个大小位200M的数据文件:
[root@toto4 dir1]# dd if=/dev/zero of=bigfile bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 8.2296 s, 25.5 MB/s
[root@toto4 dir1]# mfsfileinfo bigfile
bigfile:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID)
chunk 1: 0000000000000004_00000001 / (id:4 ver:1)
copy 1: 172.25.13.130:9422 (status:VALID)
chunk 2: 0000000000000005_00000001 / (id:5 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID)
chunk 3: 0000000000000006_00000001 / (id:6 ver:1)
copy 1: 172.25.13.130:9422 (status:VALID)
文件被分成四个部分,交叉存储在120以及130主机,没有进行备份,相当于每一个值机里面只是这个文件的一部分
在dir2目录:
文件被分成四个部分,交叉存储在120以及130主机,进行备份,相当于每一个主机里面都由一个完整的文件
[root@toto4 dir2]# dd if=/dev/zero of=bigfile1 bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 12.7836 s, 16.4 MB/s
[root@toto4 dir2]# mfsfileinfo bigfile1
bigfile1:
chunk 0: 0000000000000007_00000001 / (id:7 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID)
copy 2: 172.25.13.130:9422 (status:VALID)
chunk 1: 0000000000000008_00000001 / (id:8 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID)
copy 2: 172.25.13.130:9422 (status:VALID)
chunk 2: 0000000000000009_00000001 / (id:9 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID)
copy 2: 172.25.13.130:9422 (status:VALID)
chunk 3: 000000000000000A_00000001 / (id:10 ver:1)
copy 1: 172.25.13.120:9422 (status:VALID)
copy 2: 172.25.13.130:9422 (status:VALID)
在上述情况中,若是存在一台后端存储服务器宕机,则dir1中的文件不完整,客户端就会无法进行查看,但是dir2中的文件在每一个主机上都存在一个完成的备份,人就可以保证客户端可以正常的查看。
正常情况下:
master开启时,默认会在/var/lib/mfs目录中生成metadata.mfs.back文件
master关闭时,metadata.mfs.back文件会变为metadata.mfs
目前master是开启的,看一下这个文件:果然存在
[root@toto1 3.0.105]# ls /var/lib/mfs/metadata.mfs.back
/var/lib/mfs/metadata.mfs.back
异常关闭master
使用kill 发送信号直接强行结束进程
[root@toto1 3.0.105]# ps aux |grep mfsmaster
mfs 2520 1.0 59.3 691344 603420 ? S< 22:32 0:11 /usr/sbin/mfsmaster start
mfs 2521 0.0 0.0 23432 288 ? S< 22:32 0:00 mfsmaster (data writer)
root 2534 0.0 0.0 112648 956 pts/0 R+ 22:49 0:00 grep --color=auto mfsmaster
[root@toto1 3.0.105]# kill -9 2520
[root@toto1 3.0.105]# ps aux |grep mfsmaster
root 2539 0.0 0.0 112648 960 pts/0 S+ 22:49 0:00 grep --color=auto mfsmaster
再次查看/var/lib/mfs目录中文件情况:
[root@toto1 3.0.105]# ls /var/lib/mfs
changelog.0.mfs metadata.crc metadata.mfs.back.1 stats.mfs
changelog.1.mfs metadata.mfs.back metadata.mfs.empty
metadata.mfs.back 文件依然存在,并没由变成metadata.mfs文件
无法启动
[root@toto1 3.0.105]# 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.
1 加上-a参数
mfsmaster start -a
2 要使用systemd方式,可以对启动脚本做修改
vim /usr/lib/systemd/system/moosefs-master.service # 修改启动脚本
ExecStart=/usr/sbin/mfsmaster start -a # 在该行后面添加 -a
当数据被删除之后,在一定时间内可以进行恢复。该时间可以查看:
mfsgettrashtime /mnt/mfs/dir1/ 查看文件在垃圾箱中存在的时间:
[root@toto4 dir1]# mfsgettrashtime /mnt/mfs/dir1/
/mnt/mfs/dir1/: 86400 # 显示86400秒 时间是1天
删除该目录中的文件:
[root@toto4 dir1]# ls
bigfile passwd
[root@toto4 dir1]# rm -fr passwd
[root@toto4 dir1]# ls
bigfile
创建数据恢复的目录
[root@toto4 dir1]# mkdir /mnt/mfsmeta
挂载数据恢复的目录
mfsmount -m /mnt/mfsmeta/
这个挂载后df命令看不到,mount命令可以看到’ mount -l
目录里会有两个子目录,删除的数据在trash目录里
[root@toto4 mfsmeta]# pwd
/mnt/mfsmeta
[root@toto4 mfsmeta]# ls
sustained trash
查找passwd文件
find -name *passwd*
[root@toto4 trash]# find -name *passwd*
./004/00000004|dir1|passwd
恢复文件
[root@toto4 trash]# cd 004
[root@toto4 004]# ls
00000004|dir1|passwd undel
[root@toto4 004]# mv 00000004\|dir1\|passwd undel/
查看文件是否已经恢复
[root@toto4 004]# cd /mnt/mfs/dir1
[root@toto4 dir1]# ls
bigfile passwd
成功恢复