MFS 分布式对象存储
高级存储:块存储、对象存储
块存储:将服务器上的底层存储资源共享给多个客户端使用,使用集群模式进行存储空间管理
对象存储:将多台服务器的存储资源交由一个统一的管理中心进行调度,有调度中心决定数据存储的方案
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。一个典型的网络可能包括多个供多用户访问的服务器。
官网:http://ppa.moosefs.com/src/
一、MooseFS优越特性如下
Free(GPL)通用文件系统
- 可以在线扩容,体系架构可伸缩性极强。
- 部署简单。
- 高可用,可设置任意的文件冗余程度(提供比raid10更高的冗余级别,而绝对不会影响读或者写的性能,只会加速)
- 可回收在指定时间内删除的文件(“回收站”提供的是系统级别的服务,不怕误操作了,提供类似即时回滚特性)
- 提供了类似于EMC,IBM等商业存储的snapshot(快照)特性。(可以对整个文件甚至在正在写入的文件创建文件的快照)
二、MFS 工作原理和设计架构
角色 | 角色作用 |
管理服务器 managing server (master) | 负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复、多节点拷贝 |
元数据日志服务器 Metalogger serve(Metalogger) | 负责备份master 服务器的变化日志文件,文件类型为changelog_ml.*.mfs ,以便于在master server 出问题的时候接替其进行工作 |
数据存储服务器 data servers (chunk servers) | 负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数据传输. |
客户机挂载使用 client computers | 通过fuse 内核接口挂接远程管理服务器上所管理的数据存储服务器,看起来共享的文件系统和本地unix 文件系统使用一样的效果. |
MFS的读数据过程
- 当client需要数据时,首先向master server发起查询请求
- 管理服务器检索自己的数据,获取到数据所在的可用数据服务器位置ip|port|chunkid
- 管理服务器将数据服务器的地址发送给客户端
- 客户端向具体的数据服务器发起数据获取请求
- 数据服务器将数据发送给客户端
MFS的写数据过程
- 当客户端有数据写需求时,首先向管理服务器提供文件元数据信息请求存储地址(元数据信息如:文件名|大小|份数等)
- 管理服务器根据写文件的元数据信息,到数据服务器创建新的数据块
- 数据服务器返回创建成功的消息
- 管理服务器将数据服务器的地址返回给客户端(chunkIP|port|chunkid)
- 客户端向数据服务器写数据
- 数据服务器返回给客户端写成功的消息
- 客户端将此次写完成结束信号和一些信息发送到管理服务器来更新文件的长度和最后修改时间
MFS的修改或删除文件过程
- 客户端有删除操作时,首先向Master发送删除信息
- Master定位到相应元数据信息进行删除,并将chunk server上块的删除操作加入队列异步清理
- 响应客户端删除成功的信号MFS修改文件内容的过程客户端有修改文件内容时,首先向Master发送操作信息
- Master申请新的块给.swp文件,客户端关闭文件后,会向Master发送关闭信息
- Master会检测内容是否有更新,若有,则申请新的块存放更改后的文件,删除原有块和.swp文件块
- 若无,则直接删除.swp文件块。
MFS重命名文件的过程
- 客户端重命名文件时,会向Master发送操作信息
- Master直接修改元数据信息中的文件名
- 返回重命名完成信息
MFS遍历文件的过程
- 遍历文件不需要访问chunk server,当有客户端遍历请求时,向Master发送操作信
- Master返回相应元数据信息
- 客户端接收到信息后显示
注:
- Master记录着管理信息,比如:文件路径|大小|存储的位置(ip,port,chunkid)|份数|时间等,元数据信息存在于内存中,会定期写入metadata.mfs.back文件中,定期同步到metalogger,操作实时写入changelog.*.mfs,实时同步到metalogger server中。master启动将metadata.mfs载入内存,重命名为metadata.mfs.back文件。
- 文件以chunk大小存储,每chunk最大为64M,小于64M的,该chunk的大小即为该文件大小(验证实际chunk文件略大于实际文件),超过64M的文件将被切分,以每一份(chunk)的大小不超过64M为原则;块的生成遵循规则:目录循环写入(00-FF 256个目录循环,step为2)、chunk文件递增生成、大文件切分目录连续。
- Chunkserver上的剩余存储空间要大于1GB,新的数据才会被允许写入,否则,你会看到No space left on device的提示,实际中,测试发现当磁盘使用率达到95%左右的时候,就已经不行写入了,当时可用空间为1.9GB。
- 文件可以有多份copy,当goal为1时,文件会被随机存到一台chunkserver上,当goal的数大于1时,copy会由master调度保存到不同的chunkserver上,goal的大小不要超过chunkserver的数量,否则多出的copy,不会有chunkserver去存。
mfsmaster.cfg 详解
WORKING_USER = mfs
WORKING_GROUP = mfs
SYSLOG_IDENT = mfsmaster #在syslog中的表示,说明这是mfsmaster产生的
LOCK_MEMORY = 0 # 是否执行mlockall()以避免mfsmaster内存溢出(默认为0)
NICE_LEVEL = -19 # 运行的优先级(默认-19,范围:-19-20,注意,这进程必须是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
注意:
- 凡是用#注释掉的变量均使用其默认值
- 修改DATA_PATH指定的目录要权限为mfs,chown -R mfs:mfs /usr/local/mfs/var/mfs
- mfsexports 访问控制对于那些老用户是没用的
- 注意开通监听的端口
mfsmaster:
9419:给mfsmetalogger服务器连接使用的
9420:给mfschunkserver服务器连接使用的
9421:给mfsclient客户端链接使用的
9425:web信息展示的页面放问端口
mfschunkserver:
9422:给mfsclient客户端链接{数据存储&下载}的端口
MFS安装配置使用
实验准备:
IP | 身份 |
192.168.9.101 | Master server |
192.168.9.102 | Metalogger server |
192.168.9.103 | Chunk server 1 |
192.168.9.104 | Chunk server 2 |
192.168.9.106 | Client server |
一、MFS基础配置
Master server:192.168.9.101
1.上传/下载安装包,安装
官网:http://ppa.moosefs.com/src/
yum -y install gcc zlib-devel
useradd -r -s /sbin/nologin mfs
tar -xf moosefs-3.0.101-1.tar.gz
cd moosefs-3.0.101
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
make
make install
3.配置
ln -s /usr/local/mfs/bin/* /usr/local/bin/
ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
cd /usr/local/mfs/etc/mfs
cp -a mfsmaster.cfg.sample mfsmaster.cfg
cp -a mfstopology.cfg.sample mfstopology.cfg
cp -a mfsexports.cfg.sample mfsexports.cfg
vim mfsexports.cfg
无需修改,示例:
#客户端IP 允许挂载的目录 客户端拥有的权限
192.168.0.0/24 / rw,alldirs,maproot=0:0 # /标识MFS的根
192.168.0.0/24 . rw # .标识MFSMETA 文件系统
# ip:*、单IP、网段、IP范围都可
# 权限:
ro 只读模式共享
rw 读写方式共享
alldirs 允许挂载任何指定的子目录
maproot 映射为root用户组还是指定的用户组
password 指定客户端密码
4.管理
cd /usr/local/mfs/var/mfs
cp -a metadata.mfs.empty metadata.mfs
mfsmaster start
netstat -antp|grep mfsmaster
注意:最好不要kill master,安全停止执行mfsmaster stop,否则下次启动因metadata.mfs.back而出现问题,还需要使用备份来恢复。
scp moosefs-3.0.101-1.tar.gz 192.168.9.其他机器IP:/root
Metalogger server:192.168.9.102
1.安装
同mfsmaster
yum -y install gcc zlib-devel
useradd -r -s /sbin/nologin mfs
tar -xf moosefs-3.0.101-1.tar.gz
cd moosefs-3.0.101
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
make
make install
2.配置
ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
cd /usr/local/mfs/etc/mfs
cp -a mfsmetalogger.cfg.sample mfsmetalogger.cfg
vim mfsmetalogger.cfg
#取消注释并修改
META_DOWNLOAD_FREQ = 2
# 元数据备份文件下载请求频率,默认是24小时,修改后为每2小时从master server上下载一个metadata.mfs文件,当元数据服务器关闭或者故障的时候,metadata.mfs.back文件将消失,此时需要从元数据日志服务器中取得这个文件。注意,这个文件和日志文件共同使用才能恢复整个已损坏的分布式文件系统...只需要更改上面2行就行了,其他保持默认即可如果没有特殊要求。
MASTER_HOST = 192.168.9.101 |
# master server 的地址
3.管理
-启动命令
mfsmetalogger start
lsof -i :9419
# 确保端口在使用中
-查看工作目录下是否有元数据文件
#此时还没有Chunk server
cd /usr/local/mfs/var/mfs/
ls
Chunk server:192.168.9.103&104
同步操作:工具—发送键输入到所有会话
1.安装
#这里./configure指定不安装mfsmaster,其他安装同mfsmaster
yum -y install gcc zlib-devel
useradd -r -s /sbin/nologin mfs
tar -xf moosefs-3.0.101-1.tar.gz
cd moosefs-3.0.101
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount
make
make install
2.配置
ln -s /usr/local/mfs/bin/* /usr/local/bin/
ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
cd /usr/local/mfs/etc/mfs
cp -a mfschunkserver.cfg.sample mfschunkserver.cfg
vim mfschunkserver.cfg
#只需修改MASTER_HOST(必须修改不能添加):
MASTER_HOST = 192.168.9.101 #指明master服务器地址,要修改
MASTER_PORT = 9420 #指明master server 端口(取消注释)
HDD_CONF_FILENAME = /usr/local/mfs/etc/mfs/mfshdd.cfg
#这个指明哪个配置文件来配置共享磁盘(取消注释)
cp -a mfshdd.cfg.sample mfshdd.cfg
vim mfshdd.cfg
#添加挂载点
/chunkdisk/sdb1
-关机添加硬盘,设置分区,格式化挂载
#添加一块磁盘并创建分区,然后挂载到指定的挂载点下(使用ext4文件系统格式化)
shutdown -h now
fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
mkdir -p /chunkdisk/sdb1
echo '/dev/sdb1 /chunkdisk/sdb1 ext4 defaults 0 0' >>/etc/fstab
mount -a
chown -R mfs.mfs /chunkdisk/sdb1
df -h
3.管理
-启动
mfschunkserver start
ps -ef | grep mfs
Client server:192.168.9.106
1.安装
yum -y install gcc zlib-devel fuse fuse-devel fuse-libs
useradd -r -s /sbin/nologin mfs
tar -xf moosefs-3.0.101-1.tar.gz
cd moosefs-3.0.101
./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver
make
make install
2.测试
ln -s /usr/local/mfs/bin/* /usr/local/bin/
ln -s /usr/local/mfs/sbin/* /usr/local/sbin/
mkdir /mfsclient
mfsmount /mfsclient/ -H 192.168.9.101
# -H 指定 master server IP
df -h
二、MFS高级特性
MFS设置goal冗余(副本)
-客户端写入数据:
cd /mfsclient/
echo "hello" >a.txt
-两个Chunk server查看,两个server端都有数据
cd /chunkdisk/sdb1/00
cat chunk_0000000000000001_00000001.mfs
-通过mfsgetgoal 命令来查看文件保存数量
mfsgetgoal a.txt
#可以看到默认为2份
-使用mfssetgoal目录修改指定文件的份数
mfssetgoal -r 1 a.txt
#-r 可以实现对目录树结构的递归
#每个Chunk server轮询一份,超出重复轮询保存
#若-r后的份数少于之前保存的,则按保存顺序删除:先保存的先删除,这里先删除了Chunk server1的数据
MFS垃圾回收站
1.一个删除文件能够存放在一个“ 垃圾箱”的时间就是一个隔离时间
-这个时间可以用mfsgettrashtime 命令来验证
mfsgettrashtime /mfsclient/
-也可以用mfssettrashtime 命令来设置
#设置为一周:
mfssettrashtime 604800 /mfsclient/a.txt
mfsgettrashtime /mfsclient/a.txt
- 时间的单位是秒(有用的值有:1 小时是3600 秒,24 - 86400 秒,1周 - 604800 秒)。就像文件被存储的份数一样, 为一个目录设定存放时间是要被新创建的文件和目录所继承的。数字0 意味着一个文件被删除后, 将立即被彻底删除,再想回收是不可能的。
2.安装MFSMETA文件系统查看删除的文件
- 它包含目录/trash (包含可以被还原的被删除文件的信息)和/trash/undel (用于获取文件),只有管理员有权限访问MFSMETA(用户的uid 0,通常是root)
- 之前删除的文件在挂载MFSMETA系统后也能看到
-创建目录挂载MFSMETA文件系统
mkdir /mfsclient/mfsmeta
mfsmount -m /mfsclient/mfsmeta -H 192.168.23.100
df -h
3.被删文件的文件名在“垃圾箱”目录里
- 文件名由一个八位十六进制的数i-node 和被删文件的文件名组成,在文件名和i-node 之间不是用“/”,而是用了“|”替代。
- 如果一个文件名的长度超过操作系统的限制(通常是255 个字符),那么部分将被删除。通过从挂载点起全路径的文件名被删除的文件任然可以被读写。
-删除测试文件a.txt,查看
rm -rf a.txt
find ./ -name *a.txt
cat /mfsclient/mfsmeta/trash/002/00000002\|a.txt
4.恢复被删除的文件
-移动这个文件到trash/undel 子目录下,将会使原始的文件恢复到正确的MooseFS文件系统上路径下(如果路径没有改变)
注:如果在同一路径下有个新的同名文件,那么恢复不会成功
cd /mfsclient/mfsmeta/trash
mv 002/00000002\|a.txt ./undel
cd /mfsclient/;ls
cat a.txt
MFS启动和关闭
1.启动MFS集群
- 最安全的启动MooseFS 集群(避免任何读或写的错误数据或类似的问题)的方式是按照以下命令步骤:
- 启动mfsmaster 进程
- 启动所有的mfschunkserver 进程
- 启动mfsmetalogger 进程(如果配置了mfsmetalogger)
- 当所有的chunkservers 连接到MooseFS master 后,任何数目的客户端可以利用mfsmount 去挂接被export 的文件系统。(可以通过检查master 的日志或是CGI 监视器来查看是否所有的chunkserver被连接)
2.停止MFS集群
- 安全的停止MooseFS 集群:
- 在所有的客户端卸载MooseFS 文件系统(用umount 命令或者是其它等效的命令)
- 用mfschunkserver stop 命令停止chunkserver 进程
- 用mfsmetalogger stop 命令停止metalogger 进程
- 用mfsmaster stop 命令停止master 进程
MFS master故障修复
一旦mfsmaster 崩溃(例如因为主机或电源失败),需要最后一个元数据日志changelog 并入主要的metadata 中。这个操作时通过mfsmetarestore 工具做的,最简单的方法是:
[root@localhost ~]# /usr/local/mfs/bin/mfsmetarestore -a
[root@localhost ~]# mfsmaster -a #此命令替代了mfsmetarestore -a
如果master 数据被存储在MooseFS 编译指定地点外的路径,则要利用-d 参数指定使用,如:
[root@localhost ~]# /usr/local/mfs/bin/mfsmetarestore -a -d /opt/mfsmaster
MFS master 启动监控服务
1.启动命令
/usr/local/mfs/sbin/mfscgiserv
2.使用浏览器访问master:9425,注意master主机名(localhost或主机ip)
http://192.168.9.101:9425
-可以看到两个Chunk server