MFS介绍
MFS(MooseFS ) 是一个具有容错功能的、高可用、可扩展的海量级分布式文件系统。MFS 把数据分散在多台服务器上,但是客户看到的只是一个源。MFS 也像其他类 UNIX 文件系统一样,包含了层级结构和文件属性,可以创建特殊的文件(块设备、字符设备、管道、套接字)、符号链接和硬链接。
MFS 原理
( 1)MFS 文件系统组成
1).元数据服务器(Master):在整个系统中负责管理文件系统,维护元数据。
2).元数据日志服务器(MetaLogger):备份 Master 服务器的变化日志文件,文件类型为 changelog_ml.*.mfs 。当Master 服务器数据丢失或者损坏时, 可以从日志服务器中取得文件,进行恢复。
3).数据存储服务器(Chunk Server):真正存储数据的服务器。存储文件时,会把文件分块保存,并在数据库服务器之间进行复制。数据服务器越多,能使用的容量就越大,可靠性就越高,性能也就越好。
4).客户端(Client):可以像挂载 NFS 一样挂载 MFS 文件系统,其操作是相同的。
(2)MFS 读取数据的处理过程。
1). 客户端向元数据服务器发出读请求。
2). 元数据服务器把所需数据存放的位置( Chunk Server 的IP 地址和 Chunk 编号)告知客户端。
3). 客户端向己知的 Chunk Server 请求发送数据。
4). Chunk Server 向客户端发送数据。
(3). MFS 写入数据的处理过程。
1).客户端向元数据服务器发出写入请求。
2).元数据服务器与 Chunk Server 进行交互(只有当所需的分块 Chunks 存在的 时候才进行这个交互),单元数据服务器只在某些服务器创建新的分块 Chunks ,创建成功后由 Chunk Server 告知元数据服务器操作成功。
3). 元数据服务器告知客户端,可以在哪个 Chunk Server 的哪些 Chunks 写入数据。
4). 客户的向指定的 Chunk Server 写入数据。
5).该 Chunk Server 与其他 Chunk Server 进行数据同步,同步成功后 Chunk Server 告知客户端数据写入成功。
6).客户端告知元数据服务器本次写入完毕。
实验环境
本次实验使用5台服务器模拟搭建 MFS 文件系统,具体的拓扑图如下所示:
实验环境如下
主机 操作系统 IP 地址 主要软件 Master Server Centos 7 192.168.91.147 mfs-1.6.27-5.tar.gz Metalogger Server Centos 7 192.168.91.149 mfs-1.6.27-5.tar.gz Chunk Server 1 Centos 7 192.168.91.148 mfs-1.6.27-5.tar.gz Chunk Server 2 Centos 7 192.168.91.150 mfs-1.6.27-5.tar.gz Client Centos 7 192.168.91.146 mfs-1.6.27-5.tar.gz
fuse-2.9.2.tar.gz
链接:https://pan.baidu.com/s/17N08A1JTAitFDJhJTJmwlQ (MFS软件包)
提取码:b7z9
(1)分别在这5台服务器关闭防火墙,安装编译环境1.搭建Master server
[root@localhost ~]# yum install gcc gcc-c++ zlib-devel –y
[root@localhost ~]# useradd -s /sbin/nologin mfs
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
(2)创建用户
[root@master Y2C]# useradd -s /sbin/nologin mfs //创建 mfs 用户
(3)安装源码包
[root@master Y2C]# tar zxvf mfs-1.6.27-5.tar.gz -C /opt/
[root@master Y2C]# cd /opt/mfs-1.6.27/
[root@master mfs-1.6.27]# ./configure \
> --prefix=/usr/local/mfs \ //指定安装路径
> --with-default-user=mfs \ //指定默认用户为 mfs
> --with-default-group=mfs \ //指定默认组
> --disable-mfschunkserver \ //禁用 Chunk Server
> --disable-mfsmount //禁用客户端[root@master mfs-1.6.27]# make && make install
(4)复制文件(在 master 服务器中配置文件不用修改)
[root@master mfs-1.6.27]# cd /usr/local/mfs/etc/mfs/
[root@master mfs]# ls
mfsexports.cfg.dist mfsmaster.cfg.dist mfsmetalogger.cfg.dist mfstopology.cfg.dist //生成4个配置文件
[root@master mfs]# cp mfsexports.cfg.dist mfsexports.cfg //权限配置文件
[root@master mfs]# cp mfsmaster.cfg.dist mfsmaster.cfg //master 配置文件
[root@master mfs]# cp mfstopology.cfg.dist mfstopology.cfg //元数据日志文件[root@master mfs]# cd /usr/local/mfs/var/mfs/
[root@master mfs]# ls
metadata.mfs.empty
[root@master mfs]# cp metadata.mfs.empty metadata.mfs //master运行过程中自动产生的元数据文件
(5)启动 Master Server
[root@master mfs]# /usr/local/mfs/sbin/mfsmaster start
[root@master mfs]# netstat -ntap | grep mfsmaster //查看端口是否启动(有3个端口)
tcp 0 0 0.0.0.0:9419 0.0.0.0:* LISTEN 9061/mfsmaster
tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 9061/mfsmaster
tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 9061/mfsmaster停止 Master Server 的命令是 /usr/local/mfs/sbin/mfsmaster –s
2.搭建 MetaLogger Server
(1)安装编译环境,关闭防火墙。
[root@metalogger ]# yum install gcc gcc-c++ zlib-devel –y
[root@metalogger ]# systemctl stop firewalld
[root@metalogger ]# setenforce 0
(2)创建 mfs 用户
[root@metalogger ]# useradd -s /sbin/nologin mfs
(3)安装源码包(与 Master Server 配置一样)
[root@metalogger] tar zxvf mfs-1.6.27-5.tar.gz -C /opt/
[root@metalogger] cd /opt/mfs-1.6.27/
[root@metalogger]./configure \
--prefix=/usr/local/mfs \
--with-default-user=mfs \
--with-default-group=mfs \
--disable-mfschunkserver \
--disable-mfsmount[root@metalogger] make && make install
(4)复制文件
[root@metalogger mfs-1.6.27]# cd /usr/local/mfs/etc/mfs/
[root@metalogger mfs]# ls
mfsexports.cfg.dist mfsmaster.cfg.dist mfsmetalogger.cfg.dist mfstopology.cfg.dist
[root@metalogger mfs]# cp mfsmetalogger.cfg.dist mfsmetalogger.cfg //复制元数据日志文件
(5)修改元数据日志文件的配置文件
[root@metalogger mfs]# vim mfsmetalogger.cfg
# WORKING_USER = mfs //运行 masterserver 的用户
# WORKING_GROUP = mfs //运行 masterserver 的组
# SYSLOG_IDENT = mfsmetalogger //表示 mfsmetalogger 产生的日志
# LOCK_MEMORY = 0 //是否执行 mlockall(),以避免 masterserver 进程溢出(默认值为0)
# NICE_LEVEL = –19 //运行的优先级(如果可以,默认是 -19;注意:进程必须用 root 启动)
# DATA_PATH = /usr/local/mfs/var/mfs //数据存放路径
# BACK_LOGS = 50 //metadata 改变的 log 文件数目(默认是50)
# BACK_META_KEEP_PREVIOUS = 3
# META_DOWNLOAD_FREQ = 24
# MASTER_RECONNECTION_DELAY = 5
MASTER_HOST = 192.168.91.147 //修改为 Master server 的 IP 地址
# MASTER_PORT = 9419 //连接端口地址
# MASTER_TIMEOUT = 60
(6)启动 mfsmetalogger
[root@metalogger mfs]# /usr/local/mfs/sbin/mfsmetalogger start
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmetalogger modules ...
mfsmetalogger daemon initialized properly
[root@metalogger mfs]# netstat -ntap | grep mfsmetalogger //查看端口
tcp 0 1 192.168.91.149:40552 220.250.64.225:9419 SYN_SENT 59501/mfsmetalogger
3.搭建 Chunk Server(本次实验两台 Chunk Server 搭建步骤是相同的,具体步骤如下)
(1)安装编译环境
[root@chunkserver ~]# systemctl stop firewalld.service
[root@chunkserver ~]# setenforce 0
[root@chunkserver ~]# yum install gcc gcc-c++ zlib-devel –y
(2)创建 mfs 用户
[root@chunkserrver ]# useradd -s /sbin/nologin mfs
(3)安装源码包
[root@chunkserver ~]# tar zxvf mfs-1.6.27-5.tar.gz -C /opt/
[root@chunkserver Y2C]# cd /opt/mfs-1.6.27/
[root@chunkserver mfs-1.6.27]# useradd -s /sbin/nologin mfs
[root@chunkserver mfs-1.6.27]# ./configure \
> --prefix=/usr/local/mfs \
> --with-default-user=mfs \
> --with-default-group=mfs \
> --disable-mfsmaster \ //禁用 mfsmaster
> --disable-mfsmount //禁用客户端[root@chunkserver mfs]# make && make install
(4)复制文件,并修改 Chunkserver 的配置文件
[root@chunkserver mfs-1.6.27]# cd /usr/local/mfs/etc/mfs/
[root@chunkserver mfs]# ls
mfschunkserver.cfg.dist mfshdd.cfg.dist
[root@chunkserver mfs]# cp mfschunkserver.cfg.dist mfschunkserver.cfg
[root@chunkserver mfs]# cp mfshdd.cfg.dist mfshdd.cfg[root@chunkserver mfs]# vim mfschunkserver.cfg
# WORKING_USER = mfs
# WORKING_GROUP = mfs
# SYSLOG_IDENT = mfschunkserver
# LOCK_MEMORY = 0
# NICE_LEVEL = -19# DATA_PATH = /usr/local/mfs/var/mfs
# MASTER_RECONNECTION_DELAY = 5
# BIND_HOST = *
MASTER_HOST = 192.168.91.147 //修改为 Master Server 的 IP 地址
# MASTER_PORT = 9420# MASTER_TIMEOUT = 60
# CSSERV_LISTEN_HOST = *
# CSSERV_LISTEN_PORT = 9422# HDD_CONF_FILENAME = /usr/local/mfs/etc/mfs/mfshdd.cfg
# HDD_TEST_FREQ = 10
(5)添加存储目录
[root@chunkserver mfs]# vim mfshdd.cfg
# mount points of HDD drives
#
#/mnt/hd1
#/mnt/hd2
#etc.
/data //添加一行 /data ,在这里 /data 是一个给 MFS 的分区,生产环境最好使用独立的分区或磁盘关在到此目录
[root@chunkserver mfs]# mkdir /data //创建 /data 目录
[root@chunkserver mfs]# chown -R mfs.mfs /data //给 mfs用户和组对于 /data 的执行权限
(6)启动 ChukServer
[root@chunkserver mfs]# /usr/local/mfs/sbin/mfschunkserver start
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfschunkserver modules ...
hdd space manager: path to scan: /data/
hdd space manager: start background hdd scanning (searching for available chunks)
main server module: listen on *:9422
no charts data file - initializing empty charts
mfschunkserver daemon initialized properly
[root@chunkserver mfs]# netstat -ntap | grep mfs
tcp 0 0 0.0.0.0:9422 0.0.0.0:* LISTEN 43697/mfschunkserve
tcp 0 0 192.168.91.148:52454 192.168.91.147:9420 ESTABLISHED 43697/mfschunkserve
另一台的 ChunkServer 也是一样的配置
chunk server 2
[root@chunkserver2 mfs]# /usr/local/mfs/sbin/mfschunkserver start
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfschunkserver modules ...
hdd space manager: path to scan: /data/
hdd space manager: start background hdd scanning (searching for available chunks)
main server module: listen on *:9422
no charts data file - initializing empty charts
mfschunkserver daemon initialized properly
[root@chunkserver2 mfs]# netstat -ntap | grep mfs
tcp 0 0 0.0.0.0:9422 0.0.0.0:* LISTEN 47743/mfschunkserve
tcp 0 0 192.168.91.150:36058 192.168.91.147:9420 ESTABLISHED 47743/mfschunkserve
4搭建客户端
(1)安装编译环境
[root@client ~]# systemctl stop firewalld.service
[root@client ~]# setenforce 0
[root@client ~]# yum install gcc gcc-c++ zlib-devel –y
(2)安装 FUSE,MFS 客户端依赖于 FUSE
[root@client Y2C]# tar zxvf fuse-2.9.2.tar.gz -C /opt/
[root@client Y2C]# cd /opt/fuse-2.9.2/
[root@client fuse-2.9.2]# ./configure[root@client fuse-2.9.2]# make && make install
然后设置于环境变量
[root@client fuse-2.9.2]# vim /etc/profile
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH //在末行加入
[root@client fuse-2.9.2]# source /etc/profile //刷新环境变量
(3)安装 MFS 客户端
[root@client fuse-2.9.2]# useradd -s /sbin/nologin mfs //创建 mfs 用户
[root@client Y2C]# tar zxvf mfs-1.6.27-5.tar.gz -C /opt/
[root@client Y2C]# cd /opt/mfs-1.6.27/
[root@client mfs-1.6.27]# ./configure \
> --prefix=/usr/local/mfs \
> --with-default-user=mfs \
> --with-default-group=mfs \
> --disable-mfsmaster \ //禁用 master
> --disable-mfschunkserver \ //禁用 chunkserver
> --enable-mfsmount //启用客户端[root@client mfs-1.6.27]# make && make install
(4)挂载 MFS 文件系统
[root@client mfs-1.6.27]# mkdir /opt/mfs //创建挂载点
[root@client mfs-1.6.27]# modprobe fuse //加载 fuse 模块到内核
[root@client mfs-1.6.27]# /usr/local/mfs/bin/mfsmount /opt/mfs -H 192.168.91.147 //挂载 MFS (指定到 Master Server 服务器)
mfsmaster accepted connection with parameters: read-write,restricted_ip ; root mapped to root:root
[root@client mfs-1.6.27]# df –h //查看挂载情况
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 20G 3.6G 17G 18% /
devtmpfs 978M 0 978M 0% /dev
tmpfs 993M 0 993M 0% /dev/shm
tmpfs 993M 18M 975M 2% /run
tmpfs 993M 0 993M 0% /sys/fs/cgroup
/dev/sda5 5.0G 50M 5.0G 1% /opt
/dev/sda3 10G 37M 10G 1% /home
/dev/sda1 997M 158M 839M 16% /boot
tmpfs 199M 4.0K 199M 1% /run/user/42
tmpfs 199M 40K 199M 1% /run/user/0
//192.168.91.1/rhel6 120G 50G 71G 41% /aaa
192.168.91.147:9421 33G 0 33G 0% /opt/mfs要卸载 MFS,使用命令 umount /opt/mfs
(5)MFS 常用操作
MFS 在客户端安装完毕后,会生成 /usr/local/mfs/bin/ 目录,在这个目录下有很多命令是用户所需要的。为了方便使用这些命令,可以将 /usr/local/mfs/bin/ 加到环境变量中。
[root@client mfs-1.6.27]# vim /etc/profile
export PATH=/usr/local/mfs/bin/:$PATH
[root@client mfs-1.6.27]# source /etc/profile
mfsgetgoal 命令用来查询文件被复制的分数,,利用 –r 命令可以对整个目录进行递归, goal 是指文件被复制的分数
[root@client mfs-1.6.27]# mfsgetgoal -r /opt/mfs
/opt/mfs:
directories with goal 1 : 1
mfssetgoal 命令用来设置文件被复制的分数,生产环境中 Chunk Server 节点数量应至少大于2,文件副本数小于等于 Chunk Server 服务器的数量
[root@client mfs-1.6.27]# mfssetgoal -r 2 /opt/mfs
/opt/mfs:
inodes with goal changed: 1
inodes with goal not changed: 0
inodes with permission denied: 0
[root@client mfs-1.6.27]# mfsgetgoal -r /opt/mfs/
/opt/mfs/:
directories with goal 2 : 1
创建文件测试如下
[root@client mfs-1.6.27]# cd /opt/mfs
[root@client mfs]# touch test
[root@client mfs]# ls
test
[root@client mfs]# mfsgetgoal test
test: 2
(6)MFS 监控
Mfscgiserv 是用 python 编写的一个 web 服务器,其监听端口是 9425,可以再 Master Server 上通过命令 /usr/local/mfs/sbin/mfscgiserv 来启动,用户利益浏览器就可以全名监控所有客户挂载、Chunk Server 、Master Server,以及客户端的各种操作。
[root@master mfs]# /usr/local/mfs/sbin/mfscgiserv
lockfile created and locked
starting simple cgi server (host: any , port: 9425 , rootpath: /usr/local/mfs/share/mfscgi)
在客户端通过浏览器访问 http://192.168.91.147:9425/
总结:
(1)MFS 是一个具有容错性的网络分布式文件系统,它把数据分散放在多个物理服务器上,而呈现给客户的是一个统一的资源。
(2)MFS 文件系统的组成包括:元数据服务器(Master)、元数据日志服务器(MetaLogger)、数据存储服务器(Chunk Server)和客户端(Client)
(3)元数据服务器(Master)需要用到的配置文件有两个,分别是 mfsmaster.dfg 和 mfsexports.cfg。
(4)在元数据服务器(Master)发生故障时,可以从 Metaloggwr 中恢复 Master 。