文章目录
一、搭建基本的MFS系统
实验环境
主机名(ip) | 角色 |
---|---|
server1(172.25.2.1) | mfs-master |
server2(172.25.2.2) | mfs-chunk |
server3(172.25.2.3) | mfs-chunk |
server5(172.25.2.5) | mfs-client |
1.1 YUM源安装配置MooseFS系统
在每个节点上
1、添加键值
curl "https://ppa.moosefs.com/RPM-GPG-KEY-MooseFS" > /etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
2、添加YUM源
curl "http://ppa.moosefs.com/MooseFS-3-el7.repo" > /etc/yum.repos.d/MooseFS.repo
server1上
3、安装MooseFS组件。
yum install moosefs-master moosefs-cgi moosefs-cgiserv moosefs-cli -y
4、编辑解析文件 /etc/hosts
,并发送给其他节点。
scp /etc/hosts server2:/etc/
scp /etc/hosts server3:/etc/
scp /etc/hosts server5:/etc/
5、安装完,可以看到MFS的配置文件 mfsmaster.cfg
和 mfsexports.cfg
-
mfsexports.cfg:被挂接目录及权限设置
-
mfsmaster.cfg:主配置文件,凡是用#注释掉的变量均使用其默认值。
vim /etc/mfs/mfsmaster.cfg
# WORKING_ USER = mfs #运行master server 的用户
# WORKING_ GROUP = mfs #运行master server 的组
# SYSLOG_IDENT = mfsmaster #master server 在syslog 中的标识,说明是由master serve 产生的
# LOCK_MEMORY = 0 #是否执行mlockall()以避免mfsmaster 进程溢出(默认为0)
# NICE_LEVEL = -19 #运行的优先级(如果可以默认是-19; 注意: 进程必须是用root 启动)
# EXPORTS_FILENAME = /usr/local/mfs/etc/mfsexports.cfg #被挂接目录及其权限控制文件的存放位置
# DATA_PATH = /usr/local/mfs/var/mfs #数据存放路径,此目录下大致有三类文件,changelog,sessions 和stats;
# BACK_LOGS = 50 #metadata 的改变log 文件数目(默认是50);
# REPLICATIONS_ DELAY_INIT = 300 #延迟复制的时间(默认是300s);
# REPLICATIONS_ DELAY_DISCONNECT = 3600 #chunkserver 断开的复制延迟(默认是3600);
# MATOML_LISTEN_HOST = * #metalogger 监听的IP 地址(默认是*,代表任何IP);
# MATOML_LISTEN_PORT = 9419 #metalogger 监听的端口地址(默认是9419);
# MATOCS_LISTEN_ HOST = * #用于chunkserver 连接的IP 地址(默认是*,代表任何IP);
# MATOCS_LISTEN_PORT = 9420 #用于chunkserver 连接的端口地址(默认是9420);
# MATOCU_LISTEN_HOST = * #用于客户端挂接连接的IP 地址(默认是*,代表任何IP);
# MATOCU_LISTEN_PORT = 9421 #用于客户端挂接连接的端口地址(默认是9421);
# CHUNKS_LOOP_TIME = 300 #chunks 的回环频率(默认是:300 秒);# CHUNKS_DEL_LIMIT = 100
# CHUNKS_WRITE_REP_LIMIT = 1 #在一个循环里复制到一个chunkserver 的最大chunk 数目(默认是1)
# CHUNKS_READ_REP_LIMIT = 5 #在一个循环里从一个chunkserver 复制的最大chunk 数目(默认是5)
# REJECT_OLD_ CLIENTS = 0 #弹出低于1.6.0 的客户端挂接(0 或1,默认是0)
6、此时,启动moosefs-master
和moosefs-cgiserv
,查看端口发现开启了9419,9420,9421,9425
端口。
systemctl start moosefs-master #启动MASTER
netstat -antlupe
systemctl start moosefs-cgiserv #启动WEBUI监控服务
netstat -antlupe
- 9419:metalogger监听的端口地址
- 9420:用于chunkserver连接的端口地址
- 9421:用于客户端挂接连接的端口地址
- 9425:监控各个分布节点的端口
7、在web界面访问:172.25.2.1:9425
,可以看到分布式文件系统的监控页面
在server2和server3上,Chunk Server
8、在server2和server3上,真正存储数据的节点安装moosefs-chunkserver
yum install moosefs-chunkserver -y
9、安装之后在两个节点都会生成一个mfs用户
10、编辑配置文件mfshdd.cfg
,写入mfs的分区/mnt/chunk1
- mfshdd.cfg:MFS使用空间配置文件
在这里/mnt/chunk1 是一个给mfs 的分区,但在本机上是一个独立的目录,最好是一个单独的硬盘或者一个raid 卷,最低要求是一个分区。
11、更改目录/mnt/chunk
的权限,因为mfschunkserver进程是用mfs运行的
chown -R mfs:mfs /mnt/chunk1
由于 mfschunkserver.cfg
chunk配置文件,默认Master为mfsmaster
,且已做解析。
12、开启chunkserver
systemctl start moosefs-chunkserver
netstat -antlupe ##开通监控的端口9422
13、此时,在server1上就可以看到,mfsmaster与server2建立了连接
server3同上操作
可以看出server2和server3同时通过server1的9420端口与server1进行交互
14、此时,在web监控页面就可以看到
MFS Client
15、在server5上,安装MFS Client客户端
yum install moosefs-client -y
16、编辑挂载配置文件
mfsmount.cfg
,写入挂载点目录/mnt/mfs
并创建。
17、挂载 mfsmount
到此为止,我们的MFS集群已经搭建完成。
二、MFS的高级特性
2.1 冗余goal设置
目标(goal),是指文件被拷贝的份数,设定了拷贝的份数后是可以通过mfsgetgoal
命令来证实的,也可以通过mfsrsetgoal
来改变设定。
mfssetgoal -r 份数 目录/文件
- 实际的拷贝份数可以通过
mfscheckfile
和mfsfile info
命令来证实
[root@server5 mfs]# mkdir rr1
[root@server5 mfs]# mkdir rr2
[root@server5 mfs]# ls
rr1 rr2
[root@server5 mfs]# mfssetgoal -r 1 rr1
rr1:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
[root@server5 mfs]# cd rr1
[root@server5 rr1]# cp /etc/passwd .
[root@server5 rr1]# ls
passwd
[root@server5 rr1]# mfsfileinfo passwd
passwd:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 172.25.2.3:9422 (status:VALID)
[root@server5 mfs]# mfssetgoal -r 2 rr2
rr2:
inodes with goal changed: 0
inodes with goal not changed: 1
inodes with permission denied: 0
[root@server5 mfs]# cd rr2
[root@server5 rr2]# cp /etc/fstab .
[root@server5 rr2]# ls
fstab
[root@server5 rr2]# mfsfileinfo fstab
fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.2.2:9422 (status:VALID)
copy 2: 172.25.2.3:9422 (status:VALID)
- 文件可以有多份copy,当goal为1时,文件会被随机存到一台chunkserver上,当goal的数大于1时,copy会由master调度保存到不同的chunkserver上,goal的大小不要超过chunkserver的数量,否则多出的copy,不会有chunkserver去存。
此时,如果server3宕机,那么copy到server3上的副本就打不开了。
2.2 垃圾回收站
被删除的文件能够存放在一个“ 垃圾箱”的时间就是一个隔离时间,用mfsgettrashtime
命令查看,用mfssettrashtime
命令来设置
- 删除文件可以通过一个单独安装MFSMETA 文件系统。特别是它包含目录/ trash (包含任然可以被还原的被删除文件的信息)和/ trash/undel (用于获取文件)。只有管理员有权限访问MFSMETA(用户的uid 0,通常是root)。
[root@server5 ~]# mkdir /mnt/mfsmeta
[root@server5 ~]# mfsmount -m /mnt/mfsmeta
mfsmaster accepted connection with parameters: read-write,restricted_ip
[root@server5 ~]# mount
mfsmaster:9421 on /mnt/mfsmeta type fuse.mfsmeta (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
[root@server5 ~]# cd /mnt/mfsmeta
[root@server5 mfsmeta]# ls
sustained trash
[root@server5 mfsmeta]# cd trash/
[root@server5 trash]# find -name *passwd*
./004/00000004|rr1|passwd
[root@server5 trash]# mv ./004/00000004\|rr1\|passwd undel/
[root@server5 trash]# cd /mnt/mfs
[root@server5 mfs]# ls
rr1 rr2
[root@server5 mfs]# cd rr1
[root@server5 rr1]# ls
passwd
[root@server5 rr1]#
- 被删文件的文件名在“垃圾箱”目录里还可见,文件名由一个八位十六进制的数i-node 和被删文件的文件名组成,在文件名和i-node 之间不是用“/”,而是用了“|”替代。如果一个文件名的长度超过操作系统的限制(通常是255个字符),那么部分将被删除。通过从挂载点起全路径的文件名被删除的文件任然可以被读写。
移动这个文件到trash/undel 子目录下,将会使原始的文件恢复到正确的MooseFS文件系统上路径下(如果路径没有改变)。 如果在同一路径下有个新的同名文件,那么恢复不会成功。从“垃圾箱”中删除文件结果是释放之前被它站用的空间(删除有延迟,数据被异步删除)。
三、MFS的常见问题
3.1 启动MFS集群
最安全的启动MooseFS 集群(避免任何读或写的错误数据或类似的问题)的方式是按照以下命令步骤:
- 启动mfsmaster 进程
- 启动所有的mfschunkserver 进程
- 启动mfsmetalogger 进程(如果配置了mfsmetalogger)
- 当所有的chunkservers 连接到MooseFS master 后,任何数目的客户端可以利用mfsmount 去挂接被export 的文件系统。(可以通过检查master 的日志或是CGI 监视器来查看是否所有的chunkserver被连接)。
3.2 停止MFS集群
- 在所有的客户端卸载MooseFS 文件系统(用umount 命令或者是其它等效的命令)
- 用mfschunkserver stop 命令停止chunkserver 进程
- 用mfsmetalogger stop 命令停止metalogger 进程
- 用mfsmaster stop 命令停止master 进程
3.3 MFS Master的恢复
- 在正常关闭的时候,
/var/lib/mfs
目录中会产生metadata.mfs
这个文件,这个文件是开启mfsmaster服务时必备的文件。如果没有该文件,那么mfsmaster服务也就起不来。 - 在正常开启的时候,
/var/lib/mfs
目录中就会产生metadata.mfs.back
这个文件。
修改mfsmaster的启动脚本
systemctl daemon-reload