目录
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.70.0/24 -j MASQUERADEcurl "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.70.1 server1 mfsmaster systemctl start moosefs-cgiserv.service ##网页监控 netstat -antlp 9419:metalogger监听的端口地址,和元数据服务器通信的,当master宕机,可以通过它的日志,接管master的服务 9420:用于chunkserver连接的端口地址 9421:用于客户端挂接连接的端口地址 9425:web界面监控各个分布节点的端口
访问172.25.70.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.70.2:9422 (status:VALID) copy 2: 172.25.70.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.70.2:9422 (status:VALID) copy 2: 172.25.70.3:9422 (status:VALID)
5.实验
基础实验
文本恢复
将mfsmount挂载模拟删除passwd
mfsgettrashtime fstab ##查看删除之后可以在多久的时间之内恢复 fstab: 86400
在回收站查找被删除的文件并恢复
备份的内存分配
一个备份文件为64Mmfssetgoal -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)
实验1
查看组状态
实验2
实验3 实验4
mfsscadmin create -C 2AS -K AS,BS -A AH,BH -d 7 4S_class ##C创建,K保持,A打包,d表示打包之后的过期时间
6.MFS高可用集群
关闭server4的moosefs-chunkserver
将server4作为master备机配置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