文章目录
官方网站:
- 首页:https://moosefs.com
- 软件资源:https://moosefs.com/download/#current
- 用户手册:https://moosefs.com/support/#documentation
简介
- MFS:MooseFS,是一个具备冗余容错功能的分布式网络文件系统,它将数据分别存放在多个物理服务器或单独磁盘或分区上,确保一份数据有多个备份副本。对于访问的客户端或者用户来说,整个分布式网络文件系统集群看起来就像一个资源一样。
- 对于标准文件操作来说,MooseFS与其他类似Unix的文件系统相似的地方:
- 层次结构(目录树)
- 存储POSIX文件属性(权限,上次访问和修改时间)
- 支持特殊文件(块和字符设备,管道和套接字)
- 符号链接(指向目标文件的文件名,不一定在MooseFS上)和硬链接链接(引用MooseFS上相同数据的文件的不同名称)
- 可以根据IP地址和/或密码来限制对文件系统的访问
- MooseFS的独特功能:
- 高可靠性(数据的多个副本可以存储在单独的物理机上)
- 通过添加新的计算机/磁盘可动态扩展容量
- 删除的文件将保留一段可配置的时间(文件系统级别的“垃圾箱”)
- 即使正在写入/访问文件时,文件的连贯快照也不会被影响
使用场景
- 存在的优势:
- MFS是基于FUSE(用户空间文件系统)机制的,所以支持含有FUSE的操作方式的系统
- MFS部署简单并提供Web界面的方式进行管理与监控,同其他分布式操作系统一样,支持在线扩容,并进行横向扩展
- MFS还具有可找回误操作删除的文件,相当于一个回收站,方便业务进行定制
- 同时MooseFS对于海量小文件的读写要比大文件读写的效率高的多
- 存在的问题:
- MFS的主备架构情况类似于MySQL的主从复制,从可以扩展,主却不容易扩展
- 随着MFS体系架构中存储文件的总数上升,Master Server对内存的需求量会不断增大
- Master Server存在单点问题,官方解决方式是把数据信息从Master Server同步到Metalogger Server上,Master Server一旦出问题Metalogger Server可以恢复升级为Master Server,但是需要恢复时间,解决方式属于冷备。目前,也可以通过第三方的高可用方案(peachmaker+moosefs)来解决 Master Server 的单点问题
MFS组成
组件名称 | 英文 | 软件 | 功能 |
---|---|---|---|
管理服务器 | Master Servers | moosefs-master moosefs-cgi moosefs-cgiserv moosefs-cli | 在整个体系中负责管理文件系统,维护元数据,目前不支持高可用 元数据(metadata)信息包括文件(也可以是目录、socket、管道、设备等)的大小、属性、文件位置路径等,以及文件空间的回收和恢复,控制多chunk server节点的数据拷贝 |
数据存储服务器 | Chunk Servers | moosefs-chunkserver | 存放数据文件实体的服务器了,这个角色可以有多台不同的物理服务器或不同的磁盘及分区来充当 当配置数据的副本多于一份时,在写入到一个数据服务器后,会根据算法在其他数据服务器上进行同步备份 真正存储数据的服务器,服务器越多,容量就越大,可靠性越高,性能越好 |
元数据日志服务器 | Metaloggers | moosefs-metalogger | 作用是备份管理服务器master的变化的metadata信息日志文件,文件类型为changelog_ml.*.mfs,以便于在主服务器出现问题的时候,可以经过简单的操作即可让新主服务器进行工作 类似Mysql的主从同步,只不过他不像mysql从库那样在本地应用数据,而只是接收主服务器上文件写入时记录的文件相关的metadata信息 这个backup可以有一台或多台 |
客户端 | Clients | moosefs-client | 挂载并使用mfs文件系统的客户端,当读写文件时,客户端首先连接主管理服务器获取数据的metadata信息,然后根据得到的metadata信息,访问数据服务器读取或写入文件实体 mfs客户端通过FUSE mechanism实现挂载MFS文件系统的。因此,只要系统支持FUSE,就可以作为客户端访问MFS整个文件系统。所谓的客户端并不是网站用户,而是前端访问文件系统的应用服务器,如web |
MFS处理逻辑
读取数据的过程
- 上图 Master Server用三角形表示;Chunk Server用圆形表示;Client 用正方形表示
- 整个读过程如上图有以下四个步骤:
- 首先客户端(client)访问主服务器(master),获取文件实体的位置等相关信息
- 主服务器(master)查询缓存记录,把文件实体的位置(如存在XX数据服务器上)等相关信息发给客户端(client)
- 客户端(client)根据拿到的信息去访问对应的存储实体数据的服务器(chunk servers)
- 存储实体数据的服务器(chunk servers)把对应的数据返回给客户端(client)
- 通过图中图形还可以看出,当多个MFS客户端读数据的时候,master服务器充当路由为这些客户端分发指路的作用,而数据的返回时由不同的数据服务器直接返回给请求的客户端,这样的模式可以极大的减轻主服务器的系统及网络瓶颈,增加了整个系统的吞吐
写入数据的过程
- 上图 Master Server用三角形表示;Chunk Server用圆形表示;Client 用正方形表示
- 整个读过程如上图有以下8个步骤:
- 客户端访问主服务器,请求写入数据
- 根据数据是否为第一次写入进行判断,若为第一次写入跳转2a,若不为第一次写入,直接反馈数据存储服务器信息
2a. 主服务器查询缓存记录,如果是新文件,则会联系服务器创建对应的chunk对象准备存放文件
2b. 数据服务器返回创建对应的chunk对象成功给主服务器。 - 主服务器把文件实体的位置等相关信息发给客户端
- 客户端访问对应的数据服务器写数据
- 数据服务器之间进行数据同步
- 存储数据的数据库服务器之间互相确认成功
- 数据服务器返回成功写入信息给客户端
- 客户端回报给主服务器写入结束
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文件递增生成、大文件切分目录连续。
-
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集群
启动 MooseFS 集群
- 启动 mfsmaster 进程
- 启动所有的 mfschunkserver 进程
- 启动 mfsmetalogger 进程(如果配置了mfsmetalogger)
- 当所有的 chunkservers 连接到 MooseFS master 后,任何数目的客户端可以利用 mfsmount 去挂载被 export 的文件系统。(可以通过检查 master 的日志或是 CGI 监控页面来查看是否所有的chunkserver 被连接)。
停止 MooseFS 集群
- 在所有的客户端卸载MooseFS 文件系统(用umount命令或者是其它等效的命令)
- 用 mfschunkserver –s命令停止chunkserver进程
- 用 mfsmetalogger –s命令停止metalogger进程
- 用 mfsmaster –s命令停止master进程
默认端口设定
master:9419(matelogger)、9420(chunkserver)、9421(client)、9425(cgi)
chunkserver:9419(master控制)、9420(master命令)、9422(client)
matelogger:9420(master)
MFS元数据备份
- 通常元数据有两部分的数据:
- 主要元数据文件metadata.mfs,当mfsmaster 运行的时候会被命名为metadata.mfs.back
- 元数据改变日志changelog.*.mfs,存储了过去的N 小时的文件改变(N 的数值是由BACK_LOGS参数设置的,参数的设置在mfschunkserver.cfg 配置文件中)。
- 主要的元数据文件需要定期备份,备份的频率取决于取决于多少小时changelogs 储存。元数据changelogs 实时的自动复制。1.6版本中这个工作都由metalogger完成。
常用命令
mfsgetgoal #获取副本数设定
mfssetgoal #设定副本数
mfsgettrashtime #获取回收站时间
mfssettrashtime #设定回收站时间
mfscheckfile #检查文件
mfsfileinfo #文件信息
mfsdirinfo #目录信息
mfsfilerepair #文件修复
mfsmakesnapshot #快照
mfsgeteattr #获取权限设置信息
mfsseteattr #设置权限
mfsscadmin #设定储存类
mfssetclass #设置存储类与文件目录的绑定
mfsxchgsclass #更新储存类设定
存储类(storage class)
概念
- 存储类:storage class,允许指定文件的chunks存放在具有标签(label)定义的chunkservers上。
- 标签:label,储存类使用label对chunkserver进行定义,然后使用label表达式对副本存储方式进行储存类设定
服务器打标签
- 要求:
- label仅能使用(A-Z 的26个大写字母)来定义chunkserver
- 每个chunkserver可以被打上多个标签(即标记上多个字母,但最多可以打26个label)
- 方式:
- 给chunkserver打label,需要先修改相应chunkserver的配置文件 /etc/mfs/mfschunkserver.cfg,编辑该配置文件,将LABELS = A前面的注释符号去掉,并设置上你想要的标签;若想为chunkserver设置多个标签,则如下三种方式都可以:
LABELS = XYZ
或LABELS = X Y Z
或LABELS = X, Y, Z
(三种方式定义效果一样,都是给服务器打上了X|Y|Z三个标签) - 标签设置好后,需要通知chunkserver进程配置文件更新达到效果,使用如下两个命令均可
service moosefs-pro-chunkserver reload
或mfschunkserver reload
- 给chunkserver打label,需要先修改相应chunkserver的配置文件 /etc/mfs/mfschunkserver.cfg,编辑该配置文件,将LABELS = A前面的注释符号去掉,并设置上你想要的标签;若想为chunkserver设置多个标签,则如下三种方式都可以:
存储类设定
- 存储类设定:通过标签表达式来对副本存储方式进行设定,完整的标签表达式可以由多个子表达式构成,每个子标签之间用逗号分隔,每个子表达式特指一个文件副本的一种存储模式。子表达式可以为星号*表示任意标签;相同的子表达式可以通过在表达式前加数字的方式来表示,而不用重复显示声明多次。
- 标签表达式:label schema,是一个label或由字母与加法、乘法和括号构成的复杂表达式。
- 加法:’+’ ,是逻辑“或”的含义,即文件的副本可以被存放在任意含有加法元素label的chunkserver上。例如,一个文件的storage class是A+B+C,那么任何含有A、B或C标签的chunkserver都可以用来存储该文件的副本。
- 乘法:是逻辑“与”的含义,即文件的副本仅可以存放在包含所有label的chunkserver上。例如,一个文件的storage class是ABC,那么只有当一台chunkserver同时含有ABC三个标签时,它才能用于存放该文件的副本。
- 标签表达式例子:
A,B
:存储文件将具有两个副本,一个副本将存储在带有标签A的块服务器上,另一个在标签为B的服务器上A,*
:文件将具有两个副本,一个副本将存储在标签为A的服务器上,另一个将储存在集群内的任何一台服务器上*,*
:文件将有两个副本,存储在集群内任何服务器上(每个副本不同)AB,C + D
:文件将具有两个副本,一个副本将存储在具有标签A和B的服务器上(标签的乘用法),另一个将存储在服务器上具有C标签或D标签(标签的和用法)A,B [X + Y],C [X + Y]
:文件将具有三个副本,一个副本将存储在任意一个带有A标签的服务器上,第二个在具有B标签和X或Y标签(即BX或BY)的服务器上,第三个副本存储在具有C标签和X或Y标签(即CX或CY)的服务器上A,A
:表达式等于2A
表达式A,BC,BC,BC
:表达式等效于A,3BC
表达式*,*
:表达式等于2 *
表达式,等于2
表达式
定义存储类样例:
# 首先,mount一个mfs卷
mount -t moosefs mfsmaster.test.lan: /mnt/mfs
#然后,进入到mount点的目录下
cd /mnt/mfs
#假设我们希望将文件的2个副本存放在带有label A的chunkserver上,则可以创建storage class如下:
mfsscadmin create 2A sclass1
#上面这条命令的含义为:每一个属于sclass1的文件,将会拥有2个副本,其中每个副本将存放在带有标签A的chunkserver上。
#类似的,可以创建另一个storage class,让文件再生成2个副本存放在带有标签B的chunkserver上。
mfsscadmin create 2B sclass2
#此外,不一定要cd到mount的目录中进行storage class的创建,也可以通过显示指定目录的方式来给文件创建storage class,例如:
mfsscadmin /mnt/mfs create 2B sclass2
显示存储类样例:
#列出某个mfs目录拥有的storage class列表,也可以通过加上-l参数来获取相信的信息
mfsscadmin list
使用储存类样例:
#将storage class配置到文件或目录上,有很多个命令工具都可以为文件或目录配置storage class:
mfsgetsclass, mfssetsclass, mfscopyclass, mfsxchgsclass, mfslistclass
#现在,可以将一些数据存入mfs中了。创建两个目录dataX dataY:
cd /mnt/mfs
mkdir {dataX,dataY}
#为dataX目录添加sclass1这个storage class:
mfssetsclass sclass1 dataX
#执行该指令后,dataX及其子目录中所有的目录和文件将自动根据sclass1策略来存储文件。
#同样的,为dataY分配sclass2这一storage class:
mfssetsclass sclass2 dataY