【Linux集群教程】06 分布式存储 - MFS

5 分布式存储之 MFS

5.1 什么是MFS?

5.1.1 MFS 相关介绍

MooseFS 是一个具备冗余 (良性冗余:非常重要的文件备份多个) 容错功能的分布式网络文件系统,它将数据分别存放在多个物理服务器或单独磁盘或分区上,确保一份数据有多个备份副本,然而对于访问 MFS 的客户端或者用户来说,整个 分布式网络文件系统集群看起来就像一个资源一样,从其对文件系统的情况看 MooseFS 就相当于 UNIX 的文件系统。

  • 冗余:设置一个文件保存到几个节点上,当一个或者多个节点宕机以后,并不会影响对该文件的丢失和访问;
  • 容错:当误删除一个文件还是可以进行恢复的。

MooseFS 是一种分布式文件系统,基于Linux内核,提供整套分布式文件服务。单个文件就是MooseFS存储的最小单位,不会将文件进行劈开,或者是拆分成多份打散了分布在各个节点。

GitHub 项目地址:https://github.com/moosefs/moosefs

MFS已经是十分老的分布式存储网络文件系统,目前已经被新兴的 Ceph、GlusterFS、FastDFS所取代。

对比说明/文件系统TFSFastDFSMogileFSMooseFS (MFS)GlusterFSCeph
开发语言C++CPerlCCC++
开源协议GPL V2GPL V3GPLGPL V3GPL V3LGPL
数据存储方式文件/Trunk文件文件/块对象/文件/块
集群节点通信协议私有协议(TCP)私有协议(TCP)HTTP私有协议(TCP)私有协议(TCP)/ RDAM(远程直接访问内存)私有协议(TCP)
专用元数据存储点占用NS占用DB占用MFS占用MDS
在线扩容支持支持支持支持支持支持
冗余备份支持支持-支持支持支持
单点故障存在不存在存在存在不存在存在
跨集群同步支持部分支持--支持不适用
易用性安装复杂,官方文档少安装简单,社区相对活跃-安装简单,官方文档专业化安装简单,官方文档专业化安装简单,官方文档专业化
适用场景跨集群的小文件单集群的中小文件-单集群的大中文件跨集群云存储单集群的大中小文件

5.1.2 MFS 的特征说明

  • 高可靠性: 每一份数据可以设置多个备份(多分数据),并可以存储在不同的主机上
  • 高可扩展性: 可以很轻松的通过增加主机的磁盘容量或增加主机数量来动态扩展整个文件系统的 存储量
  • 高可容错性: 我们可以通过对 mfs 进行系统设置,实现当数据文件被删除后的一段时间内,依旧存放于主机的回收站中,以备误删除恢复数据
  • 高数据一致性: 即使文件被写入、访问时,我们依然可以轻松完成对文件的一致性快照
  • 自带Web GUI的监控接口
  • 提高随机读或者写效率和海量小文件的读写效率

5.1.3 MFS 缺点

  • master 目前是单点(社区版免费版的 Master节点是单点的,可以使用 keepalived | Heartbeat 第三方进行高可用,而企业版Master是可以进行高可用的部署),虽然会把数据信息同步到备份服务器,但是恢复需要时间
  • master 服务器对主机的内存要求略高
  • 默认 Metalogger server 复制元数据时间(即完整的备份/拷贝)较长(可调整)
  • Master Server本身的性能瓶颈。MFS的主备架构情况类似于MySQL的主从复制,从可以扩展,主却不容易扩展。短期的对策就是按照业务来做切分。

内存使用问题

对于 Master 服务器来说,资源型要求就是内存大小,为了整个系统访问更快,mfs 会把所以访问 的元数据 metadada 信息放在内存中提供用户访问,因此,当文件数量增加时,内存使用量就会增加, 根据官方说法,处理一百万个文件 chunkserver,大概需要 300M 的内存空间。据此,推算如果未来要 出来 1 个亿的文件 chunkserver,大概需要 30G 内存空间。

5.1.4 MFS 的应用场景

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

5.2 MFS 组件说明

5.2.0 MFS 结构架构图

imgimg

5.2.1 管理服务器(Master)

管理服务器 managing server 简称 master :这个组件的角色是管理整个 mfs 文件系统的主服务器,除了分发用户请求外,还用来存储整个文件系统中每个数据文件的 metadata 信息,metadate(元数据) 信息包括文件(也可以是目录,socket,管道,块设备等)的大小,属性,文件的位置路径等

总结:MFS Master 主要是用来存储数据的 metadata 元数据信息。所有的用户请求必须要经过 MFS Master 节点才能去访问后端真正存放真实数据的chunk server。

5.2.2 元数据备份服务器(Metalogger)

元数据备份服务器 Metadata backup servers 简称 metalogger: 这个组件的作用是备份管理服务器 master 的变化的 metadata 信息日志文件,文件类型为 changelog_ml.*.mfs。以便于在管理服务器出问题时,可以经过简单的操作即可让新的主服务器进行工作

总结:MFS Metalogger 是用来实时跟 MFS Master 保持连接,来备份 Master 的元数据信息。

5.2.3 数据存储服务器组(Data)

数据存储服务器组 data servers(chunk servers)简称 data:这个组件就是真正存放数据文件实体的服务器了,这个角色可以有多台不同的物理服务器或不同的磁盘及分区来充当,当配置数据的副本多于 一份时,据写入到一个数据服务器后,会根据算法在其他数据服务器上进行同步备份

总结:chunk server 是用来真正存放真实数据的服务

5.2.4 客户机服务器组(Client)

客户机服务器组(client servers)简称 client:这个组件就是挂载并使用 mfs 文件系统的客户端,当读写文件时,客户端首先会连接主管理服务器获取数据的 metadata 信息,然后根据得到的 metadata 信息, 访问数据服务器读取或写入文件实体,mfs 客户端通过 fuse mechanism(用户空间文件系统,是由IBM 和 微软开发,可以在用户层构建文件系统,以及使用文件系统。原来的文件系统都是在内核态的,现在可以在用户空间里完成) 实现挂载 mfs 文件系统的,因 此,只有系统支持 fuse,就可以作为客户端访问 mfs 整个文件系统。

总结:客户端需要安装对应的文件系统的,底层使用的是 fuse mechanism 用户空间文件系统。

5.3 数据操作组件之间的协同过程

基础环境拓扑

img

5.3.1 MFS 的读数据过程

  1. Client 当需要一个数据时,首先向 Master server 发起查询请求;

  2. 管理服务器检索自己内存中的数据信息,获取到数据所在的可用数据服务器位置 chunkip | port | chunkid;

    1. ChunkIP:Chunk Server 的IP地址
    2. Port:Chunk Server 的端口号
    3. ChunkID:Chunk Server 对应的块中,例如一个ChunkServer中拥有多个子目录,那么到底是哪个子目录存放该数据,就需要ChunkID号进行标识。
  3. 管理服务器将数据服务器的地址发送给客户端;

  4. 客户端向具体的数据服务器发起数据获取请求;

  5. 数据服务器将数据发送给客户端;

5.3.2 MFS 的写数据过程

  1. 当客户端有数据写需求时,首先向管理服务器提供文件元数据信息请求存储地址(元数据信息如: 文件名|大小|份数等);
  2. 管理服务器根据写文件的元数据信息,到数据服务器创建新的数据块;
  3. 数据服务器返回创建成功的消息;
  4. 管理服务器将数据服务器的地址返回给客户端( chunkIP | port | chunkid );
  5. 客户端向数据服务器写数据;
  6. 数据服务器返回给客户端写成功的消息;
  7. 客户端将此次写完成结束信号和一些信息发送到管理服务器来更新元数据信息(文件的长度和最后修改时间);

5.3.3 MFS 的删除文件过程

  1. 客户端有删除操作时,首先向 Master 发送删除信息;
  2. Master 定位到自身存储的相应元数据信息进行删除,并将 Chunk Server 上块的删除操作加入到异步队列清理;等一段时间(管理员可自定义)后才会将该真实数据真正的删除。(相当于是垃圾箱的机制)
  3. 响应客户端删除成功的信号。

5.3.4 MFS 修改文件内容的过程

  1. 客户端有修改文件内容时,首先向 Master 发送操作信息;
  2. Master 到Chunk Server 上拷贝一个新块(是由旧的块[ 客户端要执行的数据 ]拷贝过来成新块,两者是一模一样的),Chunk Server 会将新块的地址信息告诉给 Master,Master 再将新的块的地址信息告诉给客户端,客户端再来打开这个新块,连接这个新块进行修改操作。(类似于Linux系统中 vim 打开文件后,其实是修改一个 .swp 是文件)申请新的块给 .swp 文件
  3. 客户端操作完该文件后要进行关闭文件后,会向 Master 发送关闭信息;
  4. Master 会检测内容是否有更新(区别),若有,则申请新的块(最新的块)存放更改后的文件(三级拷贝),删除原有块和 .swp 文件块(新块),并且更新该文件的元数据信息,以及最新块的对应关系;
  5. 若无,则直接删除 .swp 文件块(新块),并且更新该旧块的元数据信息(时间戳);

5.3.5 MFS 重命名文件的过程

  1. 客户端重命名文件时,会向 Master 发送操作信息;
  2. Master 直接修改元数据信息中的文件名;返回重命名完成信息;

5.3.6 MFS 遍历文件的过程

  1. 遍历文件不需要访问 Chunk server,当有客户端遍历请求时,向 Master 发送操作信息;
  2. Master检索自身内存中的数据信息,检索完成以后并返回相应元数据信息;
  3. 客户端接收到信息后显示;

5.4 补充描述

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

  2. 文件以 chunk 大小存储,每 chunk 最大为 64M,小于 64M 的,该 chunk 的大小即为该文件大小(验证实际 chunk 文件略大于实际文件),超过 64M 的文件将被切分,以每一份(chunk)的大小不超过 64M 为原则;块的生成遵循规则:目录循环写入(00-FF 256 个目录循环,step 为 2)、chunk 文件递增生成、大文件切分目录连续。

    1. 当文件小于或者等于 64 MB,那么就用一个 chunk 进行存储;当文件大于 64MB,就需要使用多个 chunk 进行存储。注意会将一个chunk写满才会写到下一个chunk中。例如100MB的文件,会先写满64MB的一个chunk,剩下的36MB就写到了一个chunk中。
  3. Chunkserver 上的剩余存储空间要大于 1GB(Reference Guide 有提到),新的数据才会被允许写入, 否则,你会看到 No space left on device 的提示,实际中,测试发现当磁盘使用率达到 95%左右的时候, 就已经不行写入了,当时可用空间为 1.9GB 。

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

    1. 例如:存放一个1.txt的文件,并且将 Goal 设置为 1,那么Master就会写到一个ChunkServer上(单台的);
    2. 存放1.txt文件,但Goal 设置为 2,Master 会将数据写到 ChunkServer 上,然后将该ChunkServer的数据同步到另一台的ChunkServer。保证 Goal 值为2,副本数为2。那么有一台ChunkServer 宕机了,那么Master会将数据同步到第三台ChunkServer,始终保证Goal期望值为2;等到宕机的ChunkServer救活以后,这将导致 Goal 值为 3,Master会将其中一台的数据删除,保证 Goal 值为2。
    3. 当然如果集群中只有一台 ChunkServer,而 Goal 设置为2,其实是没有意义的,依旧只能保存一份数据。
    4. 注意:Goal值要小于或者等于 MFS 集群的ChunkServer 的数量。如果有条件的话,一般Goal值设置为3,是比较好的一个阈值。

5.5 MFS 集群构建

实验集群拓扑

img

五台服务器

  • 10.10.10.11→ MFS-Master
  • 10.10.10.12→ MFS-Metadata
  • 10.10.10.13→ MFS-Chunkserver1、新添加一块500G的硬盘
  • 10.10.10.14→ MFS-Chunkserver2、新添加一块500G的硬盘
  • 10.10.10.15→ MFS-Client

CentOS 6 操作系统软件包

所需软件百度网盘
链接:https://pan.baidu.com/s/1wfgE3ISFsBddoO2JuMdRiA
提取码:ton9

或者直接使用 SourceForge 网站下载:

CentOS 7 操作系统软件包

https://sourceforge.net/projects/moosefs/files/latest/download

以下操作会使用两种部署方式。CentOS 6是源码包进行部署,CentOS 7则是使用RPM包部署。

5.5.1 MFS - Master Server(10.10.10.11)

$ hostnamectl set-hostname master

###CentOS 6安装
yum -y install lrzsz zlib zlib-devel 
#方便把软件直接拖到xshell里面
#上传moosefs-3.0.84-1.tar.gz 镜像文件到家目录
$ tar zxf moosefs-3.0.84-1.tar.gz && cd moosefs-3.0.84
$ useradd -s /sbin/nologin -M mfs 
#创建 MFS 用户,用于 MFS 运行身份
$ ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs 
#编译安装 MFS 软件
$ make && make install && echo $?
$ chown -R mfs.mfs /usr/local/mfs/
$ chmod a+x /usr/local/mfs/sbin/* 
#优化配置,使 MFS 命令便于调用
$ ln -s /usr/local/mfs/sbin/* /usr/local/sbin/ ; ln -s /usr/local/mfs/bin/* /usr/local/bin/
$ cd /usr/local/mfs/etc/mfs 
#启用 MFS-Master 节点配置文件
$ cp -a mfsmaster.cfg.sample mfsmaster.cfg ; cp mfsexports.cfg.sample mfsexports.cfg 
#设置 MFS 挂载权限
$ vim mfsexports.cfg 
#最后一行添加
10.10.10.0/24 . rw,alldirs,maproot=0
#rw,读写权限
#.,表达MFS根文件系统
#alldirs,任何目录都允许挂载
#maproot=0,登陆就是root用户

$ cp -a /usr/local/mfs/var/mfs/metadata.mfs.empty /usr/local/mfs/var/mfs/metadata.mfs 
#拷贝 MFS 元数 据信息文件(初始) 
$ mfsmaster start 
#启动 MFS-Master 服务
$ mfscgiserv 
#开启web页面

##################################################################################################

###CentOS 7安装(需要联网)
wget --no-check-certificate \
https://master.dl.sourceforge.net/project/moosefs/3.0.103/moosefs-packages-all-3.0.103.tar.gz
tar -zxvf moosefs-packages-all-3.0.103.tar.gz -C /opt/
cd /opt/moosefs-packages-all-3.0.103/linux/centos/7/
#删除Pro版本(企业版的RPM包)
sudo rm -rf moosefs-pro-*
sudo yum install -y gcc gcc-c++ make libpcap-devel zlib-devel fuse-devel pkgconfig fuse
sudo yum install -y *
#查看是否创建用户
getent passwd mfs

#启用 MFS-Master 节点配置文件
$ cd /etc/mfs/
$ cat >> /etc/mfs/mfsexports.cfg <<EOF
# ADD MFS Cluster BEGIN
10.10.10.0/24 . rw,alldirs,maproot=0
# ADD MFS Cluster END
EOF
#rw,读写权限
#alldirs,任何目录都允许挂载
#maproot=0,登陆就是root用户
#$ mkdir -pv /mfsdata && chown mfs:mfs /mfsdata && ls -ld /mfsdata
#查看存放持久化元数据信息
$ cd /var/lib/mfs ; cp metadata.mfs.empty metadata.mfs
#启动 MFS-Master 服务
$ mfsmaster start
#开启 Web 监控页面
$ mfscgiserv 
#查看端口
$ netstat -auntlp | grep mfs
tcp        0      0 0.0.0.0:9419            0.0.0.0:*               LISTEN      10735/mfsmaster   
tcp        0      0 0.0.0.0:9420            0.0.0.0:*               LISTEN      10735/mfsmaster   
tcp        0      0 0.0.0.0:9421            0.0.0.0:*               LISTEN      10735/mfsmaster

#再次查看MFS元数据目录下的内容
$ ls
changelog.0.mfs metadata.mfs.back metadata.mfs.empty metadata.mfs 
#metadata.mfs				是未启动的名称
#metadata.mfs.back	启动服务以后,就将metadata.mfs信息加载到内存中,并且将metadata.mfs改名为metadata.mfs.back
#										metadata.mfs.back相当于是完全备份文件,即内存和该文件是一个完整的备份
#changelog.0.mfs		是差异备份文件,比如说是2小时备份一次,那么中间改变的内容,则存放在changelog.0.mfs文件中,
#										并且changelog.0.mfs是一个自动轮询的文件,即文件名是changelog.0.mfs,changelog.1.mfs以此类推,
#即metadata.mfs.back和changelog.0.mfs加在一起就是一次完整的备份
#即保证了效率,也保证了其一致性

浏览器输入 10.10.10.11:9425 就能访问,DNS地址输入IP即可。

$ curl -v 10.10.10.11:9425
* About to connect() to 10.10.10.11 port 9425 (#0)
*   Trying 10.10.10.11...
* Connected to 10.10.10.11 (10.10.10.11) port 9425 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.10.10.11:9425
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Location: index.html
* Connection #0 to host 10.10.10.11 left intact
#浏览器打开

img

可以查看MFS的监控页面

img

5.5.1.1 主配置文件说明解释
## /etc/mfs/mfsmaster.cfg
WORKING_USER = mfs 
#所使用的 mfs 用户

WORKING_GROUP = mfs
#所使用的 mfs 用户组

SYSLOG_IDENT = mfsmaster 
#在 syslog 中的表示, 说明这是 mfsmaster 产生的 

LOCK_MEMORY = 0 
#是否执行 mlockall()以避免 mfsmaster 内存溢出(默认为 0) 

NICE_LEVEL = -19 
#运行的优先级(默认-19, 注意, 这进程必须是 root 启动 )

DATA_PATH = /usr/local/mfs/var/mfs 
#DATA_PATH = /var/lib/mfs
#数据存放路径,该目录下有三大类文件,changelog,sessions,stats 

EXPORTS_FILENAME = /usr/local/mfs/etc/mfs/mfsexports.cfg 
#EXPORTS_FILENAME = /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 
#一个chunkserver中soft最大的可删除数量为10个

CHUNKS_WRITE_REP_LIMIT = 2,1,1,4 
#在一个循环里复制到一个 CHUNK Server 的最大 chunks 数目

CHUNKS_READ_REP_LIMIT = 10,5,2,5 

#Client 的连接地址和端口
MATOCL_LISTEN_HOST = *
MATOCL_LISTEN_PORT = 9421

5.5.2 MFS - Metdata Server(10.10.10.12)

$ hostnamectl set-hostname metadata

###CentOS 6安装
#从远程服务器下载到本地
$ scp root@10.10.10.11:/root/moosefs-3.0.84-1.tar.gz /root
$ tar zxf moosefs-3.0.84-1.tar.gz && cd moosefs-3.0.84
$ useradd -s /sbin/nologin -M mfs 
#创建 MFS 用户,并编译安装 MFS 软件
$ ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs 
#编译安装 MFS 软件
$ make && make install && echo $?
$ chown -R mfs.mfs /usr/local/mfs/
$ ln -s /usr/local/mfs/sbin/* /usr/local/sbin/ ; ln -s /usr/local/mfs/bin/* /usr/local/bin/
$ cd /usr/local/mfs/etc/mfs ; cp -a mfsmetalogger.cfg.sample mfsmetalogger.cfg 
#拷贝 MFS 元数据服务配置文件

#修改配置文件
$ vim mfsmetalogger.cfg
#取消下面两行注释
META_DOWNLOAD_FREQ = 2 
#设置完整同步间隔为 2 小时 
MASTER_HOST = 10.10.10.11 
#设置 MFS-Master 服务器 IP 地址

$ chmod a+x /usr/local/mfs/sbin/* 
#优化 MFS 服务配置,便于命令调用
$ mfsmetalogger start 
#启动 MFS-Logger 服务
$ lsof -i :9419
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mfsmetalo 8111  mfs    8u  IPv4  32184      0t0  TCP 10.10.10.12:35921->10.10.10.11:9419 (ESTABLISHED)
$ cd /usr/local/mfs/var/mfs/ ; ls /usr/local/mfs/var/mfs/

##################################################################################################

###CentOS 7安装(需要联网)
wget --no-check-certificate \
https://master.dl.sourceforge.net/project/moosefs/3.0.103/moosefs-packages-all-3.0.103.tar.gz
tar -zxvf moosefs-packages-all-3.0.103.tar.gz -C /opt/
cd /opt/moosefs-packages-all-3.0.103/linux/centos/7/
#删除Pro版本(企业版的RPM包)
sudo rm -rf moosefs-pro-*
sudo yum install -y gcc gcc-c++ make libpcap-devel zlib-devel fuse-devel pkgconfig fuse
sudo yum install -y *
#查看是否创建用户
$ getent passwd mfs
mfs:x:998:996:MooseFS:/var/lib/mfs:/sbin/nologin

#修改配置文件
$ cd /etc/mfs
$ vim mfsmetalogger.cfg
#取消下面两行注释
META_DOWNLOAD_FREQ = 2 
#设置完整同步间隔为 2 小时 
MASTER_HOST = 10.10.10.11 
#设置 MFS-Master 服务器 IP 地址
$ mfsmetalogger start 
#启动 MFS-Logger 服务
#测试
$ lsof -i :9419
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mfsmetalo 1704  mfs    8u  IPv4  32184      0t0  TCP metadata:35866->10.10.10.11:9419 (ESTABLISHED)
#查看数据存放路径
$ ls /var/lib/mfs/
changelog_ml_back.0.mfs  metadata.mfs        metadata_ml.tmp
changelog_ml_back.1.mfs  metadata.mfs.empty

5.5.3 MFS - Chunk Server(10.10.10.13)

$ hostnamectl set-hostname chunkserver1

###CentOS 6安装
#把新添加的硬盘分区
$ fdisk /dev/sdb # 分区
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x05b4d994.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n #输入n,新建分区
Command action
   e   extended
   p   primary partition (1-4)
p #输入p,添加主分区
Partition number (1-4): 1  #输入1,1号分区
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610):  #直接回车,从头到尾使用所有空间
Using default value 2610
Command (m for help): w   #输入w保存
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

$ mkfs.ext4 /dev/sdb1 
#格式化
$ mkdir /mnt/mfs 
#创建挂载点目录
$ useradd -s /sbin/nologin -M mfs 
#创建 MFS 用户
$ mount -t ext4 /dev/sdb1 /mnt/mfs/ 
#挂载
$ chown -R mfs.mfs /mnt/mfs/

#从远程服务器下载到本地
$ scp root@10.10.10.11:/root/moosefs-3.0.84-1.tar.gz /root
$ tar zxf 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 
#编译安装 MFS 软件
$ make && make install && echo $?
$ chown -R mfs.mfs /usr/local/mfs/
$ ln -s /usr/local/mfs/sbin/* /usr/local/sbin/ ; ln -s /usr/local/mfs/bin/* /usr/local/bin/
$ chmod a+x /usr/local/mfs/sbin/* 
# 优化 MFS 服务配置,便于命令调用
$ cd /usr/local/mfs/etc/mfs
$ cp -a mfschunkserver.cfg.sample mfschunkserver.cfg ; cp -a mfshdd.cfg.sample mfshdd.cfg 
# 拷贝 Chunkserver 配置文件

#提供存储的配置文件
$ vim mfschunkserver.cfg 
#修改如下配置
MASTER_HOST = 10.10.10.11 
#指定 MFS-Master 服务器地址 
MASTER_PORT = 9420 
#指定 MFS-Master 服务器端口 
HDD_CONF_FILENAME = /usr/local/mfs/etc/mfs/mfshdd.cfg 
#指定提供存储的配置文件位置,这一行直接取消注释即可,不用修改

#修改 MFS 服务 HDD 路径
$ vim /usr/local/mfs/etc/mfs/mfshdd.cfg 
#最后一行添加
/mnt/mfs
#挂载点目录
$ mfschunkserver start 
# 启动 MFSChunkserver

##################################################################################################

###CentOS 7安装(需要联网)
wget --no-check-certificate \
https://master.dl.sourceforge.net/project/moosefs/3.0.103/moosefs-packages-all-3.0.103.tar.gz
tar -zxvf moosefs-packages-all-3.0.103.tar.gz -C /opt/
cd /opt/moosefs-packages-all-3.0.103/linux/centos/7/
#删除Pro版本(企业版的RPM包)
sudo rm -rf moosefs-pro-*
sudo yum install -y gcc gcc-c++ make libpcap-devel zlib zlib-devel fuse-devel pkgconfig fuse
sudo yum install -y *
#查看是否创建用户
$ getent passwd mfs
mfs:x:998:996:MooseFS:/var/lib/mfs:/sbin/nologin

#把新添加的硬盘分区,格式化文件系统,并挂载
echo -e "n\np\n\n\n\nw\n" | fdisk /dev/sdb
mkfs -t ext4 /dev/sdb1
mkdir /mnt/mfs && mount -t ext4 /dev/sdb1 /mnt/mfs/ && chown -R mfs.mfs /mnt/mfs/
#永久挂载
cat >> /etc/fstab <<EOF
/dev/sdb1 /mnt/mfs ext4 defaults 0 0
EOF

#修改存储的配置文件
$ vim /etc/mfs/mfschunkserver.cfg
#修改如下配置
MASTER_HOST = 10.10.10.11 
#指定 MFS-Master 服务器地址 
MASTER_PORT = 9420 
#指定 MFS-Master 服务器端口 
HDD_CONF_FILENAME = /etc/mfs/mfshdd.cfg
#指定提供存储的配置文件位置,这一行直接取消注释即可,不用修改

#修改 MFS 服务 HDD 路径(追加即可)
$ echo "/mnt/mfs" >> /etc/mfs/mfshdd.cfg
#启动 MFSChunkserver
$ mfschunkserver start 
#查看MFS端口
$ netstat -auntlp | grep mfs
tcp        0      0 0.0.0.0:9422            0.0.0.0:*               LISTEN      8516/mfschunkserver
tcp        0      0 10.10.10.13:42662       10.10.10.11:9420        ESTABLISHED 8516/mfschunkserver

另一台ChunkServer服务器动态进行添加

5.5.4 MFS - Chunk Server(10.10.10.14)

$ hostnamectl set-hostname chunkserver2

###CentOS 6安装
#把新添加的硬盘分区
$ fdisk /dev/sdb # 分区
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x05b4d994.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n #输入n,新建分区
Command action
   e   extended
   p   primary partition (1-4)
p #输入p,添加主分区
Partition number (1-4): 1  #输入1,1号分区
First cylinder (1-2610, default 1):  #直接回车
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610):  #直接回车,从头到尾使用所有空间
Using default value 2610
Command (m for help): w   #输入w保存
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

$ mkfs.ext4 /dev/sdb1 
#格式化
$ mkdir /mnt/mfs 
#创建挂载点目录
$ useradd -s /sbin/nologin -M mfs 
#创建 MFS 用户
$ mount -t ext4 /dev/sdb1 /mnt/mfs/ 
#挂载
$ chown -R mfs.mfs /mnt/mfs/

#从远程服务器把moosefs下载到本地
$ scp root@10.10.10.11:/root/moosefs-3.0.84-1.tar.gz /root
$ tar zxf 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 
#编译安装 MFS 软件
$ make && make install && echo $?

$ chown -R mfs.mfs /usr/local/mfs/
$ chmod a+x /usr/local/mfs/sbin/* 
$ ln -s /usr/local/mfs/sbin/* /usr/local/sbin/ ; ln -s /usr/local/mfs/bin/* /usr/local/bin/
#优化 MFS 服务配置,便于命令调用

$ cd /usr/local/mfs/etc/mfs
$ cp -a mfschunkserver.cfg.sample mfschunkserver.cfg 
#拷贝 Chunkserver 配置文件
$ cp -a mfshdd.cfg.sample mfshdd.cfg 
#提供存储的配置文件

$ vim mfschunkserver.cfg 
#修改如下配置
MASTER_HOST = 10.10.10.11 
#指定 MFS-Master 服务器地址 
MASTER_PORT = 9420 
#指定 MFS-Master 服务器端口 

HDD_CONF_FILENAME = /usr/local/mfs/etc/mfs/mfshdd.cfg 
#指定提供存储的配置文 件位置
#这一行直接取消注释即可,不用修改

$ vim /usr/local/mfs/etc/mfs/mfshdd.cfg 
#修改 MFS 服务 HDD 路径
#最后一行添加
/mnt/mfs
#挂载点目录

$ mfschunkserver start 
#启动 MFSChunkserver

##################################################################################################

###CentOS 7安装(需要联网)
wget --no-check-certificate \
https://master.dl.sourceforge.net/project/moosefs/3.0.103/moosefs-packages-all-3.0.103.tar.gz
tar -zxvf moosefs-packages-all-3.0.103.tar.gz -C /opt/
cd /opt/moosefs-packages-all-3.0.103/linux/centos/7/
#删除Pro版本(企业版的RPM包)
sudo rm -rf moosefs-pro-*
sudo yum install -y gcc gcc-c++ make libpcap-devel zlib-devel fuse-devel pkgconfig fuse
sudo yum install -y *
#查看是否创建用户
$ getent passwd mfs
mfs:x:998:996:MooseFS:/var/lib/mfs:/sbin/nologin

#把新添加的硬盘分区
echo -e "n\np\n\n\n\nw\n" | fdisk /dev/sdb
mkfs -t ext4 /dev/sdb1
mkdir /mnt/mfs && mount -t ext4 /dev/sdb1 /mnt/mfs/ && chown -R mfs.mfs /mnt/mfs/
#永久挂载
cat >> /etc/fstab <<EOF
/dev/sdb1 /mnt/mfs ext4 defaults 0 0
EOF

#修改存储的配置文件
$ vim /etc/mfs/mfschunkserver.cfg
#修改如下配置
MASTER_HOST = 10.10.10.11 
#指定 MFS-Master 服务器地址 
MASTER_PORT = 9420 
#指定 MFS-Master 服务器端口 
HDD_CONF_FILENAME = /etc/mfs/mfshdd.cfg
#指定提供存储的配置文件位置,这一行直接取消注释即可,不用修改

#修改 MFS 服务 HDD 路径(追加即可)
$ echo "/mnt/mfs" >> /etc/mfs/mfshdd.cfg
#启动 MFSChunkserver
$ mfschunkserver start 
#查看MFS端口
$ netstat -auntlp | grep mfs
tcp        0      0 0.0.0.0:9422            0.0.0.0:*               LISTEN      8422/mfschunkserver
tcp        0      0 10.10.10.14:37418       10.10.10.11:9420        ESTABLISHED 8422/mfschunkserver

5.5.5 MFS - Client Server(10.10.10.15)

$ hostnamectl set-hostname client

###CentOS 6安装
$ mount -t iso9660 /dev/cdrom /mnt/cdrom 
#挂载本地yum光盘
$ yum -y install fuse fuse-devel fuse-libs 
#安装 Fuse

#从远程服务器把moosefs下载到本地
$ scp root@10.10.10.11:/root/moosefs-3.0.84-1.tar.gz /root
$ tar zxf moosefs-3.0.84-1.tar.gz && cd moosefs-3.0.84 
$ useradd -s /sbin/nologin -M mfs 
#创建 MFS 用户

#编译安装 MFS Client 工具
$ ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfschunkserver \
	&& make \
	&& make install \
	&& echo $?

$ chown -R mfs.mfs /usr/local/mfs/
$ chmod a+x /usr/local/mfs/sbin/* 
$ ln -s /usr/local/mfs/sbin/* /usr/local/sbin/ ; ln -s /usr/local/mfs/bin/* /usr/local/bin/
#优化 MFS 服务配置,便于命令调用

$ mkdir /mfsclient
$ mfsmount /mfsclient/ -H 10.10.10.11
$ chown -R mfs.mfs /mfsclient/
$ echo "1111111" > /mfsclient/1.txt
$ mfsfileinfo /mfsclient/1.txt
#只部署了一个ChunkServer的情况
/mfsclient/1.txt:
	chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
		copy 1: 10.10.10.13:9422 (status:VALID)

#10.10.10.15客户端执行(部署了两个ChunkServer的情况)
$ echo "2222222" > /mfsclient/2.txt 
$ mfsfileinfo /mfsclient/2.txt
/mfsclient/2.txt:
	chunk 0: 0000000000000002_00000001 / (id:2 ver:1)
		copy 1: 10.10.10.13:9422 (status:VALID)
		copy 2: 10.10.10.14:9422 (status:VALID)

##################################################################################################

###CentOS 7安装(需要联网)
wget --no-check-certificate \
https://master.dl.sourceforge.net/project/moosefs/3.0.103/moosefs-packages-all-3.0.103.tar.gz
tar -zxvf moosefs-packages-all-3.0.103.tar.gz -C /opt/
cd /opt/moosefs-packages-all-3.0.103/linux/centos/7/
#删除Pro版本(企业版的RPM包)
sudo rm -rf moosefs-pro-*
sudo yum install -y gcc gcc-c++ make libpcap-devel zlib-devel fuse-devel pkgconfig fuse
sudo yum -y install fuse fuse-devel fuse-libs 
sudo yum install -y *
#查看是否创建用户
$ getent passwd mfs
mfs:x:998:996:MooseFS:/var/lib/mfs:/sbin/nologin

$ mkdir /mfsclient
$ mfsmount /mfsclient/ -H 10.10.10.11
$ chown -R mfs.mfs /mfsclient/
$ echo "Hello MFS File System" > /mfsclient/1.txt

#10.10.10.15客户端执行
$ mfsfileinfo /mfsclient/1.txt
1.txt:
        chunk 0: 0000000000000001_00000001 / (id:1 ver:1)
                copy 1: 10.10.10.13:9422 (status:VALID)
                copy 2: 10.10.10.14:9422 (status:VALID)

5.5.6 查看MFS Dashboard

浏览器输入 10.10.10.11:9425 就能访问。

#若数据没有同步,则需要到 Master 节点,重启服务
mfsmaster restart

img

可以浏览到 ChunkServer 节点的信息,就代表已经可以初步的进行使用了。

img

查看MFS 集群中的Disk 硬盘的使用情况

img

5.6 MFS 维护操作

MFS 集群中的ChunkServer的水平扩展能力还是非常大的,并且 Master Server 的压力比较小,不涉及到真实流量的转发。

默认情况下 MFS 集群中的 Goal 期望值就是 2。

5.6.1 误操作处理,垃圾回收站机制

#10.10.10.15客户端把mfs.txt删了
$ echo "Hello,MFS Niubi" > /mfsclient/mfs.txt
$ rm -rf /mfsclient/mfs.txt

#10.10.10.15客户端要恢复删除的数据,进行一下操作
$ mkdir /mfsback 
#创建一个目录
#挂载时需要添加 -m 参数
$ mfsmount -m /mfsback -H 10.10.10.11
$ cd /mfsback/trash ; yum -y install tree &> /dev/null

$ tree  | grep -F1 mfs.txt
#查看这个文件,找到mfs.txt
├── 003
│   ├── 00000003|mfs.txt
│   └── undel

$ mv /mfsback/trash/003/00000003\|mfs.txt /mfsback/trash/undel/
#把这个文件放到undel目录下

#查看恢复文件
$ ls -l /mfsclient/mfs.txt
-rw-r--r-- 1 root root 16 Sep  5 20:53 /mfsclient/mfs.txt
$ cat /mfsclient/mfs.txt
Hello,MFS Niubi

#查看误删除时间
$ mfsgettrashtime /mfsclient/mfs.txt
/mfsclient/mfs.txt: 86400
#单位:秒

#修改误删除时间
$ mfssettrashtime 2000 /mfsclient/mfs.txt
/mfsclient/mfs.txt: 2000
#MFS会将数值取整
$ mfsgettrashtime /mfsclient/mfs.txt
/mfsclient/mfs.txt: 3600

5.6.2 快照功能

#10.10.10.15客户端操作,快照功能可以简单的理解为是软链接的特性。

#10.10.10.15客户端操作
$ cd /mfsclient ; mkdir back 
$ chown mfs.mfs back/ 
#可选
$ mfsmakesnapshot /mfsclient/mfs.txt /mfsclient/back/
$ ls -l /mfsclient/back/mfs.txt
-rw-r--r-- 1 root root 16 Sep  5 20:53 /mfsclient/back/mfs.txt
$ cat /mfsclient/back/mfs.txt
Hello,MFS Niubi

#MFS的快照功能是不会占用两份空间,而普通的拷贝则是占用两份空间
#类似于 ln -s 命令软链接

5.6.3 冗余 Goal 设置

#10.10.10.15客户端操作

$ cd /mfsclient
$ echo "Hello MFS World" >> /mfsclient/3.txt
$ mfsfileinfo /mfsclient/3.txt
/mfsclient/3.txt:
          chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
                  copy 1: 10.10.10.13:9422 (status:VALID)
                  copy 2: 10.10.10.14:9422 (status:VALID)
#两个副本

#设置为一个Goal副本数
$ mfssetgoal 1 /mfsclient/3.txt
/mfsclient/3.txt: goal: 1
$ mfsfileinfo /mfsclient/3.txt
/mfsclient/3.txt:
        chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
                copy 1: 10.10.10.14:9422 (status:VALID)
#变为一个副本

#恢复为两个副本
$ mfssetgoal 2 /mfsclient/3.txt
/mfsclient/3.txt: goal: 2
$ mfsfileinfo /mfsclient/3.txt
/mfsclient/3.txt:
        chunk 0: 0000000000000003_00000001 / (id:3 ver:1)
                copy 1: 10.10.10.13:9422 (status:VALID)
                copy 2: 10.10.10.14:9422 (status:VALID)

#将其中一个ChunkServer停止服务(10.10.10.13机器)
$ mfschunkserver stop
sending SIGTERM to lock owner (pid:8516)
waiting for termination terminated

#客户端访问/mfsclient/3.txt并没有任何问题
$ cat /mfsclient/3.txt
Hello MFS World

5.6.4 还原 Master

###CentOS 6操作
#10.10.10.11 master操作
$ mfsmaster stop
$ rm -rf /usr/local/mfs/var/mfs/*

#10.10.10.12 metadata操作
$ scp /usr/local/mfs/var/mfs/* root@10.10.10.11:/usr/local/mfs/var/mfs/

#10.10.10.11 master操作
$ mfsmaster -a #自动恢复

###CentOS 7操作
#10.10.10.11 master操作
$ mfsmaster stop
$ rm -rf /var/lib/mfs/*

#10.10.10.12 metadata操作
$ scp -r /var/lib/mfs/* root@10.10.10.11:/var/lib/mfs/

#10.10.10.11 master操作
$ mfsmaster -a 
#自动恢复

img

#客户端再次访问一下 MFS 挂载目录情况

#会有一定的延时时间
$ ls -l /mfsclient/
total 4
-rw-r--r-- 1 root root   22 Sep  5 18:02 1.txt
-rw-r--r-- 1 root root   16 Sep  5 21:10 3.txt
drwxr-xr-x 2 root root 1600 Sep  5 21:07 back
-rw-r--r-- 1 root root   16 Sep  5 20:53 mfs.txt
#可以正常的访问使用
$ cat /mfsclient/mfs.txt
Hello,MFS Niubi

#查看MFS Dashboard情况(可以正常的使用)

img

5.7 参考文献

MooseFS官网 [ https://moosefs.com ]

MooseFS分布式文件系统介绍 [ https://www.cnblogs.com/hjc4025/p/9956988.html ]

分布式文件系统之MooseFS [ https://blog.51cto.com/zouqingyun/1698710 ]

集群化部署 [ https://blog.csdn.net/w918589859/article/details/111770726 ]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dark_Ice_

你的支持是我创作的核动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值