2021-02-20

MFS存储
MFS:驯鹿存储系统(MooseFS) 是一个具备冗余容错功能的分布式网络文件系统,它将数据分别存放在多个物理服务器或单独磁盘或分区上,确保一份数据有多个备份副本,然而对于访问 MFS 的客户端或者用户来说,整个分布式网络文件系统集群看起来就像一个资源一样,从其对文件系统的情况看 MooseFS 就相当于 UNIX 的文件系统
优点:
1)高可靠性:每一份数据可以设置多个备份(多分数据),并可以存储在不同的主机上

2)高可扩展性:可以很轻松的通过增加主机的磁盘容量或增加主机数量来动态扩展整个文件系统的存储量

3)高可容错性:我们可以通过对mfs进行系统设置,实现当数据文件被删除后的一段时间内,依旧存放于主机的回收站中,以备误删除恢复数据

4)高数据一致性:即使文件被写入、访问时,我们依然可以轻松完成对文件的一致性快照

缺点:
1) Master 目前是单点,虽然会把数据信息同步到备份服务器,但是恢复需要时间
2) Master 服务器对主机的内存要求略高
3) 默认 Metalogger 复制元数据时间较长(可调整)

应用场景:
大规模高并发的线上数据存储及访问(小文件,大文件都适合)
大规模的数据处理,如日志分析,小文件强调性能不用 HDFS

MFS组件
① 管理服务器 managing server 简称 master
② 元数据备份服务器 Metadata backup servers 简称 metalogger
③ 数据存储服务器组 data servers(chunk servers)简称 data
③ 客户机服务器组(client servers)简称 client

1)管理服务器master
管理整个mfs文件系统的主服务器,除了负责管理各个数据存储服务器,调度文件读写,回收文件空间以及恢复多节点 拷贝。,还用来存储整个文件系统中每个数据文件的 metadata 信息,metadate(元数据)信息包括文件(也可以是目录,socket,管道,块设备等)的大小,属性,文件的位置路径等。

2)元数据备份服务器metalogger
这个组件的作用是备份管理服务器 master 的变化的 metadata 信息日志文件,文件类型为 changelog_ml.*.mfs 。以便于在管理服务器出问题时,可以经过简单的操作即可让新的主服务器进行工作。为保证数据的安全性和可靠性,建议单独使用一台服务器来存放元数据日志,需要注意的是,元数据日志守护进程跟管理服务器在同 一个服务器,备份元数据日志服务器作为它的客户端,从管理服务器取得日志文件进行备份。

3) 数据存储服务器组 data
这类是真正存储用户数据的服务器。在存储文件时,首先把文件分成块,然后把这些块在数据存储服务器之间互相复制,同时,数据存储服务器还负责连接管理服务器,听从管理服务器调度,并为客户提供数据传输。数据存储服务器可以有多个,并且数量越多,可靠性越高。MFS可用的磁盘空间也越大。

4)客户机服务器组 client
这个组件就是挂载并使用 mfs 文件系统的客户端,当读写文件时,客户端首先会连接主管理服务器获取数据的 metadata 信息,然后根据得到的 metadata 信息,访问数据服务器读取或写入文件实体,mfs 客户端通过 fuse mechanism 实现挂载 mfs 文件系统的,因此,只有系统支持 fuse,就可以作为客户端访问 mfs 整个文件系统。

扩展小知识
Master 记录着管理信息,比如:文件路径|大小|存储的位置(ip,port,chunkid)|份数|时间等,元数据信息存在于内存中,会定期写入metadata.mfs.back 文件中,定期同步到 metalogger,操作实时写入changelog.*.mfs ,实时同步到 metalogger 中。Master 启动将 metadata.mfs 载入内存,重命名为 metadata.mfs.back 文件。

文件以 chunk 大小存储,每 chunk 最大为 64M,小于 64M 的,该 chunk 的大小即为该文件大小(验证实际 chunk 文件略大于实际文件),超过 64M 的文件将被切分,以每一份(chunk)的大小不超过 64M 为原则;块的生成遵循规则:目录循环写入( 00-FF 256 个目录循环,step(步长) 为 2,指文件与文件的步长,而不时chunk与chunk的)、chunk 文件递增生成、大文件切分目录连续。该内存属于虚拟内存,只有占用的才会写入虚拟内存。

Chunkserver 上的剩余存储空间要大于 1GB(Reference Guide 有提到),新的数据才会被允许写入,否则,你会看到 No space left on device 的提示,实际中,测试发现当磁盘使用率达到 95% 左右的时候,就已经不行写入了,当时可用空间为 1.9GB。

文件可以有多份 copy,当 goal 为 1 时,文件会被随机存到一台 chunkserver 上,当 goal 的数大于 1 时,copy 会由 master 调度保存到不同的 chunkserver 上,goal 的大小不要超过 chunkserver 的数量,否则多出的 copy,不会有 chunkserver 去存。

MFS存储数据的增删改查过程

数据的增加
1、Client 向 Master 发起请求
2、Master 确定 chunkserver 向对应chunkserver 传输文件大小,创建新块请求
3、Chunkserver 接受请求,在当前目录创建新块用于写入数据,创建成功后 mfs 返回 chunkid 给 Master 端
4、Master 发送 ip port chunkid 至 Client
5、Client 连接 新块写入数据,并向 Master 发送关闭文件请求
6、Master 连接至新块检索,判断最终大小以及修改时间,更新当前元数据信息

数据的删除
1、Client 连接 Master,并且发出删除文件请求。
2、Master 定位到删除元数据信息,删除元数据信息,并且将删除真实数据的请求加入到队列中,达到保存时间后,真实数据被删除。
3、Master 返回信息,Client 响应。

数据的修改
1、Client 向 Master 发起修改文件请求
2、Master 向 CHUNk 告知拷贝新块,副本1
3、Master 将 副本1 块 的ip 、port 、id 返回给 Client
4、Client 连接 副本1 块上
5、Client开始修改,修改完成,Client 向 Master 发起文件关闭请求
① M 连接至 副本1 块对比文件内容,如果一致,则会删除副本1,更新元 数据信息。如果不一致
② CHUnkserver 创建 副本2,副本根据 副本1 的大小定制,将内容拷贝至 副本2
③ chunkserver 删除 源块 副本1 块,将副本2 id 返回给 M
④ Master 更新元数据信息

数据的查看
1) 查看目录
Client 连接 Master,Master 检索内存数据返回元数据信息给client
2) 查看文件内容
1、Client 向 Master 发起检索请求
2、Master 向 Client 返回 ip、 port、 chunkid
3、Client 拿着 ip 、port、 chunkid 连接至 chunkserver 获取数据

==============================================================================================================================================================

实验构建
实验环境: 1、关闭防火墙、selinux
2、各节点配置时间同步服务器
3、节点ip配置,实验环境构建两台chunk server
master: 192.168.112.10
metalog: 192.168.112.20
chunk server1: 192.168.112.40
chunk server2: 192.168.112.50
client: 192.168.112.60

9420 : MFS master和MFS chunck通信端口
9421 : MFS master和MFS Client端通信端口
9419 : MFS master和MFS metalogger端通信端口
9422 : MFS chunck和MFS Client端通信端口
9425 : MFS master和 web界面监听端口,查看整体运行状态

1、所有节点安装MFS源码包
1)下载
wget http://ppa.moosefs.com/src/moosefs-3.0.84-1.tar.gz
2)解压安装
tar -xf moosefs-3.0.84-1.tar.gz
useradd -s /sbin/nologin -M mfs
yum -y install zlib zlib-devel gcc*
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs
make && make install

2、master服务器
配置文件的修改
cd /usr/local/mfs/etc/mfs
cp -a mfsmaster.cfg.sample mfsmaster.cfg #主配置文件
vim mfsmaster.cfg #该文件不用修改
cp -a mfsexports.cfg.sample mfsexports.cfg #用户挂载权限设置文件
vim mfsexports.cfg #加在文件末尾
192.168.112.0/24 . rw,alldirs,maproot=0

192.168.112.0/24 #允许挂载的客户端网段
. #允许挂载的目录“.”表示MFSMETA文件系统,“/”表示 mfs的根目录
rw 读写的方式共享
alldirs 允许挂载任何目录
maproot=0 挂载时客户端映射的用户为root
password 指定客户端用户密码
配置文件“mfsmaster.cfg”详解
WORKING_USER = mfs #用户名
WORKING_GROUP = mfs #用户组名
SYSLOG_IDENT = mfsmaster #在syslog中的表示,说明这是mfsmaster产生的
LOCK_MEMORY = 0 #是否执行mlockall()以避免mfsmaster内存溢出(默认为0)
NICE_LEVEL = -19 #运行的优先级(默认-19,注意,这进程必须是root启动 )
DATA_PATH = /usr/local/mfs/var/mfs #数据存放路径,该目录下有三大类文件,changelog,sessions,stats
EXPORTS_FILENAME = /usr/local/mfs/etc/mfs/mfsexports.cfg #被挂载目录以及其权限控制文件的存放位置
BACK_LOGS = 50 #元数据的改变日志文件数量(默认是50)
MATOML_LISTEN_HOST = * #元数据日志服务器监听的IP地址(默认是*,代表任何IP)
MATOML_LISTEN_PORT = 9419 #元数据日志服务器监听的端口地址,默认是9419
MATOCS_LISTEN_HOST = * #用于存储服务器(Chunk Server)连接的IP地址
MATOCS_LISTEN_PORT = 9420 #是存储服务器(Chunk server)连接的端口地址
REPLICATIONS_DELAY_INIT = 300 #延迟复制的时间(默认是300)
CHUNKS_LOOP_MIN_TIME = 300 #chunks 的回环率
CHUNKS_SOFT_DEL_LIMIT = 10
CHUNKS_WRITE_REP_LIMIT = 2,1,1,4 #在一个循环里复制到一个CHUNK Server的最大chunks数目
CHUNKS_READ_REP_LIMIT = 10,5,2,5
MATOCL_LISTEN_HOST = *
MATOCL_LISTEN_PORT = 9421

cd /usr/local/mfs/var/mfs
cp -a metadata.mfs.empty metadata.mfs #元数据文件
chown -R mfs:mfs /usr/local/mfs/ #授权

开启master服务
/usr/local/mfs/sbin/mfsmaster start #首次开启master服务器
开启三个端口:9419、9420、9421
/usr/local/mfs/sbin/mfsmaster -a #重新开启master
/usr/local/mfs/sbin/mfscgiserv #开启网页监测服务
开启9425端口,可通过服务器ip:9425进入页面

3、元数据服务器
配置文件的修改
cd /usr/local/mfs/etc/mfs
chown -R mfs:mfs /usr/local/mfs
cp -a mfsmetalogger.cfg.sample mfsmetalogger.cfg
vim mfsmetalogger.cfg
MASTER_HOST = 192.168.112.10 #指定主服务器地址
MASTER_PORT = 9419 #指定连接端口
META_DOWNLOAD_FREQ = 24 #多长时间进行一次完整备份(默认增量)

开启元数据服务
/usr/local/mfs/sbin/mfsmetalogger start
lsof -i :9419 #查看端口连接状态(保证主服务器开启)
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mfsmetalo 7941 mfs 8u IPv4 24751 0t0 TCP 192.168.112.20:57970->192.168.112.10:9419 (ESTABLISHED)
此时“/usr/local/mfs/var/mfs”会多出同步过来的日志文件

4、数据存储服务器
1)server1、server2配置文件的修改
cd /usr/local/mfs/etc/mfs
cp -a mfschunkserver.cfg.sample mfschunkserver.cfg
vim mfschunkserver.cfg
MASTER_HOST = 192.168.112.10 #指定主服务器地址
MASTER_PORT = 9420 #指定连接端口
HDD_CONF_FILENAME = /usr/local/mfs/etc/mfs/mfshdd.cfg
#指定通过那个文件确定用来存储的目录
cp -a mfshdd.cfg.sample mfshdd.cfg #对应上述文件所指定文件
vim mfshdd.cfg #在最后一行添加
/mnt/mfs #指定一个用来存储的目录
mkdir /mnt/mfs #创建用来存储的目录

将用来提供存储的磁盘格式化后,分区,并挂载到上述存储目录
fdisk /dev/sdb
mkfs -t ext4 /dev/sdb1
mount /dev/sdb1 /mnt/mfs
echo “/bin/mount /dev/sdb1 /mnt/mfs” >> /etc/rc.local
chmod 777 /etc/rc.local
chown -R mfs:mfs /usr/local/mfs
chown -R mfs:mfs /mnt/mfs

启动chunkserver服务
/usr/local/mfs/sbin/mfschunkserver start #启动chunkserver服务器
echo “/usr/local/mfs/sbin/mfschunkserver start” >> /etc/rc.local
通过master自带的网页监控,可以看到多啦两个disk

5、mfs客户端的配置
yum -y install zlib zlib-devel gcc* fuse fuse-devel fuse-libs
tar -xf moosefs-3.0.84-1.tar.gz
cd moosefs-3.0.84
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver
make && make install
mkdir /mnt/mfsclient 、
#创建挂载目录(改为apache网页主目录即可成为其后端存储)
/usr/local/mfs/bin/mfsmount /mnt/mfsclient -H 192.168.112.10
#挂载命令,-H:指定master服务器地址

mfs功能的演示:
ln -s /usr/local/mfs/sbin/* /usr/local/sbin
ln -s /usr/local/mfs/bin/* /usr/local/bin #为啦命令快捷,加入软连接

① 垃圾站机制(客户机上操作)
cd /mnt/mfsclient
mfsgettrashtime 文件名 #文件删除后在垃圾箱保留时间
mfssettrashtime 时间值(s) 文件名 #设置文件的删除后在垃圾箱保留时间

当误删除文件后,记住删除的文件名
mkdir /huifu 创建一个给垃圾箱挂载使用的目录
mfsmount -m /huifu -H 192.168.112.10
yum -y install tree
tree /huifu/trash/ | grep -B2 误删文件名 #找到误删文件的垃圾箱路径
找到路径后
mv /huifu/trash/… /huifu/trash/under/ 将文件移到该目录下即为恢复

② 快照功能
[root@localhost mfsclient]# mfsfileinfo yun
yun:
chunk 0: 0000000000000009_00000001 / (id:9 ver:1)
copy 1: 192.168.112.40:9422 (status:VALID)
copy 2: 192.168.112.50:9422 (status:VALID)
[root@localhost mfsclient]# mkdir 123
[root@localhost mfsclient]# mfsmakesnapshot yun 123/ #做快照
[root@localhost mfsclient]# cat 123/yun
2020年 08月 11日 星期二 15:29:13 CST
[root@localhost mfsclient]# echo 123233456 >> yun
[root@localhost mfsclient]# cat 123/yun
2020年 08月 11日 星期二 15:29:13 CST
[root@localhost mfsclient]# cat yun
2020年 08月 11日 星期二 15:29:13 CST
123233456
[root@localhost mfsclient]# mfsfileinfo 123/yun
123/yun:
chunk 0: 0000000000000009_00000001 / (id:9 ver:1)
copy 1: 192.168.112.40:9422 (status:VALID)
copy 2: 192.168.112.50:9422 (status:VALID)
由此可见,快照即为复制一个副本,两文件共用一个块存储空间,但又互不影响

③ 冗余设置
[root@localhost mfsclient]# date > xiong
[root@localhost mfsclient]# mfsgetgoal xiong
xiong: 2
[root@localhost mfsclient]# mfsfileinfo xiong
xiong:
chunk 0: 000000000000000C_00000001 / (id:12 ver:1)
copy 1: 192.168.112.40:9422 (status:VALID)
copy 2: 192.168.112.50:9422 (status:VALID)
[root@localhost mfsclient]# mfssetgoal 1 xiong
xiong: goal: 1
[root@localhost mfsclient]# mfsfileinfo xiong
xiong:
chunk 0: 000000000000000C_00000001 / (id:12 ver:1)
copy 1: 192.168.112.40:9422 (status:VALID)
冗余设置的副本数最大不大于chunkserver服务器的数量,当大于1时,任何一台chunksever的宕机都不会使数据丢失。
当宕机的chunkserver服务器重新开启服务后,又会自动将文件副本连接到master服务
如果文件时从垃圾箱恢复过来的数据,则不能修改冗余数。

④ 还原master
当master服务器宕机后,此时客户端是无法获取数据的
1) 可以重新启动master服务器
/usr/local/mfs/sbin/mfsmaster -a #使用该命令重新开启

2) 只能重装master服务器
下载
wget http://ppa.moosefs.com/src/moosefs-3.0.84-1.tar.gz
解压安装
tar -xf moosefs-3.0.84-1.tar.gz
useradd -s /sbin/nologin -M mfs
yum -y install zlib zlib-devel gcc*
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs
make && make install

配置文件的修改(最好能与宕机前的配置一致)
cd /usr/local/mfs/etc/mfs
cp -a mfsmaster.cfg.sample mfsmaster.cfg #主配置文件
vim mfsmaster.cfg #该文件不用修改
cp -a mfsexports.cfg.sample mfsexports.cfg #用户挂载权限设置文件
vim mfsexports.cfg #加在文件末尾
192.168.112.0/24 . rw,alldirs,maproot=0

在元数据服务器上操作
scp -r /usr/local/mfs/var/mfs/* root@192.168.112.10:/usr/local/mfs/var/mfs/
将元数据服务器上的元数据拷贝到master服务器

master服务器目录权限修改
chown -R mfs:mfs /usr/local/mfs
开启master服务
/usr/local/mfs/sbin/mfsmaster -a #必须使用该命令开启master
/usr/local/mfs/sbin/mfscgiserv #开启网页监测服务

测试:
再次在客户端查看文件,会发现之前的文件又可以查看修改啦

mfs的master服务高可用

原理,利用元数据服务器metalog在master宕机后使用脚本将一些配置文件更改,并利用keepalived高可用

1、配置master服务器keepalived配置文件

vim /etc/keepalived/keepalived.conf
global_defs {
router_id LV1
}
vrrp_script check_server {
script “/etc/keepalived/a.sh”
interval 3
fall 2
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.112.100
}
track_script {
check_server
}
}

2、master主服务器在自己宕机时执行的脚本

vim /etc/keepalived/a.sh 脚本给权限
#!/bin/bash
source /etc/profile
netstat -anpt | grep mfsmaster
if [ $? -ne 0 ]
then
/usr/local/mfs/sbin/mfscgiserv stop
service keepalived stop
sleep 2
echo “mfsmaster is died” >> /root/mfs.log
echo date >> /root/mfs.log
fi

3、metalog服务器的keepalived配置文件

vim /etc/keepalived/keepalived.conf
global_defs {
router_id LV2
}

vrrp_instance VI_1 {
state SLAVE
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.112.100
}
notify_master /etc/keepalived/a.sh
}

4、metalog在master宕机需要执行的脚本
vim /etc/keepalived/a.sh 脚本给权限
#!/bin/bash
source /etc/profile
netstat -anpt | grep mfs*
if [ $? -ne 0 ]
then
/usr/local/mfs/sbin/mfsmetalogger stop
sleep 2
cd /usr/local/mfs/etc/mfs && mkdir 123
sleep 1
mv mfsmetalogger.cfg 123
sleep 1
cp -a mfsmaster.cfg.sample mfsmaster.cfg
cp -a mfsexports.cfg.sample mfsexports.cfg
echo “192.168.112.0/24 . rw,alldirs,maproot=0” >> mfsexports.cfg
sleep 1
/usr/local/mfs/sbin/mfsmaster -a
/usr/local/mfs/sbin/mfscgiserv
sleep 3
echo “I’m master” >> /root/mfs.log
echo date >> /root/mfs.log
fi

其他与mfs的正常配置一样
注意:metalog与chunkserver与client服务器的客户机与master的连接ip全部改为虚拟ip,vip:192.168.112.100

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值