目录
4.MooseFS的官方网站: https://moosefs.com
5.Moosefs的软件包地址:百度网盘 请输入提取码提取码:pxup
4.搭建Meta Logger Server(元数据日志服务器)
5.搭建Chunk Server(三台Chunk Server主机搭建步骤相同)
一 、前言
1.Moosefs的介绍
MooseFS(moose 驼鹿)是一款网络分布式文件系统。它把数据分散在多台服务器上,但对于用户来讲,看到的只是一个源。MFS也像其他类UNIX文件系统一样,包含了层级结构(目录树),存储着文件属性(权限、最后访问和修改时间),常见特殊的文件(块设备、字符设备、管道、套接字),符号链接,硬链接
2.Moosefs的特征
(1)层析结构(目录树)
(2)存储文件属性(权限、访问和修改时间)
(3)支持特殊文件(块设备,字符设备,管道)
(4)符号链接,软硬链接
(5)对文件系统访问可以通过IP地址或者密码进行访问限制
(6)高可靠(数据的多个拷贝存储在不同的计算机上)
(7)通过附加新的计算机或者硬盘可以实现容量的动态扩展
(8)删除文件可以根据一个可配置的时间周期进行保留
(9)不受访问和写入影响的文件连贯快照
3.MooseFS的应用场景(分布式文件系统的应用场景)
(1)大规模高并发的数据存储及访问(小文件,大文件)
(2)大规模的数据处理,如日志分析
4.MooseFS的官方网站: https://moosefs.com
5.Moosefs的软件包地址:百度网盘 请输入提取码提取码:pxup
6.MFS文件系统的组成
元数据服务器(Master):在整个体系中负责管理文件系统,维护元数据。
元数据日志服务器(MetaLogger):备份Master服务器的变化日志文件,文件类型为changelog_ml.*.mfs。当Master服务器数据丢失或者损坏时,可以从日志服务器中取得文件,进行修复。
数据存储服务器(Chunk Server):真正存储数据的服务器。存储文件时,会把文件分块保存,在数据服务器之间进行复制。数据服务器越多,能使用的“容量”就越大,可靠性就越高,性能也就越好。
客户端(Client):可以像挂载NFS一样挂载MFS文件系统,其操作是相同的。
7.MFS的工作流程
(1)MFS读取数据的处理过程
客户端向元数据服务器发出读请求
元数据服务器把所需数据存放的位置(Chunk Server的IP地址和Chunk编号)告知客户端
客户端向已知的Chunk Server请求发送数据
Chunk Server向客户端发送数据
(2)MFS写入数据的处理过程
客户端向元数据服务器发送写入请求
元数据服务器与Chunk Server进行交互(只有当所需的分块Chunks存在的时候才进行交互),但元数据服务器只在某些服务器创建新的分块Chunks,创建成功后由元数据服务器告知客户端,可以在哪个Chunk Server的哪些Chunks写入数据
客户端向指定的Chunk Server写入数据
该Chunk Server与其他Chunk Server进行数据同步,同步成功后Chunk Server告知客户端数据写入成功
客户端告知元数据服务器本次写入完毕
(3)MFS的删除文件过程
客户端有删除操作时,首先向Master发送删除信息
Master定位到相应元数据信息进行删除,并将chunkserver上的删除操作加入队列异步清理
响应客户端删除成功的信号
MFS修改文件内容的过程
客户端有修改文件内容时,首先向Master发送操作信息
Master申请新的块给.swp文件
客户端关闭文件后,会向Master发送关闭信息
Master会检测内容是否有更新,若有,则申请新的块存放更改后的文件,删除原有块和.swp文件块
若无,则直接删除.swp文件块。
(4)MFS重命名文件的过程
客户端重命名文件时,会向Master发送操作信息;
Master直接修改元数据信息中的文件名;返回重命名完成信息;
二 、MooseFS的搭建(源码安装)
1.规划节点
主机类型 | IP地址 | 主机名 |
Master | 192.168.32.127 | Server1 |
Metalogger | 192.168.32.128 | Server2 |
Chunkserver1 | 192.168.32.130 | Server3 |
Chunkserver2 | 192.168.32.132 | Server4 |
Chunkserver3 | 192.168.32.131 | Server5 |
Client | 192.168.32.133 | Server6 |
2.在每个节点上安装编译器和工具包并关闭防火墙
[root@server ~]# setenforce 0
[root@server ~]# systemctl stop firewalld
[root@server ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@server ~]# yum install gcc gcc-c++ make zlib-devel fuse-devel -y
[root@server ~]# yum install -y lrz*
[root@server ~]# yum install -y unzip
[root@server ~]# yum install -y net-tools
3.搭建master server
[root@server1 ~]# useradd -M -s /sbin/nologin mfs //创建进程用户
[root@server1 ~]# unzip moosefs-master.zip -d /opt //解压到/opt目录下
[root@server1 ~]# cd /opt/moosefs-master/ //进入该目录
[root@server1 moosefs-master]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs //进行编译
[root@server1 moosefs-master]# make && make install //安装
[root@server1 moosefs-master]# cd /usr/local/mfs/etc/mfs/
[root@server1 mfs]# cp mfsexports.cfg.sample mfsexports.cfg #输出目录配置文件,定义挂载以及权限设定文件
[root@server1 mfs]# cp mfsmaster.cfg.sample mfsmaster.cfg #主配置文件
[root@server1 mfs]# cp mfstopology.cfg.sample mfstopology.cfg #元数据日志文件
[root@server1 mfs]# cd /usr/local/mfs/var/mfs/
[root@server1 mfs]# cp metadata.mfs.empty metadata.mfs #master元数据文件
[root@server1 mfs]# chown -R mfs.mfs /usr/local/mfs //授权
[root@server1 mfs]# ln -s /usr/local/mfs/sbin/* /usr/local/bin/ //优化目录
[root@server1 mfs]# mfsmaster start //启动服务
open files limit has been set to: 16384
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmaster modules ...
exports file has been loaded
topology file has been loaded
loading metadata ...
master <-> metaloggers module: listen on *:9419
master <-> chunkservers module: listen on *:9420
main master server module: listen on *:9421
mfsmaster daemon initialized properly
[root@server1 mfs]# netstat -anpt | grep mfs //查看端口
tcp 0 0 0.0.0.0:9419 0.0.0.0:* LISTEN 1457/mfsmaster
tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 1457/mfsmaster
tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 1457/mfsmaster
编辑启动脚本
[root@server1 mfs]# echo "/usr/local/mfs/sbin/mfsmetalogger start" >> /etc/rc.d/rc.local
[root@server1 mfs]# chmod +x /etc/rc.d/rc.local
4.搭建Meta Logger Server(元数据日志服务器)
[root@server1 ~]# useradd -M -s /sbin/nologin mfs //创建进程用户
[root@server2 ~]# unzip moosefs-master.zip -d /opt //解压到/opt目录下
[root@server2 ~]# cd /opt/moosefs-master/
[root@server2 moosefs-master]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs //编译
[root@server2 moosefs-master]# make && make install //安装
[root@server2 mfs]# cp mfsmaster.cfg.sample mfsmaster.cfg
[root@server2 mfs]# cp mfsexports.cfg.sample mfsexports.cfg
[root@server2 mfs]# cp mfsmetalogger.cfg.sample mfsmetalogger.cfg
[root@server2 mfs]# cd /usr/local/mfs/var/mfs/
[root@server2 mfs]# cp metadata.mfs.empty metadata.mfs
[root@server2 mfs]# cd /usr/local/mfs/etc/mfs/
[root@server2 mfs]# vi mfsmetalogger.cfg //编辑配置文件
修改以下内容:
MASTER_HOST = 192.168.32.127 #执行master服务器的ip地址,去掉注释符号
META_DOWNLOAD_FREQ = 24 #备份频率时间
[root@server2 mfs]# chown -R mfs.mfs /usr/local/mfs //授权
[root@server2 mfs]# ln -s /usr/local/mfs/sbin/* /usr/local/bin/ //优化目录
[root@server2 mfs]# mfsmetalogger start //启动服务
open files limit has been set to: 4096
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmetalogger modules ...
mfsmetalogger daemon initialized properly
[root@server2 mfs]# netstat -anpt | grep mfsmetalogger //查看端口
tcp 0 0 192.168.32.128:33614 192.168.32.127:9419 ESTABLISHED 9068/mfsmetalogger
[root@server2 mfs]# echo "/usr/local/mfs/sbin/mfsmetalogger start" >> /etc/rc.d/rc.local
[root@server2 mfs]# chmod +x /etc/rc.d/rc.local
5.搭建Chunk Server(三台Chunk Server主机搭建步骤相同)
安装数据服务器(chunkservers),这些机器的磁盘上要有适当的剩余空间,而且操作系统要遵循POSIX标准 ,chunkserver存储数据时,是在一个普通的文件系统如ext4上存储数据块或碎片(chunks/fragments)作为文件。你在chunkserver上看不到完整的文件。
[root@server3 ~]# useradd -M -s /sbin/nologin mfs //创建进程用户
[root@server3 ~]# unzip moosefs-master.zip -d /opt //解压到/opt目录下
[root@server3 ~]# cd /opt/moosefs-master/
[root@server3 moosefs-master]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs //编译
[root@server3 moosefs-master]# make && make install //安装
[root@server3 moosefs-master]# cd /usr/local/mfs/etc/mfs/
[root@server3 mfs]# cp mfschunkserver.cfg.sample mfschunkserver.cfg
[root@server3 mfs]# cp mfshdd.cfg.sample mfshdd.cfg
[root@server3 mfs]# vi mfschunkserver.cfg
修改以下内容:
MASTER_HOST = 192.168.32.127 #指向master服务器的ip地址,去掉注释符号
[root@server3 mfs]#vi mfshdd.cfg //编辑配置文件
添加一行:
/data #这是一个给MFS的分区,最好使用独立的分区,或者磁盘挂载到此目录下
[root@server3 ~]# mkdir /data //创建/data目录
[root@server3 ~]# chown -R mfs:mfs /data/ //授权
[root@server3 ~]# chown -R mfs.mfs /usr/local/mfs //授权
[root@server3 ~]# ln -s /usr/local/mfs/sbin/* /usr/local/bin/
[root@server3 ~]# mfschunkserver start //启动服务
open files limit has been set to: 16384
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
setting glibc malloc arena max to 4
setting glibc malloc arena test to 4
initializing mfschunkserver modules ...
hdd space manager: path to scan: /data/
hdd space manager: start background hdd scanning (searching for available chunks)
main server module: listen on *:9422
no charts data file - initializing empty charts
mfschunkserver daemon initialized properly
[root@server3 ~]# netstat -anpt | grep mfschunkserver //查看端口
tcp 0 0 0.0.0.0:9422 0.0.0.0:* LISTEN 9850/mfschunkserver
tcp 0 0 192.168.32.132:42066 192.168.32.127:9420 ESTABLISHED 9850/mfschunkserver
[root@server3 ~]# echo "/usr/local/mfs/sbin/mfschunkserver start" >> /etc/rc.d/rc.local
[root@server3 ~]# chmod +x /etc/rc.d/rc.local
6.配置Client(客户端)
[root@server6 ~]# useradd -M -s /sbin/nologin mfs //创建进程用户
[root@server6 ~]# unzip moosefs-master.zip -d /opt //解压到/opt目录下
[root@server6 ~]# cd /opt/moosefs-master/
[root@server6 moosefs-master]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --enable-mfsmount //编译
[root@server6 moosefs-master]# make && make install //安装
[root@server6 moosefs-master]# ln -s /usr/lcoal/mfs/bin/* /usr/local/bin
[root@server6 ~]# mkdir /opt/mfs #创建挂载点
[root@server6 ~]# tar zxf fuse-2.9.2.tar.gz -C /usr/src
[root@server6 ~]# cd /usr/src/fuse-2.9.2/
[root@server6 fuse-2.9.2]# ./configure && make && make install
[root@server6 moosefs-master]# mkdir /opt/mfs
[root@server6 ~]# vim /etc/profile
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH #末尾添加
[root@server6 ~]# source /etc/profile
[root@localhost ~]# modprobe fuse # 加载fuse到内核
[root@localhost ~]# ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
[root@localhost ~]# mfsmount /opt/mfs -H 192.168.1.10 //将挂载点挂载到master主机,回映射到根目录
[root@localhost ~]# df -hT | grep mfs //查看挂载点
192.168.32.127:9421 fuse.mfs 83G 0 83G 0% /opt/mfs
7.在Master主机上启动监控
[root@server1 ~]# mfscgiserv
8.访问http://192.168.32.127:9425
三、MFS的应用
1.文件备份
[root@server6 ~]# cd /opt/mfs
[root@server6 mfs]# mkdir data1 //创建测试文件目录
[root@server6 mfs]# mkdir data2
[root@server6 mfs]# mfsgetgoal data1/#若报错可以退出这个目录重新进,然后再新建
data1/: 2
[root@server6 mfs]# mfsgetgoal data2/ //表示俩个目录都保存了俩份
data2/: 2
[root@server6 mfs]# mfssetgoal -r 1 data1/ //将备份数改为了一份
data1/:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
现在可以看到data1已经保存为1份,开始拷贝测试文件。
[root@server6 mfs]# mfsgetgoal data1/
data1/: 1
[root@server6 mfs]# mfsgetgoal data2/
data2/: 2
[root@server6 mfs]# cp /etc/passwd data1/
[root@server6 mfs]# cp /etc/fstab data2/
[root@server6 mfs]# mfsfileinfo data1/passwd //查看拷贝文件信息
data1/passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 192.168.32.130:9422 (status:VALID)
[root@server6 mfs]# mfsfileinfo data2/fstab
data2/fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 192.168.32.131:9422 (status:VALID)
copy 2: 192.168.32.132:9422 (status:VALID)
现在就可以发现data1在server3 data2在server4 server5里
我们把server3关闭访问data1,会发现 访问失败。
[root@server3 ~]# chunkserver stop
[root@server6 mfs]# mfsfileinfo data1/passwd
data1/passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
no valid copies !!!
接下来进行切分的实验,默认chunk的大小为64M,当文件大于64M时会进行切分:
[root@server6 mfs]# cd data1/
[root@server6 data1]# dd if=/dev/zero of=bigfile bs=1M count=100 #在data1中新建一个100M的文件
记录了100+0 的读入
记录了100+0 的写出
104857600字节(105 MB)已复制,1.16746 秒,89.8 MB/秒
[root@server6 data1]# mfsfileinfo bigfile //查看这个文件的信息
bigfile:
chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
copy 1: 192.168.32.131:9422 (status:VALID)
chunk 1: 0000000000000004_00000001 / (id:4 ver:1)
copy 1: 192.168.32.130:9422 (status:VALID)
可以看出被切分成两个chunk,这样就可以保证写入和读取的速度,这也就是分布式文件系统的意义。
2.数据恢复
[root@server6 data1]# mfsgettrashtime . //86400秒即24小时
.: 86400
[root@server6 data1]# ls
bigfile passwd
[root@server6 data1]# rm -rf passwd //删除文件
[root@server6 opt]# mkdir mfsmeta //建立元数据挂载目录
[root@server6 opt]# cd
[root@server6 ~]# mfsmount -m /opt/mfsmeta/
mfsmaster accepted connection with parameters: read-write,restricted_ip
[root@server6 ~]# cd /opt/mfsmeta/
[root@server6 mfsmeta]# ls
sustained trash
[root@server6 mfsmeta]# find -name *passwd* //查找删除的文件
./trash/004/00000004|data1|passwd
[root@server6 mfsmeta]# cd trash/
[root@server6 trash]# cd 004
[root@server6 004]# ls
00000004|data1|passwd undel
[root@server6 004]# mv 00000004\|data1\|passwd undel/ #恢复数据需要将删除的文件移动到undel目录中
[root@server6 004]# cd /opt/mfs/data1/
[root@server6 data1]# ls //此时数据已经恢复了
bigfile passwd
[root@server6 data1]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
mfs:x:1000:1000::/home/mfs:/sbin/nologin