1.分布式文件系统
分布式文件系统是指文件系统管理的物理存储资源,不一定在本地节点上,而是通过网络与节点相连。
就是把一些分散的(分布在局域网内各个计算机上)共享文件夹,集合到一个文件夹内(虚拟共享文件夹)。
对于用户来说,要访问这些共享文件夹时,只要打开这个虚拟共享文件夹,就可以看到所有链接到虚拟共享文件夹内的共享文件夹,用户感觉不到这些共享文件是分散在各个计算机上的。
分布式文件系统的好处是集中访问、简化操作、数据容灾,以及提高文件的存取性能。
2.MooseFS简介
MooseFS 是一个高容错性的分布式文件系统,它能够将资源分布存储于几台不同的物理介质,对外只提供给用户一个访问接口。对它的操作与其它文件系统完全一样:
| 分层文件结构(目录树结构);
l 存储POSIX 文件属性(权限、最后访问、修改时间);
l 支持特殊的文件(块文件夹、字符文件及管道和socket )
l 软链接(文件名指向目标文件)及硬链接(不同的文件名指向同一块数据);
l 仅限于基于IP 地址或密码来访问文件系统。
MoosFS 具有以下特征:
l 高可靠性:数据可以被存储于几个不同的地方;
l 可扩展性:可以动态的添加计算机或磁盘来增加系统的容量产;
l 高可控性:系统能够设置删除文件的时间间隔;
l 可追溯性:能够根据文件的不同操作(写入/ 访问)生成文件快照。
3.MooseFS的体系结构
四个模块
元数据服务器Master 在整个体系中负责管理文件系统,维护元数据。
元数据日志服务器MetaLogger 备份Master服务器的变化日志文件,文件类型为changelog_ml.*.mfs。当Master服务器数据丢失或者损坏时,可以从日志服务器中取得文件,进行修复。
数据存储服务器Chunk Server 真正存储数据的服务器。存储文件时,会把文件分块保存,在数据服务器之间进行复制。数据服务器越多,能使用的“容量”就越大,可靠性就越高,性能也就越好。
客户端Client 可以像挂载NFS一样挂载MFS文件系统,其操作是相同的。
工作体系
元数据存储在管理服务器的内存及磁盘中(周期性的更新二进制文件及增长的日志文件)。同时二进制文件及日志文件会被同步到元数据服务器。
MFS读数据的处理过程
#客户端向元数据服务器发出读请求
#元数据服务器把数据存放的位置
(Chunk Server的IP地址和Chunk编号)告知客户端
(一份大的数据会被分块,存储在不同的数据服务器上)
#客户端向已知的Chunk Server请求发送数据
#Chunk Server向客户端发送数据
MFS写数据的处理过程
分为create创建和update 修改文件:
#客户端向元数据服务器发送写入请求
#元数据服务器与Chunk Server进行交互(只有当所需的分块Chunks存在的时候才进行交互),
但元数据服务器只在某些服务器创建新的分块Chunks,创建成功后由Chunk Server告知元数据服务器操作成功。
#元数据服务器告知客户端,可以在哪个Chunk Server的哪些Chunks写入数据
(副本数是由master来维护的)
#客户端向指定的Chunk Server写入数据
#该Chunk Server与按照要求和其他Chunk Server进行数据同步,同步成功后Chunk Server告知客户端数据写入成功
#客户端告知元数据服务器本次写入完毕
原始的读/写速度很明显是主要取决于所使用的硬盘的性能、网络的容量和拓扑结构,使用的硬
盘和网络的吞吐量越好,整个系统的性能也就会越好
4.实验环境
MFS部署
主master的部署
官方安装文档
首先要保证虚拟机可以上网,在真机中执行命令
iptables -t nat -I POSTROUTING -s 172.25.26.0/24 -j MASQUERADE
curl "http://ppa.moosefs.com/MooseFS-3-el7.repo" > /etc/yum.repos.d/MooseFS.repo #下载repo源
vim MooseFS.repo
cat MooseFS.repo
[MooseFS]
name=MooseFS $releasever - $basearch
baseurl=http://ppa.moosefs.com/moosefs-3/yum/el7
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
enabled=1
yum install -y moosefs-master ##安装MFS master
yum install moosefs-cgi moosefs-cgiserv moosefs-cli -y ##安装主服务器
systemctl start moosefs-master ##启动MASTER
vim /etc/hosts ##解析必须做
172.25.26.1 server1 mfsmaster
systemctl start moosefs-cgiserv.service ##网页监控
netstat -antlp
9419:metalogger监听的端口地址,和元数据服务器通信的,当master宕机,可以通过它的日志,接管master的服务
9420:用于chunkserver连接的端口地址
9421:用于客户端挂接连接的端口地址
9425:web界面监控各个分布节点的端口
访问172.25.26.1:9425/mfs.cgi
slave端的部署
注意:/mnt/chunk1或/mnt/chunk2是一个给mfs 的分区,但在本机上是一个独立的目录,最好是一个单独的硬盘或者一个raid 卷,最低要求是一个分区。
server2
[root@server1 yum.repos.d]# scp MooseFS.repo server2:/etc/yum.repos.d/
ssh: Could not resolve hostname server2: Name or service not known
lost connection
[root@servre1 yum.repos.d]# scp MooseFS.repo demo2:/etc/yum.repos.d/
[root@server1 yum.repos.d]# scp MooseFS.repo demo3:/etc/yum.repos.d/
[root@server2 ~]# yum install moosefs-chunkserver ##安装冷备份,两个slave端
[root@server3 ~]# yum install moosefs-chunkserver ##安装冷备份
[root@server3 ~]# vim /etc/hosts ##做解析
##server2添加一块虚拟磁盘,当作分布式存储
[root@server2 mfs]# fdisk /dev/vdb ##默认分一块就可以
[root@server2 mfs]# mkfs.xfs /dev/vdb1 ##格式化
[root@server2 mfs]# mkdir /mnt/chunk1
[root@server2 mfs]# mount /dev/vdb1 /mnt/chunk1/ ##挂载
[root@server2 mfs]# blkid
/dev/vdb1: UUID="e94e65fa-35cd-4a40-9ef8-fa6ef42ef128" TYPE="xfs"
[root@server2 mfs]# vim /etc/fstab
[root@server2 mfs]# cat /etc/fstab ##永久挂载
UUID="e94e65fa-35cd-4a40-9ef8-fa6ef42ef128" /mnt/chunk1 xfs defaults 0 0
[root@server2 mfs]# mount -a ##刷新
[root@server2 mfs]# id mfs ##设置权限
uid=997(mfs) gid=995(mfs) groups=995(mfs)
[root@server2 mfs]# chown mfs.mfs /mnt/chunk1/
##启动服务启动服务
[root@servre2 mfs]# systemctl start moosefs-chunkserver
##查看server2是否链接到server1这个master上
[root@demo2 ~]# cd /etc/mfs/
[root@demo2 mfs]# ls
mfschunkserver.cfg mfschunkserver.cfg.sample mfshdd.cfg mfshdd.cfg.sample
[root@demo2 mfs]# vim mfshdd.cfg ##设置挂载目录
[root@demo2 mfs]# grep -v ^# mfshdd.cfg
/mnt/chunk1
[root@demo2 mfs]# systemctl restart moosefs-chunkserver ##重启服务
查看状态
server3
[root@server3 ~]# cd /etc/mfs/
[root@server3 mfs]# ls
mfschunkserver.cfg mfschunkserver.cfg.sample mfshdd.cfg mfshdd.cfg.sample
[root@server3 mfs]# mkdir /mnt/chunk2
[root@server3 mfs]# vim mfshdd.cfg
[root@server3 mfs]# grep -v ^# mfshdd.cfg
/mnt/chunk2
[root@server3 mfs]# chown mfs.mfs /mnt/chunk2
[root@server3 mfs]# df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 17G 1.2G 16G 7% /
[root@server3 mfs]# systemctl start moosefs-chunkserver
在master上检查9420端口查看server2、3是否连接到
master端的cpu压力来自于分布式系统文件大小
内存压力来自于文件数量
客户端的部署 (真机作为客户端)
[root@westos ~]# cd /etc/yum.repos.d/
[root@westos yum.repos.d]# ls
aliyun.repo google-chrome.repo redhat.repo rhel8.2.repo
[root@westos yum.repos.d]# curl "http://ppa.moosefs.com/MooseFS-3-el8.repo" > /etc/yum.repos.d/MooseFS.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 168 100 168 0 0 93 0 0:00:01 0:00:01 --:--:-- 93
[root@westos yum.repos.d]# vim MooseFS.repo
[root@westos yum.repos.d]# cat MooseFS.repo
[MooseFS]
name=MooseFS $releasever - $basearch
baseurl=http://ppa.moosefs.com/moosefs-3/yum/el8
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-MooseFS
enabled=1
[root@westos yum.repos.d]# yum install moosefs-client
[root@westos ~]# cd /etc/mfs/
[root@westos mfs]# ls
mfsmount.cfg mfsmount.cfg.sample
[root@westos mfs]# vim mfsmount.cfg
[root@westos mfs]# grep -v ^# mfsmount.cfg
/mnt/mfs #添加挂载的目录,前提是这个挂载目录必须是空的
[root@westos mfs]# vim /etc/hosts ##做解析
[root@westos ~]# mkdir /mnt/mfs
[root@westos ~]# mfsmount
mfsmaster accepted connection with parameters: read-write,restricted_ip,admin ; root mapped to root:root
[root@westos ~]# ll /etc/mfs/mfsmount.cfg
-rw-r--r--. 1 root root 400 Mar 19 11:29 /etc/mfs/mfsmount.cfg
[root@westos ~]# df #查看/mnt/mfs是否挂载
[root@westos mfs]# mkdir dir1 dir2
[root@westos mfs]# mfsgetgoal dir1
dir1: 2
[root@westos mfs]# mfsgetgoal dir2
dir2: 2
[root@westos mfs]# mfssetgoal -r 1 dir1
dir1:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
[root@westos mfs]# mfsgetgoal dir1
dir1: 1
[root@westos mfs]# cd dir1/
[root@westos dir1]# cp /etc/passwd .
[root@westos dir1]# mfsfileinfo passwd
passwd:
chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
copy 1: 172.25.26.2:9422 (status:VALID)
copy 2: 172.25.26.3:9422 (status:VALID)
[root@westos dir1]# cd ../dir2/
[root@westos dir2]# cp /etc/fstab .
[root@westos dir2]# ls
fstab
[root@westos dir2]# mfsfileinfo fstab
fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.26.2:9422 (status:VALID)
copy 2: 172.25.26.3:9422 (status:VALID)
5.实验
基础实验
文本恢复
将mfsmount挂载
模拟删除passwd
mfsgettrashtime fstab ##查看删除之后可以在多久的时间之内恢复
fstab: 86400
在回收站查找被删除的文件并恢复
备份的内存分配
一个备份文件为64M
mfssetgoal -r 1 dir1
备份改为1
指定存储类标签存放数据
新建一个chunk3
labels的状态
##server2设置标签A
[root@server2 mfs]# pwd
/etc/mfs
[root@server2 mfs]# ls
mfschunkserver.cfg mfschunkserver.cfg.sample mfshdd.cfg mfshdd.cfg.sample
[root@server2 mfs]# vim mfschunkserver.cfg ##设置标签A
[root@server2 mfs]# systemctl reload moosefs-chunkserver.service
## server3设置标签B
[root@serve3 ~]# cd /etc/mfs/
[root@serve3 mfs]# ls
mfschunkserver.cfg mfschunkserver.cfg.sample mfshdd.cfg mfshdd.cfg.sample
[root@serve3 mfs]# vim mfschunkserver.cfg
[root@serve3 mfs]# systemctl reload moosefs-chunkserver.service
##server4设置标签为A
[root@server4 ~]# cd /etc/mfs/
[root@server4 mfs]# ls
mfschunkserver.cfg mfschunkserver.cfg.sample mfshdd.cfg mfshdd.cfg.sample
[root@server4 mfs]# vim mfschunkserver.cfg
[root@server4 mfs]# systemctl reload moosefs-chunkserver.service
[root@westos ~]# cd /mnt/mfs
[root@westos mfs]# mfsscadmin create A,B ab_class ##创建标签
[root@westos mfs]# cd dir2/
[root@westos dir2]# ls
bigfile fstab
[root@westos dir2]# mfssetsclass ab_class fstab ##设置标签
fstab: storage class: 'ab_class'
[root@westos dir2]# mfsfileinfo fstab
fstab:
chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
copy 1: 172.25.70.2:9422 (status:VALID)
copy 2: 172.25.70.3:9422 (status:VALID)
实验2
实验3
实验4
mfsscadmin create -C 2AS -K AS,BS -A AH,BH -d 7 4S_class ##C创建,K保持,A打包,d表示打包之后的过期时间
6.MFS高可用集群
配置server2上的target
[root@server2 ~]# yum install targetcli -y ##安装target软件
[root@server2 ~]# systemctl start target.service ##启动target
[root@server2 ~]# targetcli
/> ls
o- / .......................................................................... [...]
o- backstores ............................................................... [...]
| o- block ................................................... [Storage Objects: 0]
| o- fileio .................................................. [Storage Objects: 0]
| o- pscsi ................................................... [Storage Objects: 0]
| o- ramdisk ................................................. [Storage Objects: 0]
o- iscsi ............................................................. [Targets: 0]
o- loopback .......................................................... [Targets: 0]
/> cd backstores/block
/backstores/block> ls
o- block ....................................................... [Storage Objects: 0]
/backstores/block> create my_disk /dev/vdc
Created block storage object my_disk using /dev/vdc.
/backstores/block> cd /iscsi
/iscsi> create iqn.2021-12.org.westos:target1
Created target iqn.2021-12.org.westos:target1.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/iscsi> cd iqn.2021-03.org.westos:target1/
/iscsi/iqn.20...estos:target1> cd tpg1/luns
/iscsi/iqn.20...et1/tpg1/luns> create
/backstores/block/my_disk add_mapped_luns= lun=
storage_object=
/iscsi/iqn.20...et1/tpg1/luns> create /backstores/block/my_disk
Created LUN 0.
/iscsi/iqn.20...et1/tpg1/luns> cd ../acls
/iscsi/iqn.20...et1/tpg1/acls> create iqn.2021-12.org.westos:client
Created Node ACL for iqn.2021-03.org.westos:client
Created mapped LUN 0.
/iscsi/iqn.20...et1/tpg1/acls>
配置server1
servre1与server4配置相同
[root@server1 ~]# yum install -y iscsi-* ##安装iscsi
[root@server5 ~]# yum install -y iscsi-* ##安装iscsi
[root@server1 ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:347c8bed1ada
[root@server1 ~]# vim /etc/iscsi/initiatorname.iscsi
[root@server1 ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2021-12.org.westos:client
[root@server1 ~]# systemctl status iscsi
● iscsi.service - Login and scanning of iSCSI devices
Loaded: loaded (/usr/lib/systemd/system/iscsi.service; enabled; vendor preset: disabled)
Active: inactive (dead)
Docs: man:iscsid(8)
man:iscsiadm(8)
[root@server1 ~]# systemctl is-enabled iscsi
enabled
[root@server1 ~]# systemctl is-enabled iscsid
disabled
[root@server1 ~]# iscsiadm -m discovery -t st -p 172.25.70.2 ##指向target主机
172.25.70.2:3260,1 iqn.2021-12.org.westos:target1
[root@server1 ~]# iscsiadm -m node -l ##登陆
[root@server1 ~]# cd /var/lib/iscsi/ ##进入iscsi文件夹
[root@server1 iscsi]# ls
ifaces isns nodes send_targets slp static
[root@server1 iscsi]# cd nodes/ ##指向的节点
[root@server1 nodes]# ls
iqn.2021-03.org.westos:target1
[root@server1 nodes]# fdisk -l ##查看是否共享文件系统成功
[root@server1 nodes]# fdisk /dev/sda ##直接建立一个大盘
[root@server1 nodes]# cat /proc/partitions ##查看盘信息
major minor #blocks name
252 0 20971520 vda
252 1 1048576 vda1
252 2 19921920 vda2
253 0 17821696 dm-0
253 1 2097152 dm-1
8 0 10485760 sda
8 1 10484736 sda1
[root@server1 nodes]# partprobe
[root@server1 nodes]# mkfs.ext4 /dev/sda1 ##格式化
同步文件
##1. server1上操作
[root@server1 ~]# mount /dev/sda1 /mnt/
[root@server1 ~]# df
/dev/sda1 10189076 36888 9611568 1% /mnt
[root@server1 ~]# ll -d /mnt/
drwxr-xr-x 3 root root 4096 Mar 19 04:06 /mnt/
[root@server1 ~]# id mfs
uid=997(mfs) gid=995(mfs) groups=995(mfs)
[root@server1 ~]# chown mfs.mfs /mnt/
[root@server1 ~]# ll -d /mnt/
drwxr-xr-x 3 mfs mfs 4096 Mar 19 04:06 /mnt/
[root@server1 ~]# cd /var/lib/mfs/
[root@server1 mfs]# ll
total 4908
-rw-r----- 1 mfs mfs 404 Mar 19 03:27 changelog.1.mfs
-rw-r----- 1 mfs mfs 1092 Mar 19 01:43 changelog.3.mfs
-rw-r----- 1 mfs mfs 679 Mar 19 00:53 changelog.4.mfs
-rw-r----- 1 mfs mfs 1864 Mar 18 23:59 changelog.5.mfs
-rw-r----- 1 mfs mfs 261 Mar 18 22:17 changelog.6.mfs
-rw-r----- 1 mfs mfs 45 Mar 18 21:49 changelog.7.mfs
-rw-r----- 1 mfs mfs 120 Mar 19 04:00 metadata.crc
-rw-r----- 1 mfs mfs 3569 Mar 19 04:00 metadata.mfs.back
-rw-r----- 1 mfs mfs 4001 Mar 19 03:00 metadata.mfs.back.1
-rwxr--r-- 1 mfs mfs 8 Oct 8 07:55 metadata.mfs.empty
-rw-r----- 1 mfs mfs 4984552 Mar 19 04:00 stats.mfs
[root@server1 mfs]# cp -p * /mnt/
[root@server1 mfs]# cd /mnt/
[root@server1 mnt]# ls
changelog.1.mfs changelog.5.mfs lost+found metadata.mfs.back.1
changelog.3.mfs changelog.6.mfs metadata.crc metadata.mfs.empty
changelog.4.mfs changelog.7.mfs metadata.mfs.back stats.mfs
[root@server1 mnt]# cd
[root@server1 ~]# umount /mnt/ ##解除挂载
[root@server1 ~]# mount /dev/sda1 /var/lib/mfs/
[root@server1 ~]# cd /var/lib/mfs/
[root@server1 mfs]# ls
changelog.1.mfs changelog.5.mfs lost+found metadata.mfs.back.1
changelog.3.mfs changelog.6.mfs metadata.crc metadata.mfs.empty
changelog.4.mfs changelog.7.mfs metadata.mfs.back stats.mfs
[root@server1 mfs]# cd
[root@server1 ~]# umount /var/lib/mfs/
##2. server5上操作
[root@server5 ~]# cd /var/lib/mfs/ ##可以查看数据是和server1不一样的
[root@server5 mfs]# ls
chunkserverid.mfs csstats.mfs metadata.mfs metadata.mfs.empty
[root@server5 ~]# mount /dev/sda1 /var/lib/mfs/ ##先挂载在开启,做之前服务一定要是关闭的。不然需要-a 重新做一遍
##如果出错可以先mfsmaster -a
[root@server5 mfs]# systemctl status moosefs-master.service ##修改配额uzhi
[root@server5 mfs]# vim /usr/lib/systemd/system/moosefs-master.service
[root@server5 mfs]# cat /usr/lib/systemd/system/moosefs-master.service ##server1也修改一下
ExecStart=/usr/sbin/mfsmaster -a
[root@server5 mfs]# systemctl daemon-reload
[root@server5 mfs]# systemctl start moosefs-master
[root@server5 mfs]# systemctl stop moosefs-master ##metadata.mfs 这个文件是必须有的
[root@server5 mfs]# ls
changelog.1.mfs changelog.5.mfs lost+found metadata.mfs.back.1
changelog.3.mfs changelog.6.mfs metadata.crc metadata.mfs.empty
changelog.4.mfs changelog.7.mfs metadata.mfs stats.mfs