MFS分布式文件系统
一、MFS概述:
MooseFS(moose 驼鹿)是一款网络分布式文件系统。它把数据分散在多台服务器上,但对于用户来讲,看到的只是一个源。MFS也像其他类unix文件系统一样,包含了层级结构(目录树),存储着文件属性(权限,最后访问和修改时间),可以创建特殊的文件(块设备,字符设备,管道,套接字),符号链接,硬链接。
MooseFS[MFS]是一个具有容错性的网络分布式文件系统。它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。
http://www.moosefs.org/reference-guide.html //安装和帮助文档
当我们存储服务器的容量达到瓶颈之后,那我们就需要采用分布式的文件系统来扩大存储容量,类似与百度云的存储,也是采用分布式存储!
2.MFS的特征
1:层析结构(目录树)
2:存储文件属性(权限,访问和修改时间)
3:支持特殊文件(块设备,字符设备,管道)
4:符号链接,软硬链接
5:对文件系统访问可以通过IP地址或者密码进行访问限制
6:高可靠(数据的多个拷贝存储在不同的计算机上)
7:通过附加新的计算机或者硬盘可以实现容量的动态拓展
8:删除文件可以根据一个可配置的时间周期进行保留
9:不受访问和写入影响的文件连贯快照
3.应用场景
谈及MooseFS的应用场景,其实就是去谈分布式文件系统的应用场景。
1)大规模高并发的数据存储及访问(小文件、大文件),
2)大规模的数据处理,如日志分析
二、MFS分布式文件系统部署方案
MooseFS 是一种分布式文件系统,MooseFS 文件系统结构包括以下四种角色:
1、管理服务器 managing server (master):
负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝
2、元数据日志服务器 Metalogger server(Metalogger):
负责备份 master 服务器的变化日志文件,文件类型为 changelog_ml.*.mfs,以便于在 master server 出问题的时候接替其进行工作
3、数据存储服务器 data servers (chunk servers ) :
听从管理服务器调度,提供存储空间,并为客户提供数据传输.。 真正存储用户数据的服务器。存储文件时,首先把文件分成块,然后这些块在数据服务器 chunkserver之间复 制(复制份数可以手工指定,建议设置副本数为 3)。数据服务器可以是多个,并且数量越多,可使用的“磁盘空间”越大,可靠性也越高。
4、客户机挂载使用 client computers :
客户端挂载远程mfs服务器共享出的存储并使用。 通过 fuse 内核接口挂载进程管理服务器上所管理的数据存储服务器共享出的硬盘。 共享的文件系统的用法和 nfs 相似。 使用 MFS 文件系统来存储和访问的主机称为 MFS 的客户端,成功挂接 MFS 文件系统以后,就可以像以前使用 NFS 一样共享这个虚拟性的存储了。
1. 系统部署方案
2. 内部运行机制
1:客户端请求访问存储,请求发送到了MFS Master
2:MFS Master根据我们的请求,查询所需要的文件分布在那些服务器上
3:客户端直接和存储服务器进行数据存储和读写
3. 端口关系图
端口号:
9420 : MFS master和MFS chunck通信端口
9421 : MFS master和MFS Client端通信端口
9419 : MFS master和MFS metalogger端通信端口
9422 : MFS chunck 和MFS Client端通信端口
9425 : MFS master web界面监听端口,查看整体运行状态
主机名 | IP地址 | 系统 | 角色 |
master | 192.168.1.220 | CentOS Linux release 7.4.1708 (Core) | 管理服务器 |
metalogger | 192.168.1.221 | CentOS Linux release 7.4.1708 (Core) | 元数据日志服务器 |
chunk_server01 | 192.168.1.222 | CentOS Linux release 7.4.1708 (Core) | 数据存储服务器 |
chunk_server02 | 192.168.1.205 | CentOS Linux release 7.4.1708 (Core) | 数据存储服务器 |
node | 192.168.1.227 | CentOS Linux release 7.4.1708 (Core) | 客户机挂载使用 |
master服务器
[root@master ~]# tar xf moosefs-3.0.84-1.tar.gz [root@master ~]# cd moosefs-3.0.84 [root@master moosefs-3.0.84]# useradd -s /sbin/nologin -M mfs [root@master ~]# yum install rpm-build gcc gcc-c++ fuse-devel zlib-devel -y [root@master moosefs-3.0.84]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs [root@master moosefs-3.0.84]# make && make install [root@master var]# cd /usr/local/mfs/share/mfscgi [root@master mfscgi]# cd ../../var [root@master var]# ls mfs /usr/local/mfs/var/mfs 存储云数据信息的持久化目录 [root@master mfs]# cd ../.. [root@master mfs]# ls bin etc sbin share var [root@master mfs]# cd etc [root@master etc]# cd mfs [root@master mfs]# ls mfschunkserver.cfg.sample mfsexports.cfg.sample mfshdd.cfg.sample mfsmaster.cfg.sample mfsmetalogger.cfg.sample mfsmount.cfg.sample mfstopology.cfg.sample [root@master mfs]# chown -R mfs:mfs /usr/local/mfs [root@master mfs]# ln -s /usr/local/mfs/bin/* /usr/local/bin/ [root@master mfs]# ln -s /usr/local/mfs/sbin/* /usr/local/sbin/ [root@master mfs]# cp -a mfsmaster.cfg.sample mfsmaster.cfg [root@master mfs]# cp -a mfsexports.cfg.sample mfsexports.cfg [root@master mfs]# vi mfsexports.cfg 增加 192.168.1.0/24 . rw,alldirs,maproot=0
mfsexports.cfg 文件每一条由三部分组成, 第一部分表示客户端的 IP 地址, 第二部分表示被挂接的目录, 第三部分表示客户端拥有的权限,下面对三给部分迚行解释 1.客户端 IP 地址 * 所有 IP 地址 x.x.x.x 单个 IP 地址 x.x.x.x/m.m.m.m IP 网络地址/子网掩码 f.f.f.f-t.t.t.t IP 段 2.被挂载的目录 / 表示 MooseFS 的根 . 表示 MFSMETA 文件系 3.客户端拥有的权限 ro 只读 rw 读写 alldirs 允许挂载任何指定的子目录 maproot 映射为 root 用户还是指定的用户 password 指定客户端密码
[root@master mfs]# cd ../../var/mfs/ [root@master mfs]# cp -a metadata.mfs.empty metadata.mfs [root@master mfs]# mfsmaster start #启动
[root@master mfs]# mfscgiserv start
lockfile created and locked
starting simple cgi server (host: any , port: 9425 , rootpath: /usr/local/mfs/share/mfscgi)
浏览器端访问
http://192.168.1.220:9425/mfs.cgi Input your DNS master name: 192.168.1.220(主服务器的地址) Try it!!!点击它。
metalogger服务器
[root@metalogger ~]# tar xf moosefs-3.0.84-1.tar.gz [root@metalogger ~]# cd moosefs-3.0.84 [root@metalogger moosefs-3.0.84]# useradd -s /sbin/nologin -M mfs [root@metalogger moosefs-3.0.84]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs [root@metalogger moosefs-3.0.84]# make && make install [root@metalogger moosefs-3.0.84]# chown -R mfs:mfs /usr/local/mfs [root@metalogger moosefs-3.0.84]# ln -s /usr/local/mfs/bin/* /usr/local/bin/ [root@metalogger moosefs-3.0.84]# ln -s /usr/local/mfs/sbin/* /usr/local/sbin/ [root@metalogger moosefs-3.0.84]# cd /usr/local/mfs/etc/mfs [root@metalogger mfs]# cp -a mfsmetalogger.cfg.sample mfsmetalogger.cfg [root@metalogger mfs]# vi mfsmetalogger.cfg 39 META_DOWNLOAD_FREQ = 2 52 MASTER_HOST = 192.168.1.220 [root@metalogger mfs]# mfsmetalogger start [root@metalogger mfs]# netstat -antp |grep :9419 tcp 0 0 192.168.1.221:33614 192.168.1.220:9419 ESTABLISHED 22096/mfsmetalogger
chunk_server02服务器
分区/dev/sdb
[root@chunk_server02 ~]# fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 Device does not contain a recognized partition table 使用磁盘标识符 0x82b580f3 创建新的 DOS 磁盘标签。 命令(输入 m 获取帮助):N Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): P 分区号 (1-4,默认 1):1 起始 扇区 (2048-41943039,默认为 2048):+5G Last 扇区, +扇区 or +size{K,M,G} (10485760-41943039,默认为 41943039):^C [root@chunk_server02 ~]# fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 Device does not contain a recognized partition table 使用磁盘标识符 0x5d8d656b 创建新的 DOS 磁盘标签。 命令(输入 m 获取帮助):N Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): P 分区号 (1-4,默认 1):1 起始 扇区 (2048-41943039,默认为 2048): 将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+5G 分区 1 已设置为 Linux 类型,大小设为 5 GiB 命令(输入 m 获取帮助):W The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盘。
[root@chunk_server02 ~]# partprobe /dev/sdb [root@chunk_server02 ~]# fdisk -l 磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x000c4950 设备 Boot Start End Blocks Id System /dev/sda1 * 2048 411647 204800 83 Linux /dev/sda2 411648 2459647 1024000 82 Linux swap / Solaris /dev/sda3 2459648 41943039 19741696 83 Linux 磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0x5d8d656b 设备 Boot Start End Blocks Id System /dev/sdb1 2048 10487807 5242880 83 Linux
[root@chunk_server02 ~]# mkfs.ext4 /dev/sdb1 [root@chunk_server02 ~]# mkdir /mnt/mfs [root@chunk_server02 ~]# mount -t ext4 /dev/sdb1 /mnt/mfs [root@chunk_server02 ~]# echo "mount -t ext4 /dev/sdb1 /mnt/mfs" >> /etc/rc.local [root@chunk_server02 ~]# useradd -s /sbin/nologin -M mfs [root@chunk_server02 ~]# tar xf moosefs-3.0.84-1.tar.gz [root@chunk_server02 ~]# cd moosefs-3.0.84 [root@chunk_server02 moosefs-3.0.84]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs [root@chunk_server02 moosefs-3.0.84]# make && make install [root@chunk_server02 moosefs-3.0.84]# chown -R mfs:mfs /usr/local/mfs [root@chunk_server02 moosefs-3.0.84]# chown -R mfs:mfs /mnt/mfs [root@chunk_server02 moosefs-3.0.84]# ln -s /usr/local/mfs/bin/* /usr/local/bin/ [root@chunk_server02 moosefs-3.0.84]# ln -s /usr/local/mfs/sbin/* /usr/local/sbin/ [root@chunk_server02 moosefs-3.0.84]# cd /usr/local/mfs/etc/mfs [root@chunk_server02 mfs]# cp -a mfschunkserver.cfg.sample mfschunkserver.cfg [root@chunk_server02 mfs]# vi mfschunkserver.cfg MASTER_HOST = 192.168.1.220 MASTER_PORT = 9420 HDD_CONF_FILENAME = /usr/local/mfs/etc/mfs/mfshdd.cfg [root@chunk_server02 mfs]# cp -a mfshdd.cfg.sample mfshdd.cfg [root@chunk_server02 mfs]# vi mfshdd.cfg /mnt/mfs [root@chunk_server02 mfs]# mfschunkserver start
chunk_server01服务器
分区/dev/sdb
[root@chunk_server01 ~]# fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 Device does not contain a recognized partition table 使用磁盘标识符 0x1ae4b73a 创建新的 DOS 磁盘标签。 命令(输入 m 获取帮助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p 分区号 (1-4,默认 1):1 起始 扇区 (2048-41943039,默认为 2048): 将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+5G 分区 1 已设置为 Linux 类型,大小设为 5 GiB 命令(输入 m 获取帮助):w The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盘。
[root@chunk_server01 ~]# partprobe /dev/sdb [root@chunk_server01 ~]# mkfs.ext4 /dev/sdb1 mke2fs 1.42.9 (28-Dec-2013) 文件系统标签= OS type: Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 327680 inodes, 1310720 blocks 65536 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=1342177280 40 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Allocating group tables: 完成 正在写入inode表: 完成 Creating journal (32768 blocks): 完成 Writing superblocks and filesystem accounting information: 完成
[root@chunk_server01 ~]# mkdir /mnt/mfs [root@chunk_server01 ~]# mount -t ext4 /dev/sdb1 /mnt/mfs [root@chunk_server01 ~]# echo "mount -t ext4 /dev/sdb1 /mnt/mfs" >> /etc/rc.local [root@chunk_server01 ~]# useradd -s /sbin/nologin -M mfs [root@chunk_server01 ~]# tar xf moosefs-3.0.84-1.tar.gz [root@chunk_server01 ~]# cd moosefs-3.0.84 [root@chunk_server01 moosefs-3.0.84]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs && make && make install
[root@chunk_server01 moosefs-3.0.84]# chown -R mfs:mfs /usr/local/mfs [root@chunk_server01 moosefs-3.0.84]# chown -R mfs:mfs /mnt/mfs [root@chunk_server01 moosefs-3.0.84]# ln -s /usr/local/mfs/bin/* /usr/local/bin/ [root@chunk_server01 moosefs-3.0.84]# ln -s /usr/local/mfs/sbin/* /usr/local/sbin/ [root@chunk_server01 moosefs-3.0.84]# cd /usr/local/mfs/etc/mfs [root@chunk_server01 mfs]# cp -a mfschunkserver.cfg.sample mfschunkserver.cfg [root@chunk_server01 mfs]# vi mfschunkserver.cfg MASTER_HOST = 192.168.1.220 MASTER_PORT = 9420 HDD_CONF_FILENAME = /usr/local/mfs/etc/mfs/mfshdd.cfg
[root@chunk_server01 mfs]# cp -a mfshdd.cfg.sample mfshdd.cfg [root@chunk_server01 mfs]# vi mfshdd.cfg /mnt/mfs [root@chunk_server01 mfs]# mfschunkserver start
node服务器
[root@node ~]# tar xf moosefs-3.0.84-1.tar.gz [root@node ~]# cd moosefs-3.0.84 [root@node moosefs-3.0.84]# useradd -s /sbin/nologin -M mfs [root@node moosefs-3.0.84]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-defaul-group=mfs --disable-mfsmaster --disable-mfschunkservert && make && make install [root@node moosefs-3.0.84]# chown -R mfs:mfs /usr/local/mfs [root@node moosefs-3.0.84]# ln -s /usr/local/mfs/bin/* /usr/local/bin/ [root@node moosefs-3.0.84]# ln -s /usr/local/mfs/sbin/* /usr/local/sbin/ [root@node moosefs-3.0.84]# mkdir /mfs [root@node moosefs-3.0.84]# chown -R mfs:mfs /mfs [root@node moosefs-3.0.84]# mfsmount /mfs/ -H 192.168.1.220 mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
测试
[root@node moosefs-3.0.84]# cd /mfs/ [root@node mfs]# vi index.html iiidjsldfjksdjf [root@node mfs]# mfsfileinfo index.html index.html: chunk 0: 0000000000000002_00000001 / (id:2 ver:1) copy 1: 192.168.1.205:9422 (status:VALID) copy 2: 192.168.1.222:9422 (status:VALID)
修改goal值
[root@node mfs]# mfssetgoal 1 index.html index.html: goal: 1 [root@node mfs]# mfsfileinfo index.html index.html: chunk 0: 0000000000000002_00000001 / (id:2 ver:1) copy 1: 192.168.1.205:9422 (status:VALID) [root@node mfs]# mfssetgoal 2 index.html #还原成两份。 index.html: goal: 2 [root@node mfs]# mfsfileinfo index.html index.html: chunk 0: 0000000000000002_00000001 / (id:2 ver:1) copy 1: 192.168.1.205:9422 (status:VALID) copy 2: 192.168.1.222:9422 (status:VALID) [root@node mfs]# mkdir abc #快照 [root@node mfs]# chown mfs:mfs abc/ [root@node mfs]# mfsmakesnapshot index.html abc/ [root@node mfs]# cd abc/ [root@node abc]# cat index.html iiidjsldfjksdjf
指针。
a=123 123是要存储在内存中的,a=123就是a是个指针指向123的内存地址,如果b=a,也b这个指针指向123的内存地址。没有任何指针指向123那就是垃圾数据会销毁。
[root@node abc]# mfsgettrashtime index.html index.html: 86400 [root@node abc]# cd .. [root@node mfs]# vi 1.txt 1111111111111111111111111 [root@node mfs]# mfsgettrashtime 1.txt 1.txt: 86400 (单位是秒,最低是0,) [root@node mfs]# mfssettrashtime 60000 1.txt 1.txt: 60000 [root@node mfs]# rm -rf 1.txt 找回1.txt文件 [root@node mfs]# mkdir /back [root@node mfs]# chown mfs:mfs /back [root@node mfs]# mfsmount -m /back -H 192.168.1.220 mfsmaster accepted connection with parameters: read-write,restricted_ip [root@node mfs]# cd /back [root@node back]# ls sustained trash [root@node back]# cd trash/ [root@node trash]# find . -name "*1.txt" ./00D/0000000D|1.txt ./011/00000011|1.txt [root@node trash]# mv "00D/0000000D|1.txt" /back/trash/undel/
master主服务器的元数据
[root@master ~]# cd /usr/local/mfs/var/mfs/ [root@localhost mfs]# ls changelog.0.mfs changelog.1.mfs changelog.2.mfs changelog.3.mfs metadata.mfs.back metadata.mfs.back.1 stats.mfs [root@master mfs]# ls changelog.0.mfs changelog.1.mfs changelog.2.mfs changelog.3.mfs metadata.mfs.back metadata.mfs.back.1 stats.mfs [root@master mfs]# rm -rf * [root@master mfs]# mfsmaster stop [root@master mfs]# mfsmaster start #数据又回来了。
logserver服务器(有元数据的备份,如果master服务器丢失元数,可以从这里拷贝)
[root@metalogger mfs]# cd /usr/local/mfs/var/mfs/ [root@localhost mfs]# ls changelog_ml.0.mfs changelog_ml_back.0.mfs changelog_ml_back.1.mfs metadata_ml.mfs.back metadata_ml.mfs.back.1 metadata_ml.mfs.back.2 metadata_ml.mfs.back.3 [root@metalogger mfs]# scp * root@192.168.1.202:/usr/local/mfs/var/mfs/ The authenticity of host '192.168.1.202 (192.168.1.202)' can't be established. RSA key fingerprint is 84:11:67:b0:d1:38:26:f4:90:0a:aa:f2:3b:1f:e8:bc. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.1.202' (RSA) to the list of known hosts. root@192.168.1.202's password: changelog_ml.0.mfs 100% 380 0.4KB/s 00:00 changelog_ml_back.0.mfs 100% 478 0.5KB/s 00:00 changelog_ml_back.1.mfs 100% 3210 3.1KB/s 00:00 metadata_ml.mfs.back 100% 4122 4.0KB/s 00:00 metadata_ml.mfs.back.1 100% 2915 2.9KB/s 00:00 metadata_ml.mfs.back.2 100% 2915 2.9KB/s 00:00 metadata_ml.mfs.back.3 100% 2915 2.9KB/s 00:00