分布式存储--MFS
驯鹿
1.什么是MFS?
MooseFS 是一个具备冗余容错功能的分布式网络文件系统,它将数据分别存放在多个物理服务器或单独磁盘或分区上,确保一份数据有多个备份副本;然而对于访问MFS的客户端或者用户来说,整个分布式网络文件系统集群看起来就像一个资源一样;从其对文件系统的情况看 MooseFS就相当于Unix的文件系统
特性:
-
高可靠性
每一份数据可以设置多个备份(多份数据),并可以存储在不同的主机上
-
高可扩展性
可以很轻松的通过增加主机的磁盘容量或增加主机数量来动态扩展整个文件系统的存储量
-
高可容错性
可以通过对MFS进行系统设置,实现当数据文件被删除的一段时间内,依旧存放于主机的回收站中,以备误删除恢复数据
-
高数据一致性
即使文件被写入、访问时,我们依然可以轻松完成对文件的一次性快照
缺点:
- Master 目前是单点,虽然会把数据信息同步到备份服务器,但是恢复需要时间
- Master 服务器对主机的内存要求较高
- 默认metaloger复制元数据(完整备份)时间较长
metadate,mfs.back #完整备份
changelog.*.mfs #差异备份
内存使用问题:
处理一百万个文件,大约需要300M的内存;处理一个亿的文件,大概需要300G的内存空间。
应用场景:
- 大规模高并发的线上数据存储及访问(小文件、大文件都适合)
- 大规模的数据处理,如日志分析;小文件强调性能不用HDFS(分布式文件存储)
2.组件
管理服务器master
管理整个MFS文件系统的主服务器,除了分发用户请求外,还用来存储整个文件系统中每个数据文件的metadata(元数据)信息,metadata信息包括文件(目录,套接字,管道,块设备等)的大小,属性,文件的存放路径等
元数据备份服务器metalogger
备份管理服务器master的变化的元数据信息日志文件,文件类型为changelog_ml.*.mfs
以便于在管理服务器出问题时,可以经过简单的操作可让新的主服务器进行工作。
数据存储服务器组 data servers
这个组件是真正存放数据文件实体的服务器,这个角色可以有多台不同的物理服务器或不同的磁盘;
听从管理服务器调度,提供存储空间,并为客户提供数据传输
3.增删改读、遍历
MFS的读数据过程
(1)Client当需要一个数据时,首先向master server管理服务器发起查询请求;
(2)管理服务器检索自己的数据,获取到数据所在的可用数据服务器位置(ip,port,chunkid);
(3)管理服务器将数据服务器的地址发送给客户端;
(4)客户端向具体的数据服务器发起数据获取请求;
(5)数据服务器将数据发送给客户端
MFS的写数据过程
(1)当客户端有数据写需求时,首先向管理服务器提供文件元数据信息(文件名,大小,份数等)请求存储地址
(2)管理服务器根据写文件的元数据信息,到数据服务器创建新的数据块
(3)数据服务器返回创建成功的消息
(4)管理服务器将数据服务器的地址返回给客户端(ckunkIP、port、chunkid)
(5)客户端向数据服务器写数据
(6)数据服务器返回给客户端写成功的消息
(7)客户端将此次写成功结束信号和一些信息发送到管理服务器来更新文件的长度和最后修改时间
MFS的删除文件过程
(1)客户端有删除操作时,首先向Master发送删除消息;
(2)Master定位到响应的元数据信息进行删除,并将chunk server数据服务器上块的删除操作加入队列异步清理;
(3)响应客户端删除成功的信号
MFS修改文件内容的过程
(1)客户端有修改文件内容时,首先向Master发送操作信息;
(2)master申请新的块给 ".swp"文件;
(3)客户端关闭文件后,会向master发送关闭信息;
(4)master会检测内容是否有更新:
- 若有,则申请新的块存放更改后的文件,删除原有块和 .swp文件块;
- 若无,则直接删除 .swp文件块
MFS遍历文件的过程
(1)遍历文件不需要访问chunk server,当有客户端遍历请求时,向master发送操作信息;
(2)master返回相应元数据信息;
(3)客户端接收到信息后返回
4.补充描述
(1) Master记录着管理信息;比如:文件路径、大小、存储的位置(ip,port,chunkid)、份数、时间等;
元数据信息存在于内存中,会定期写入metadata.mfs.back文件中,定期同步到metalogger,操作实时写入changelog.*.mfs,实时同步到metalogger中。
master启动后将metadata.mfs载入内存,命名为metadata.mfs.back文件。
(2)文件以chunk大小存储,每chunk最大为64M,小于64M的,该chunk的大小即为该文件大小;超过64M的文件将被切分,以每一份chunk的大小不超过64M为原则。
块的生成遵循规则:
目录循环写入(00-FF 256个目录循环,step为2)、chunk文件递增生成、大文件切分目录连续。
(3)chunk server 上剩存储空间要大于1GB,新的数据才会被允许写入,否则会报错 no space left on device(磁盘空间不足)
(4)文件可以有多分copy,当goal为1时,文件会被随机存到一台chunkserver 上,当goal的数大于1时,copy会由master调度保存到不同的chunkserver上;goal的数量最好为3个,否则会造成资源的浪费
5.构建MFS集群
10.10.10.15 #master server
10.10.10.16 #metalogger server
10.10.10.17 #chunk server1
10.10.10.18 #chunk server2
10.10.10.19 #client
master server:
# 上传软件包
useradd -s /sbin/nologin -M mfs
tar -zxvf moosefs-3.0.84-1.tar.gz
cd moosefs-3.0.84
yum -y install zlib zlib-devel
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs
make && make install
cd /usr/local/mfs/etc/mfs
cp mfsmaster.cfg.sample mfsmaster.cfg
cp mfsexports.cfg.sample mfsexports.cfg
chmod a+x /usr/local/mfs/sbin/*
chown -R mfs.mfs /usr/local/mfs/
ln -s /usr/local/mfs/bin/mfscli /usr/local/bin/
ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
# 设置MFS挂载权限
# vim mfsexports.cfg
10.10.10.0/24 . rw,alldirs,maproot=0
cp /usr/local/mfs/var/mfs/metadata.mfs.empty /usr/local/mfs/var/mfs/metadata.mfs
# 拷贝MFS元数据信息文件
mfsmaster start
# 开启MFS自带的web监控界面
mfscgiserv
# mfsmaster.cfg 主配置文件
# WORKING_USER = mfs #运行master server的用户
# WORKING_GROUP = mfs #运行master server的组
# SYSLOG_IDENT = mfsmaster #在syslog中的标识
# LOCK_MEMORY = 0 #是否执行mlockall()以避免mfsmaster进程溢出
# NICE_LEVEL = -19 #运行的优先级(进程必须是用root启动)
# DATA_PATH = /usr/local/mfs/var/mfs #数据存放路径(此目录下大致由三类文件:changelog,sessions,stats)
# EXPORTS_FILENAME = /usr/local/mfs/etc/mfs/mfsexports.cfg #被挂载目录及其权限控制文件的存放目录
# BACK_LOGS = 50 #metadata的改变log文件数目
# REPLICATIONS_DELAY_INIT = 300 #延迟复制的时间
# MATOML_LISTEN_HOST = * #metalogger监听的IP地址
# MATOML_LISTEN_PORT = 9419 #metalogger监听的端口地址(默认9421)
# MATOCS_LISTEN_HOST = * #用于chunkserver连接的IP地址
# MATOCS_LISTEN_PORT = 9420 #用于chunkserver连接的端口地址(默认9420)
# MATOCL_LISTEN_HOST = * #用于客户端挂载连接的IP地址
# MATOCL_LISTEN_PORT = 9421 #用于客户端挂载连接的端口信息
# 修改DATA_PATH指定的目录要设置权文件归属为mfs用户
# mfsexports.cfg 挂载信息存放目录
#客户端 #允许挂载的目录 #客户端拥有的权限
10.10.10.0/24 . rw,alldirs,maproot=0
# alldirs #允许挂载任何指定的子目录
# maproot #映射为root
metalogger server
# 安装步骤同master
# 拷贝MFS元数据服务配置文件
cd /usr/local/mfs/etc/mfs
cp mfsmetalogger.cfg.sample mfsmetalogger.cfg
# vim mfsmetalogger.cfg
META_DOWNLOAD_FREQ = 2 #设置完整同步间隔为2小时
MASTER_HOST = 10.10.10.15 #设置MFS-master的服务器IP地址
# 启动MFS-logger
mfsmetalogger start
[root@011 mfs]# lsof -i :9419
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mfsmetalo 7985 mfs 8u IPv4 17800 0t0 TCP 10.10.10.16:49668->10.10.10.15:9419 (ESTABLISHED)
chunkserver1:
# 安装步骤同master
cp mfschunkserver.cfg.sample mfschunkserver.cfg
# vim mfschunkserver.cfg
MASTER_HOST = 10.10.10.15 #指定MFS-Master服务器地址
MASTER_PORT = 9420 #指定MFS-Master服务器端口
HDD_CONF_FILENAME = /usr/local/mfs/etc/mfs/mfshdd.cfg
#指定提供存储的位置文件位置
# 创建挂载点目录
mkdir /mnt/sdb1
# 修改MFS服务HDD路径
# vim /usr/local/mfs/etc/mfs/mfshdd.cfg
/mnt/sdb1
# 分区、挂载、格式化
fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
mount /dev/sdb1 /mnt/sdb1/
chown -R mfs.mfs /mnt/sdb1
# 启动
mfschunkserver start
Client:
# 正常步骤安装
# 创建挂载目录
mkdir /mnt/mfs
# 进行挂载 -H指定主机位master节点IP
mfsmount /mnt/mfs/ -H 10.10.10.15
# 查看信息
ckunkserver2:
# 安装步骤同chunkserver1
cp mfschunkserver.cfg.sample mfschunkserver.cfg
# vim mfschunkserver.cfg
MASTER_HOST = 10.10.10.15 #指定MFS-Master服务器地址
MASTER_PORT = 9420 #指定MFS-Master服务器端口
HDD_CONF_FILENAME = /usr/local/mfs/etc/mfs/mfshdd.cfg
#指定提供存储的位置文件位置
# 创建挂载点目录
mkdir /mnt/sdb1
# 修改MFS服务HDD路径
# vim /usr/local/mfs/etc/mfs/mfshdd.cfg
/mnt/sdb1
# 分区、挂载、格式化
fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
mount /dev/sdb1 /mnt/sdb1/
chown -R mfs.mfs /mnt/sdb1
# 启动
mfschunkserver start
6.MFS维护操作
垃圾回收站
# 一个删除文件能够存放在一个“垃圾箱”的时间就是一个隔离时间
# 可以使用mfsgettrashtime命令来查看
# 设置时间命令:mfsgettrashtime 时间 文件名
[root@019 mfs]# mfssettrashtime 60000 1.txt
1.txt: 60000
[root@019 mfs]# mfsgettrashtime 1.txt
1.txt: 61200
# 时间的单位为秒;0表示文件删除后,将被彻底删除
# 还原文件
[root@019 mfs]# rm -rf 1.txt
[root@019 mfs]# mkdir /mnt/mfsmeta
[root@019 mfs]# mfsmount -m /mnt/mfsmeta -H 10.10.10.15
mfsmaster accepted connection with parameters: read-write,restricted_ip
[root@019 mfs]# cd /mnt/mfsmeta/
[root@019 mfsmeta]# ls
sustained trash
# trash目录包含任意可以被还原的被删除文件的信息
# trash/undel 用户获取文件
#
# 被删除文件的文件名在“垃圾箱”目录里由一个八位十六进制的数i-node和被删除文件的为文件名组成,中间用|分割
# 将挂载目录 /mnt/mfsmeta下的文件用tree重定向到一个文件内,便于查找删除的文件
[root@019 mfsmeta]# tree /mnt/mfsmeta/trash/ > ~/1.txt
# vim ~/1.txt
# 找到文件
├── 004
│ ├── 00000004|1.txt
│ └── undel
# 还原文件
[root@019 trash]# mv /mnt/mfsmeta/trash/004/00000004|1.txt /mnt/mfsmeta/trash/undel/
[root@019 trash]# cd /mnt/mfs
[root@019 mfs]# ls
1.txt 2.txt 3.txt
[root@019 mfs]# cat 1.txt
11dasdafw
# 还原文件夹方法相同
快照
# mfsmakesnapshot source destination
mkdir snap
[root@019 mfs]# mfsmakesnapshot 1.txt snap/
# mfsmakesnapshot是在一次执行中整合了一个或是一组文件的拷贝,修改源文件不影响快照,反之亦然
master还原
# 从matelogger中拷贝到matser
# 使用mfsmaster -a
最安全的启动步骤:
- 启动mfsmaster进程
- 启动所有的mfschunkserver进程
- 启动mfsmetalogger进程
- 当所有chunkserver连接到master后,客户端进行挂载
最安全的停止步骤:
- 客户端卸载
- 停止chunkserver stop
- 停止metalogger stop
- 停止master stop