Moosefs分布式文件系统

一、Moosefs简介

1. 简介

MooseFS是一个具备冗余容错功能的分布式网络文件系统,它将数据分别存放在多个物理服务器或单独磁盘或分区上,确保一份数据有多个备份副本。对于访问的客户端或者用户来说,整个分布式网络文件系统集群看起来就像一个资源一样。MooseFS具有找回误删除的文件功能,相当于一个回收站,支持在线扩容,并进行横向扩展。对海量小文件的读写比对大文件的读写效率高的多。缺点是MFS的主备架构情况类似于Mysql的主从复制,从可以扩展,主却不易扩展。

2.各个组件

MooseFS文件系统主要由四大组件构成,分别为管理服务器、元数据日志服务器、数据存储服务器、客户端,相关解释如下:

  • 管理服务器(Master Server)
    这个组件的角色是管理整个mfs文件系统的主服务器,除了分发用户请求外,还用来存储整个文件系统中的每个数据文件的metadata信息,metadata(元数据)信息包括文件(也可以是目录、socket、管道、设备等)的大小、属性、文件位置路径等,以及文件空间的回收和恢复,控制多chunk server节点的数据拷贝。很类似lvs负载均衡主服务器,不同的是lvs仅仅根据算法分发请求,而master根据内存里的metadata信息来分发请求。这个master只能有一台处于激活工作的状态。
  • 元数据日志服务器(metalogger Server)
    作用是备份管理服务器master的变化的metadata信息日志文件,文件类型为changelog_ml.*.mfs,以便于在主服务器出现问题的时候,可以经过简单的操作即可让新主服务器进行工作。这很类似Mysql的主从同步,只不过他不像mysql从库那样在本地应用数据,而只是接收主服务器上文件写入时记录的文件相关的metadata信息。这个backup可以有一台或多台,它很类似于lvs从负载均衡器。
  • 数据存储服务器(Chunk Servers)
    存放数据文件实体的服务器了,这个角色可以有多台不同的物理服务器或不同的磁盘及分区来充当,当配置数据的副本多于一份时,剧写入到一个数据服务器后,会根据算法在其他数据服务器上进行同步备份。
  • 客户端(Client)
    挂载并使用mfs文件系统的客户端,当读写文件时,客户端首先连接主管理服务器获取数据的metadata信息,然后根据得到的metadata信息,访问数据服务器读取或写入文件实体。mfs客户端通过FUSE mechanism实现挂载MFS文件系统的。因此,只要系统支持FUSE,就可以作为客户端访问MFS整个文件系统。所谓的客户端并不是网站用户,而是前端访问文件系统的应用服务器,如web。

3.读写工作原理

在这里插入图片描述
在这里插入图片描述

二、MFS的部署安装

官网地址:https://moosefs.com/download/
根据官网提示,首先配置好yum源,接下来在三台虚拟机上安装软件

1.yum源配置:
[root@node5 ~]# curl "http://ppa.moosefs.com/MooseFS-3-el7.repo" > /etc/yum.repos.d/MooseFS.repo  #配置好yum源,各节点均配置好yum源
2.本地解析:
[root@node5 ~]# vim /etc/hosts#各节点给master写好解析,mfsmaster
3.各节点软件安装:
[root@node5 yum.repos.d]# yum install moosefs-master moosefs-cgi moosefs-cgiserv moosefs-cli #安装master,监控cgi,客户端软件
[root@node6 ~]# yum install moosefs-chunkserver -y  #node6当数据存储服务器
[root@node7 ~]# yum install moosefs-client -y  #node7当客户端
4.主节点node5服务的开启:
[root@node5 yum.repos.d]# systemctl start moosefs-master
[root@node5 yum.repos.d]# systemctl start moosefs-cgiserv  
[root@node6 ~]# systemctl start moosefs-chunkserver  #node6的chunk服务开启必须在配置文件写挂载的磁盘
5.chunk节点node6服务的开启:
[root@node6 ~]# mkdir -p /mnt/chunk1/  
[root@node6 ~]# vim /etc/mfs/mfshdd.cfg  #在文件中添加磁盘目录
	/mnt/chunk1
[root@node6 ~]# cd /mnt/
[root@node6 mnt]# ll
total 0
drwxr-xr-x 2 root root 6 Mar 18 17:13 chunk1
[root@node6 mnt]# chown mfs.mfs chunk1/   #更改权限
[root@node6 mnt]# ll
total 0
drwxr-xr-x 2 mfs mfs 6 Mar 18 17:13 chunk1
接下来给node6添加磁盘并初始挂载
[root@node6 ~]# systemctl start moosefs-chunkserver  #开启服务
6.chunk节点node8的开启:
node8没有新建磁盘,那么挂载默认根目录。
[root@node8 yum.repos.d]#  yum install moosefs-chunkserver -y
[root@node8 yum.repos.d]# cd /etc/mfs/
[root@node8 mfs]# ls
mfschunkserver.cfg  mfschunkserver.cfg.sample  mfshdd.cfg  mfshdd.cfg.sample
[root@node8 mfs]# mkdir /mnt/chunk2
[root@node8 mfs]# vim mfshdd.cfg
   /mnt/chunk2
[root@node8 mfs]# chown mfs.mfs /mnt/chunk2/  #更改权限,否则启动报错
[root@node8 mfs]# systemctl start moosefs-chunkserver

7.node7客户端:
[root@node7 ~]# mkdir /mnt/mfs  #建立挂载目录
[root@node7 ~]# cd /etc/mfs/
[root@node7 mfs]# ls
mfsmount.cfg  mfsmount.cfg.sample
[root@node7 mfs]# vim mfsmount.cfg  #写挂载目录路径
    /mnt/mfs
[root@node7 mfs]# mfsmount   #挂载命令
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
[root@node7 mfs]# ping mfsmaster  #测试解析是否通
PING node5 (172.25.7.135) 56(84) bytes of data.
64 bytes from node5 (172.25.7.135): icmp_seq=1 ttl=64 time=0.831 ms

[root@node7 mfs]# df    #查看是否挂载成功
Filesystem            1K-blocks    Used Available Use% Mounted on
/dev/mapper/rhel-root  17811456 1165400  16646056   7% /
devtmpfs                 495428       0    495428   0% /dev
tmpfs                    507512       0    507512   0% /dev/shm
tmpfs                    507512    6836    500676   2% /run
tmpfs                    507512       0    507512   0% /sys/fs/cgroup
/dev/sda1               1038336  135208    903128  14% /boot
tmpfs                    101504       0    101504   0% /run/user/0
mfsmaster:9421         10474496  295296  10179200   3% /mnt/mfs

[root@node7 mfs]# cd /mnt/mfs/
[root@node7 mfs]# mfsgetgoal data1/  #查看备份了几份,默认是两份
data1/: 2
[root@node7 mfs]# cd data1/
[root@node7 data1]# cp /etc/passwd . #客户端复制一个文件
[root@node7 data1]# mfsfileinfo passwd   #查看此文件被备份的节点
passwd:
	chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
		copy 1: 172.25.7.136:9422 (status:VALID)
		copy 2: 172.25.7.138:9422 (status:VALID)

在这里插入图片描述
node:各端口开放
在这里插入图片描述
在这里插入图片描述
给node6添加一块磁盘,创建挂载目录并写入配置文件:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

三、部分小知识

1.chunk默认大小64M
chunkserver服务器节点默认每个chunk是64M,如果客户端建立的文件超过64M,则会在数据节点分布存储。

eg1:
客户端dd命令建立一个100M的文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
读取的时候,前64M如果从node6上读取,后36M则从node8上读取,这样读取的速度快。

2.MASTER存储的是文件或者目录的数量,与大小无关,master节点300~350MB内存可以存1亿个目录或者文件。内存越大,数量越多。

  • leader master RAM usage:20 G (21017505792 Byte exactly)
  • All FS objects(from MFS CGI):67552270
  • 21017505792/67552270=~311.13 Byte
  1. 命令行数据的恢复
客户端删除了数据: rm -rf /mnt/mfs/data1/passwd
恢复:
root@node7 data1]# mkdir /mnt/meta
[root@node7 data1]# mfsmount -m /mnt/meta/  #将mstart的源数据挂载到/mnt/meta目录
mfsmaster accepted connection with parameters: read-write,restricted_ip
[root@node7 data1]# cd /mnt/meta/
[root@node7 meta]# ls
sustained  trash
[root@node7 meta]# cd trash/
[root@node7 trash]# find -name *passwd*  #查找刚才删除的文件
./003/00000003|data1|passwd
[root@node7 trash]# cd 003/
[root@node7 003]# ls
00000003|data1|passwd  undel
[root@node7 003]# cd undel/
[root@node7 undel]# ls
[root@node7 undel]# cd ..
[root@node7 003]# mv 00000003\|data1\|passwd undel/  #将文件移动到undel目录里即可
[root@node7 003]# cd /mnt/mfs/data1/
[root@node7 data1]# ls   #再次去查看,已恢复出来
file2  passwd

4.chunk数据存储节点只要有一个存活,就不影响客户端度数据,若chunk节点全部down掉,客户端就看不到数据了。
在这里插入图片描述

四、存储类

实验环境:

node5master
node6chunk数据节点
node7chunk数据节点,client客户端
node8chunk数据节点
node9chunk数据节点
1)所有chunk节点建立/mnt/chunk目录,写进/etc/mfs/mfshdd.cfg,修改/mnt/chunk的权限为mfs,并开启服务。
node6:/mnt/chunk1
node8:/mnt/chunk2
node7:/mnt/chunk3
node9:/mnt/chunk4
chown mfs.mfs /mnt/chunk  #各chunk节点均需修改权限
systemctl start moosefs-chunkserve  #启动服务2)各节点建立标签
vim /etc/mfs/mfschunkserver.cfg
对于node6和node8:
LABELS = A
对于node7和node9:
LABELS = B
systemctl reload moosefs-chunkserver.service   重新加载服务

查看建立的标签:
在这里插入图片描述
默认情况下,客户端的数据备份是随机存储与chunk节点的:
在这里插入图片描述
在这里插入图片描述
建立标签:

[root@node7 data1]# mfsscadmin create 2A class2A #2A=A,A表示复制两份,两份都在标签为A的数据服务器上,后面的class2A表示类的名字
storage class make class2A: ok
[root@node7 data1]# mfsscadmin create 2B class2B
storage class make class2B: ok

将数据挂载目录/mnt/mfs/下的各目录划分标签备份:

[root@node7 mfs]# mfssetsclass -r class2A data1/  #将data1目录下的文件全部备份到类class2A标签中。。  -r表示递归
data1/:
 inodes with storage class changed:              4
 inodes with storage class not changed:          1
 inodes with permission denied:                  0

在这里插入图片描述
备份到哪个标签也能改:
创建新的标签:mfsscadmin create A,B classA,B #建立名为classA,B的标签,存储两份,A,B各一份
[root@node7 mfs]# mfssetsclass classA,B data1/ -r #将目录data1的标签改为classAB,必须得加-r参数,递归。如果目录里面不是空的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)固态存储转硬盘上
给A标签的两个节点加上标签S和H,S模仿固态,H 模仿硬盘。AB代表两个机房
vim /etc/mfs/mfschunkserver.cfg
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
改完标签后全部重新加载服务
systemctl start moosefs-chunkserver.service
查看web页面改的标签已生效:
在这里插入图片描述
建立两个标签:

mfsscadmin create AH,BH  classAHBH
mfsscadmin create AS,BS  classASBS

建立目录data3:

mkdir /mnt/mfs/data3

给目录定个固态标签:

[root@node7 mfs]# mfssetsclass classASBS data3/
data3/: storage class: 'classASBS'
写入文件:
[root@node7 mfs]# echo hh > data3/file1 
[root@node7 mfs]# echo hh > data3/file2
[root@node7 mfs]# echo hh > data3/file3

在这里插入图片描述
数据迁移到机械硬盘上:

[root@node7 mfs]# mfsxchgsclass -r classASBS classAHBH data3/
data3/:
 inodes with storage class changed:              4
 inodes with storage class not changed:          0
 inodes with permission denied:                  0

在这里插入图片描述
如果想要快速迁移成功,则更新一下文件即可。

在这里插入图片描述
在这里插入图片描述
(3)特定天数后固态转硬盘

创建标签:
[root@node7 mfs]# mfsscadmin create -C 2AS -K AS,BS -A AH,BH -d 7 important  #-C创建哪里,-K备份到哪里,-A 迁移到哪里,-d 几天迁移
[root@node7 mfs]# mkdir data4  #新建目录
[root@node7 mfs]# mfssetsclass important data4/ #将新建目录data4设置标签important
data4/: storage class: 'important'
[root@node7 mfs]# echo hh > data4/file1
[root@node7 mfs]# echo hh > data4/file2
[root@node7 mfs]# echo hh > data4/file3
[root@node7 mfs]# mfsfileinfo data4/*
data4/file1:
	chunk 0: 000000000000001A_00000001 / (id:26 ver:1)
		copy 1: 172.25.7.136:9422 (status:VALID)
		copy 2: 172.25.7.137:9422 (status:VALID)
data4/file2:
	chunk 0: 000000000000001B_00000001 / (id:27 ver:1)
		copy 1: 172.25.7.136:9422 (status:VALID)
		copy 2: 172.25.7.137:9422 (status:VALID)
data4/file3:
	chunk 0: 000000000000001C_00000001 / (id:28 ver:1)
		copy 1: 172.25.7.136:9422 (status:VALID)
		copy 2: 172.25.7.137:9422 (status:VALID)

在这里插入图片描述

五、master的高可用

实验环境:

node5:172.25.7.135master主节点
node9:712.25.7.139master备用节点
node6:172.25.7.136chunk数据节点
node8:172.25.7.138chunk数据节点
node7:172.25.7.137client客户端节点

(1)node5:master主节点与备用节点node9做个免密

[root@node5 mfs]# ssh-keygen    #一路回车
[root@node5 ~]# ssh-copy-id node9  #发给node9备用节点
[root@node5 ~]# ssh node9  #测验一下是否免密
Last login: Thu Mar 19 16:18:09 2020 from 172.25.7.130
[root@node9 ~]# logout
Connection to node9 closed.

(2)给yum源加个高可用
在这里插入图片描述
(3)安装软件

[root@node5 yum.repos.d]# yum install -y pcs psmisc policycoreutils-python  
[root@node5 yum.repos.d]# ssh node9 yum install -y pcs psmisc policycoreutils-python  #给node9备用节点也装上

开启服务:
[root@node5 ~]# systemctl start pcsd.service  #给主节点node5开启服务
[root@node5 ~]# systemctl enable pcsd.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/pcsd.service to /usr/lib/systemd/system/pcsd.service.
[root@node5 ~]# ssh node9 systemctl start pcsd.service  #给备用节点node9开启
[root@node5 ~]# ssh node9 systemctl enable pcsd.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/pcsd.service to /usr/lib/systemd/system/pcsd.service.

(4)修改密码

[root@node5 ~]# passwd hacluster   #设置密码westos
Changing password for user hacluster.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@node5 ~]# ssh node9 'echo westos | passwd --stdin hacluster'  #远程给node9设置密码
Changing password for user hacluster.
passwd: all authentication tokens updated successfully.

(5)做认证,创建集群

[root@node5 ~]# pcs cluster auth node5 node9  #用户认证
Username: hacluster
Password: 
node9: Authorized
node5: Authorized

[root@node5 ~]# pcs cluster setup --name mycluster node5 node9 #启动集群

设置开机自启:
[root@node5 ~]# systemctl enable corosync pacemaker
[root@node5 ~]# ssh node9 systemctl enable corosync pacemaker
启动所有集群:
[root@node5 yum.repos.d]# pcs cluster start --all

在这里插入图片描述
在这里插入图片描述
(6)还没有配置fence,先把fence给禁止掉
在这里插入图片描述
(7)vip资源的添加:
查看资源:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
添加资源:
在这里插入图片描述
在这里插入图片描述

[root@node5 mfs]# pcs resource create  ocf:heartbeat:IPaddr2 ip=172.25.7.150 op monitor interval=30s
添加完后给vip资源在node5上启动,ip addr可见新添加的vip 150,现在把node5的资源standby掉。
[root@node5 mfs]# pcs node standby  #此时node5上的vip已经不见了,跑到集群中另一个节点node9上

在这里插入图片描述
在这里插入图片描述
将node5上vip资源重新开启 ,vip也不会跑到node5上,它已经在node9上了,除非Node9也出状况了
在这里插入图片描述
将vip对应的解析写入文件,每个节点一份

在这里插入图片描述
(8)两个maser的资源共享
共享前将所有节点的master,chunk服务都关闭
利用isc进行共享,在node8(随便一块盘)新添加一块盘
在这里插入图片描述
由于磁盘空间不够,实际新添加了350M大小的磁盘:
给新建立的磁盘分区:
在这里插入图片描述

[root@node8 ~]# yum install -y  targetcli  
[root@node8 ~]# systemctl start target   #启动服务
[root@node8 ~]# targetcli 

给/dev/sdc磁盘添加到共享:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
node5和node9上下载issci-*,修改etc/iscsi/initiatorname.iscsi里的名字

[root@node5 mfs]# yum intall -y iscsi-*
[root@node9 mfs]# yum install -y iscsi-*
[root@node5 mfs]# vim /etc/iscsi/initiatorname.iscsi   #进去修改为自己刚在node8上创建的
	InitiatorName=iqn.2020-03.org.westos:client
[root@node5 mfs]# iscsiadm -m discovery -t st -p 172.25.7.138  #发现一下
172.25.7.138:3260,1 iqn.2020-03.org.westos:mydisk
[root@node9 mfs]# vim /etc/iscsi/initiatorname.iscsi 
[root@node9 mfs]# iscsiadm -m discovery -t st -p 172.25.7.138
172.25.7.138:3260,1 iqn.2020-03.org.westos:mydisk
[root@node5 mfs]# iscsiadm -m node -l   #登录一下
Logging in to [iface: default, target: iqn.2020-03.org.westos:mydisk, portal: 172.25.7.138,3260] (multiple)
Login to [iface: default, target: iqn.2020-03.org.westos:mydisk, portal: 172.25.7.138,3260] successful.

在这里插入图片描述
在这里插入图片描述
对网络过来的进行分区,最好分一个分区
在这里插入图片描述
格式化:
在这里插入图片描述

[root@node5 mfs]# mount /dev/sdb1 /mnt/
[root@node5 mfs]# ll -d .
drwxr-xr-x 2 mfs mfs 4096 Mar 20 11:29 .
[root@node5 mfs]# chown mfs.mfs /mnt   #给设备改权限
[root@node5 mfs]# cp -p * /mnt/  #将/var/lib/mfs目录下的所有数据复制到/mnt,也就是写到/dev/sdb1里
[root@node5 mfs]# umount /mnt/

在node9查看:
[root@node9 /]# mount /dev/sdb1 /var/lib/mfs/
[root@node9 /]# cd /var/lib/mfs/
[root@node9 mfs]# ls   #查看node5上的数据已经过来
changelog.10.mfs  changelog.13.mfs  changelog.1.mfs  changelog.5.mfs  changelog.8.mfs  metadata.mfs         stats.mfs
changelog.11.mfs  changelog.14.mfs  changelog.2.mfs  changelog.6.mfs  changelog.9.mfs  metadata.mfs.back.1
changelog.12.mfs  changelog.19.mfs  changelog.3.mfs  changelog.7.mfs  metadata.crc     metadata.mfs.empty
[root@node9 mfs]# systemctl start moosefs-master #测试一下,服务可以正常启动

(9)此时已有vip 资源,再在节点上加入文件系统和服务

[root@node5 mfs]# pcs resource create mfsdata ocf:heartbeat:Filesystem device=/dev/sdb1 directory=/var/lib/mfs/ fstype=xfs
[root@node5 mfs]# pcs resource create mfsmaster systemd:moosefs-master
[root@node5 mfs]# pcs status

在这里插入图片描述
再创建一个组,使三个资源处于同一个组

[root@node5 mfs]# pcs resource group add mfsgroup  vip mfsdata mfsmaster
[root@node5 mfs]# pcs status   #再次查看,处于同一个组

在这里插入图片描述
(10)fence机制
在真机上装fence-virtd的几个包

[root@localhost yum.repos.d]# rpm -qa | grep fence-virtd
fence-virtd-multicast-0.3.2-13.el7.x86_64   #多波,控制通信的
fence-virtd-0.3.2-13.el7.x86_64        #服务端
fence-virtd-serial-0.3.2-13.el7.x86_64
fence-virtd-libvirt-0.3.2-13.el7.x86_64  #连接libvirt,就是页面控制虚拟机

在真机上创建,更新一个key

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
[root@localhost yum.repos.d]# mkdir /etc/cluster #没有这个目录创建一个
更新一下key: 没有的话创建一个
[root@localhost cluster]# dd if=/dev/urandom of=/etc/cluster/fence_xvm.key bs=128 count=1
[root@localhost cluster]# ll /etc/cluster/fence_xvm.key
-rw-r–r--. 1 root root 128 Mar 21 12:50 /etc/cluster/fence_xvm.key

[root@localhost cluster]# systemctl restart fence_virtd.service #重启服务

这个key是做节点间的校验,不是谁都能随随便便连的

两个master节点没有设备:
在这里插入图片描述

[root@node5 mfs]# yum install -y fence-virt
[root@node5 mfs]# stonith_admin -I  #安装后就有了
 fence_xvm
 fence_virt
[root@node5 mfs]# ssh node9 yum install -y fence-virt

将真机上的key传到node5和node9上,node5和node9如果没有/etc/cluser目录,则需自己创建。为啥是这个目录。
[root@node5 mfs]# stonith_admin -M -a fence_xvm
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
建立映射,冒号前是集群中的hostname ,冒号后是domain name。

[root@node5 cluster]# pcs stonith create vmfence fence_xvm pcmk_host_map=“ndoe5:node5;node9:node9” op monitor interval=60s
在这里插入图片描述
模仿故障产生:
故障1: node5网络中中段
node5网络故障
在这里插入图片描述
看node9状态:
在这里插入图片描述
在这里插入图片描述
此时node5已经自动关闭了,再次打开查看状态
在这里插入图片描述
故障2:node9内核崩溃
在这里插入图片描述
所有资源都跑到node5上了
在这里插入图片描述
客户端不受影响
在这里插入图片描述
当node9重新启动后:
在这里插入图片描述
故障3:vip资源不见了
[root@node5 ~]# ip addr del 172.25.7.150/24 dev eth0

30秒后自动添加上:
在这里插入图片描述
再次查看:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值