一、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
- 命令行数据的恢复
客户端删除了数据: 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掉,客户端就看不到数据了。
四、存储类
实验环境:
node5 | master |
---|---|
node6 | chunk数据节点 |
node7 | chunk数据节点,client客户端 |
node8 | chunk数据节点 |
node9 | chunk数据节点 |
(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.135 | master主节点 |
---|---|
node9:712.25.7.139 | master备用节点 |
node6:172.25.7.136 | chunk数据节点 |
node8:172.25.7.138 | chunk数据节点 |
node7:172.25.7.137 | client客户端节点 |
(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秒后自动添加上:
再次查看: