本文最后更新于 2020 年 3 月 13 日,文章已超过 6 个月!内容可能已失效,请自行测试 ~

NFS+DRBD+Heartbeat

常见分布式文件系统:

TFS GFS(GlusterFS) HDFS FastDFS Mogilefs
MFS(moosefs) 于2008年5月推出,可提供PB(1024TB)级别的共享存储,拥有冗余及动态扩容功能,保证数据的安全性、可靠性。
MFS 一台存储服务,一对多 采用分布式文件系统后。n台存储服务器,多对多。MFS将数据分散在多台服务器上,客户只能看到一个访问入口。
MFS特点:容错功能,高可用,可扩展的海量级分布式文件系统。
MFS包含了层级结构,文件属性,可以创建特殊文件(块设备、字符设备、管道、套接字)、符号连接、硬链接。

分布式原理(用户的统一访问入口)

分布式文件系统(Distributed File System)文件系统管理的物理资源不一定直接连接在本地节点上,而是通过网络与节点连接,把一些分散的(局域网各个计算机)共享文件夹,集合到一个文件夹内(虚拟共享文件夹),当用户要访问这些文件夹时,只需要访问虚拟共享(集合到一个文件夹),即可以看到所有链接到虚拟共享文件内的资源。
分布式的好处:集中访问,简化操作,数据容灾,提高文件存取性能。

MFS原理:
数据分散在多个物理服务器上,呈现给用户统一的资源
MFS 文件系统的组成
元数据服务器(Master):负责管理文件系统,维护元数据,目前版本只支持单个master服务器,存在单点风险(Keepalived)
元数据日志服务器(MetaLogger):备份Master服务器的变化日志文件,文件类型为changelog_ml.*.mfs,当Master服务器数据丢失或者损坏,可以从日志服务器中提取文件恢复
数据存储服务器(Chunk Server):存储数据的服务器,文件分块保存,并在数据服务器之间复制,数据服务器越多,可用容量越大,可靠性越高,性能越好
客户端(Client):可挂载MFS文件系统来使用

MFS读取数据的处理过程:
1、客户端向元数据服务器(Master)发出读请求。
2、元数据服务器把所需数据存放的位置(Chunk Server的IP地址和Chunk编号)告知客户端。
3、客户端向已知的Chunk Server请求发送数据。
4、Chunk Server向客户端发送数据。

MFS写入数据的处理过程:
1、客户端向元数据服务器发送写入请求。
2、元数据服务器与Chunk Server进行交互(只有当所需的分块Chunks存在的时候才进行这个交互),但元数据服务器只在某些服务器创建新的分块Chunks,创建成功后由Chunk
Servers告知元数据服务器操作成功。
3、元数据服务器告知客户端,可以在哪个Chunk Server的那些Chunks写入数据。
4、客户端向指定的Chunk Server写入数据。
5、该Chunk Server与其他Chunk Server进行数据同步
6、同步成功后Chunk Server告知客户端数据写入成功。
7、客户端告知元数据服务器本次写入完毕。

案例环境

主机操作系统IP地址主要软件
Master ServerCentOS6.6 x86_64192.168.200.101mfs-1.6.27-5.tar.gz
MetaLogger ServerCentOS6.6 x86_64192.168.200.102mfs-1.6.27-5.tar.gz
Chunk Server1CentOS6.6 x86_64 192.168.200.10 3mfs-1.6.27-5.tar.gz
Chunk Server2CentOS6.6 x86_64 192.168.200.10 4mfs-1.6.27-5.tar.gz
ClientCentOS6.6 x86_64 192.168.200.10 5mfs-1.6.27-5.tar.gz
fuse-2.9.2.tar.gz

注:Chunk Server 一定要加一块硬盘划分分区为 /dev/sdb1

安装前准备:
所有主机配置YUM仓库

[root@localhost ~]# service iptables stop
[root@localhost ~]# setenforce 0

案例实施步骤:

1.搭建 Master Server:

[root@master ~]# yum -y install zlib-devel
[root@master ~]# useradd -M -s /sbin/nologin mfs
[root@master ~]# tar xf mfs-1.6.27-5.tar.gz -C /usr/src/
[root@master ~]# cd /usr/src/mfs-1.6.27/
[root@master mfs-1.6.27]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount && make && make install

复制配置文件:

[root@master mfs-1.6.27]# cd /usr/local/mfs/etc/mfs
[root@master mfs]# cp mfsmaster.cfg.dist mfsmaster.cfg
[root@master mfs]# cp mfsexports.cfg.dist mfsexports.cfg
[root@master mfs]# cp mfstopology.cfg.dist mfstopology.cfg
[root@master mfs]# cd /usr/local/mfs/var/mfs/
[root@master mfs]# cp metadata.mfs.empty metadata.mfs

配置文件
需要用到的配置文件有两个:mfsmaster.cfg(主配置文件) 和 mfsexports.cfg(被挂载目录及权限配置文件)

mfsmaster.cfg文件不需要做任何修改,配置文件介绍如下:

[root@master mfs]# cd /usr/local/mfs/etc/mfs
[root@master mfs]# cat mfsmaster.cfg
# WORKING_USER = mfs 					#运行masterserver的用户
# WORKING_GROUP = mfs 					#运行masterserver的组
# SYSLOG_IDENT = mfsmaster 				#masterserver在syslog的标识(日志标识),说明是由masterserver产生的
# LOCK_MEMORY = 0 						#是否执行mlockall(),以避免mfsmaster进程溢出(默认为 0)
# NICE_LEVEL = -19  					#运行的优先级(如果可以,默认是-19;注意:进程必须用root启动)

# EXPORTS_FILENAME = /usr/local/mfs/etc/mfs/mfsexports.cfg 		#被挂接目录及其权限控制文件的存放位置

# TOPOLOGY_FILENAME = /usr/local/mfs/etc/mfs/mfstopology.cfg

# DATA_PATH = /usr/local/mfs/var/mfs 	#数据存放路径

# BACK_LOGS = 50 						#metadata改变的log文件数目(默认是50)
# BACK_META_KEEP_PREVIOUS = 1  			

# REPLICATIONS_DELAY_INIT = 300 		#延迟复制的时间(默认是300s)
# REPLICATIONS_DELAY_DISCONNECT = 3600  #chunkserver断开的复制延迟(默认是3600)

# MATOML_LISTEN_HOST = * 				#metalogger监听的IP地址(默认是*,表示任何IP)
# MATOML_LISTEN_PORT = 9419 			#metalogger监听的端口地址(默认是9419)
# MATOML_LOG_PRESERVE_SECONDS = 600 

# MATOCS_LISTEN_HOST = * 				#用于chunkserver连接的IP地址(默认是*,表示任何IP)
# MATOCS_LISTEN_PORT = 9420 			#用于chunkserver连接的端口地址(默认是9420)
# MATOCL_LISTEN_HOST = *				#用于客户端挂接连接的IP地址(默认是,代表任何IP)
# MATOCL_LISTEN_PORT = 9421 			#用于客户端挂接连接的端口地址(默认是9421)
# CHUNKS_LOOP_MAX_CPS = 100000
# CHUNKS_LOOP_MIN_TIME = 300 			#chunks 的回环频率(默认是300秒)

# CHUNKS_SOFT_DEL_LIMIT = 10
# CHUNKS_HARD_DEL_LIMIT = 25
# CHUNKS_WRITE_REP_LIMIT = 2 			#在一个循环里复制到一个chunkserver的最大chunk数
# CHUNKS_READ_REP_LIMIT = 10 			#在一个循环里从一个chunkserver复制的最大chunk数
# ACCEPTABLE_DIFFERENCE = 0.1

# SESSION_SUSTAIN_TIME = 86400
# REJECT_OLD_CLIENTS = 0  				#弹出低于1.6.0的客户端挂接(0或1,默认是0)

# deprecated:
# CHUNKS_DEL_LIMIT - use CHUNKS_SOFT_DEL_LIMIT instead
# LOCK_FILE - lock system has been changed, and this option is used only to search for old lockfile
[root@master mfs]# vim mfsexports.cfg  		#不做任何修改
# Allow everything but "meta".
*                       /       rw,alldirs,maproot=0
# Allow "meta".
*                       .       rw

该文件每一个条目分为三部分:
第一部分:客户端的IP地址
第二部分:被挂接的目录
第三部分:客户端拥有的权限

第一部分:地址的表现方式:

  • 所有的IP地址
    192.168.200.101 单个IP地址
    192.168.200.0/24 IP网络地址/位数掩码
    192.168.200.0/255.255.255.0 IP网络地址/子网掩码
    192.168.200.1-192.168.200.100 IP段

第二部分:目录部分的标示:
/ 表示MFS根
. 表示MFSMETA文件系统

第三部分:权限部分的标示:
ro 只读模式共享
rw 读写的方式共享
alldirs 允许挂载任何指定的子目录
maproot 映射为root,还是指定的用户
Password 指定客户端密码

启动Master:

[root@master mfs]# /usr/local/mfs/sbin/mfsmaster start
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmaster modules ...
loading sessions ... file not found
if it is not fresh installation then you have to restart all active mounts !!!
exports file has been loaded
mfstopology: incomplete definition in line: 7
mfstopology: incomplete definition in line: 7
mfstopology: incomplete definition in line: 22
mfstopology: incomplete definition in line: 22
mfstopology: incomplete definition in line: 28
mfstopology: incomplete definition in line: 28
topology file has been loaded
loading metadata ...
create new empty filesystemmetadata file has been loaded
no charts data file - initializing empty charts
master <-> metaloggers module: listen on *:9419
master <-> chunkservers module: listen on *:9420
main master server module: listen on *:9421
mfsmaster daemon initialized properly

[root@localhost mfs]# ps aux |grep mfs
mfs        6636  0.0 19.1 108624 93016 ?        S<   14:06   0:00 /usr/local/mfs/sbin/mfsmaster start
root       6656  0.0  0.1 103240   856 pts/0    S+   14:10   0:00 grep mfs

停止Master:

[root@master mfs]# /usr/local/mfs/sbin/mfsmaster -s

2.搭建MetaLogger Server:

[root@metalogger ~]# useradd -M -s /sbin/nologin mfs
[root@metalogger ~]# yum -y install zlib-devel
[root@metalogger ~]# tar xf mfs-1.6.27-5.tar.gz -C /usr/src/
[root@metalogger ~]# cd /usr/src/mfs-1.6.27/
[root@metalogger mfs-1.6.27]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount && make && make install

复制配置文件:

[root@metalogger mfs-1.6.27]# cd /usr/local/mfs/etc/mfs/
[root@metalogger mfs]# cp mfsmetalogger.cfg.dist mfsmetalogger.cfg
[root@metalogger mfs]# vim mfsmetalogger.cfg
# WORKING_USER = mfs
# WORKING_GROUP = mfs
# SYSLOG_IDENT = mfsmetalogger
# LOCK_MEMORY = 0
# NICE_LEVEL = -19
# DATA_PATH = /usr/local/mfs/var/mfs
# BACK_LOGS = 50
# BACK_META_KEEP_PREVIOUS = 3
# META_DOWNLOAD_FREQ = 24
# MASTER_RECONNECTION_DELAY = 5
MASTER_HOST = 192.168.200.101	 //修改为Master Server 的IP地址
# MASTER_PORT = 9419
# MASTER_TIMEOUT = 60
# deprecated, to be removed in MooseFS 1.7
# LOCK_FILE = /var/run/mfs/mfsmetalogger.lock

[root@metalogger mfs]# ll -d /usr/local/mfs/var/mfs
drwxr-xr-x 2 root root 4096 10月 23 06:38 /usr/local/mfs/var/mfs
[root@metalogger mfs]# chown mfs:mfs /usr/local/mfs/var/

启动metalogger

[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]# ps aux | grep mfs
mfs       11382  0.2  0.2  11056   996 ?        S<   06:40   0:00 /usr/local/mfs/sbin/mfsmetalogger start
root      11386  0.0  0.1 103256   844 pts/0    S+   06:41   0:00 grep mfs

关闭metalogger

[root@metalogger mfs]# /usr/local/mfs/sbin/mfsmetalogger -s

3.搭建Chunk Server:
本案例中两台Chunk Server搭建过程一样,具体步骤如下:

[root@chunk1 ~]# yum -y install zlib-devel
[root@chunk1 ~]# useradd -M -s /sbin/nologin mfs
[root@chunk1 ~]# tar xf mfs-1.6.27-5.tar.gz -C /usr/src
[root@chunk1 ~]# cd /usr/src/mfs-1.6.27
[root@chunk1 mfs-1.6.27]# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount && make && make install

复制配置文件:

[root@chunk1 mfs-1.6.27]# cd /usr/local/mfs/etc/mfs/
[root@chunk1 mfs]# cp mfschunkserver.cfg.dist mfschunkserver.cfg
[root@chunk1 mfs]# cp mfshdd.cfg.dist mfshdd.cfg

[root@chunk1 mfs]# vi 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.200.101 //修改为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
# deprecated, to be removed in MooseFS 1.7
# LOCK_FILE = /var/run/mfs/mfschunkserver.lock
# BACK_LOGS = 50
# CSSERV_TIMEOUT = 5


[root@chunk1 mfs]# vim mfshdd.cfg   //指定共享出去的磁盘
# mount points of HDD drives
#
#/mnt/hd1
#/mnt/hd2
#etc.
/data   //添加一行/data,这里/data是一个给MFS的分区,生产环境最好是使用一个独立的分区或独立的磁盘挂载到此目录

[root@chunk1 mfs]# mkdir /data/

[root@chunk1 mfs]# 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 0xa87c7818.
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
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): 
Using default value 2610

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@chunk1 mfs]# partprobe /dev/sdb
[root@chunk1 mfs]# mkfs.ext4 /dev/sdb1
[root@chunk1 mfs]# mount /dev/sdb1 /data/  (看配置环境,分区自己建立)
[root@chunk1 mfs]# tail -1 /etc/fstab
/dev/sdb1		/data			ext4	defaults	0 0
[root@chunk1 mfs]# chown -R mfs:mfs /data/

启动chunks:

[root@chunk1 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@chunk1 mfs]# ps aux | grep mfs
mfs        6855  0.1  0.5 170876  2740 ?        S<l  22:54   0:00 /usr/local/mfs/sbin/mfschunkserver start
root       6883  0.0  0.1 103256   848 pts/0    S+   22:54   0:00 grep mfs

停止chunks:

[root@chunk1 mfs]# /usr/local/mfs/sbin/mfschunkserver -s

4.客户端的配置

[root@client ~]# yum -y install zlib-devel

1)安装fuse

[root@client ~]# tar xf fuse-2.9.2.tar.gz -C /usr/src
[root@client ~]# cd /usr/src/fuse-2.9.2
[root@client fuse-2.9.2]# ./configure && 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

2)安装MFS客户端:

[root@client ~]# useradd -s /sbin/nologin mfs 
[root@client ~]# tar xf mfs-1.6.27-5.tar.gz -C /usr/src
[root@client ~]# cd /usr/src/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 --disable-mfschunkserver --enable-mfsmount && make && make install

3)挂载MFS文件系统:

[root@client mfs-1.6.27]# mkdir /mfs 		#创建挂载点目录
[root@client mfs-1.6.27]# modprobe fuse  		#加载fuse模块到内核
[root@client mfs-1.6.27]# lsmod | grep fuse
fuse                   79956  0 

[root@client ~]# /usr/local/mfs/bin/mfsmount /mfs -H 192.168.200.101 	#挂载MFS
mfsmaster accepted connection with parameters: read-write,restricted_ip ; root mapped to root:root

[root@client ~]# df -Th
Filesystem           Type      Size  Used Avail Use% Mounted on
/dev/sda3            ext4       75G  3.8G   67G   6% /
tmpfs                tmpfs     491M   72K  491M   1% /dev/shm
/dev/sda1            ext4      190M   28M  153M  16% /boot
/dev/sr0             iso9660   4.4G  4.4G     0 100% /media/cdrom
192.168.200.101:9421 fuse.mfs   86G     0   86G   0% /mfs

如果要卸载MFS:
使用命令: umount /mfs

MFS的一些常用操作:
MFS在客户端安装完毕后,会生成 /usr/local/mfs/bin 目录。

[root@client ~]# echo "export PATH=/usr/local/mfs/bin:$PATH" >> /etc/profile
[root@client ~]# source /etc/profile
[root@client ~]# echo $PATH
/usr/local/mfs/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

mfsgetgoal 命令:
用来查询文件被复制的数量。-r : 可以对整个目录做递归式查询。goal是指文件被复制的数量。

[root@client ~]# mfsgetgoal -r /mfs/
/mfs/:
 directories with goal  1 :          1

命令mfssetgoal可以设置文件被复制的份数,生产环境里面chunk server的数量至少大于2,文件副本得小于等于chunk server的数量。

[root@client ~]# mfssetgoal -r 2 /mfs
/mfs:
 inodes with goal changed:               0
 inodes with goal not changed:           1
 inodes with permission denied:          0
[root@client ~]# mfsgetgoal -r /mfs/
/mfs/:
 directories with goal  2 :          1

创建文件测试如下:

[root@client ~]# cd /mfs/
[root@client mfs]# touch test
[root@client mfs]# mfsgetgoal test
test: 2

5.MFS监控
mfscgiserv使用python编写的一个web服务器,其监听的端口是9425,可以在master server上通过一个命令
/usr/local/mfs/sbin/mfscgiserv来启动,用户可以通过浏览器就可以全面监控所有客户的挂接,chunk server,master server, 以及客户端的各种操作。
在master server上做如下操作,启动mfscgiserv MFS监控器。

[root@master ~]# /usr/local/mfs/sbin/mfscgiserv 
lockfile created and locked
starting simple cgi server (host: any , port: 9425 , rootpath: /usr/local/mfs/share/mfscgi)

在一台客户端上通过浏览器输入地址(Master Server 的IP地址)http://192.168.200.101:9425

其中各部分的含义如下:
Info 显示MFS的基本信息
Servers 列出现有Chunk Server
Disks 列出现有Chunk Server的硬盘信息
Exports 列出可被挂载的目录
Mounts 列出被挂载的目录
Operations 显示正在执行的操作
Master charts 显示Master Server 的操作情况,读,写,删除等操作
Server charts 显示Chunk Server 的操作情况,数据传输及系统状态

6.MFS维护及灾难恢复。
MFS集群的启动与停止。
MFS集群启动的顺序如下:
1) 启动mfsmaster进程
2) 启动所有的mfschunkserver进程
3) 启动mfsmetalogger进程(如果配置了mfsmetalogger)
4) 在所有的客户端挂载MFS文件系统

MFS集群停止的顺序如下:
1) 在所有的客户端卸载MFS文件系统
2) 用mfschunserver -s命令停止chunkserver进程
3) 用mfsmetalogger -s 命令停止metalogger进程
4) 用mfsmaster -s 命令停止master进程

2) MFS灾难恢复
整个MFS体系中,直接断电后,会导致master可能无法启动,可以在Master上使用命令/usr/local/mfs/sbin/mfsmetarestore -a修复

MFS元数据通常有两部分的数据,分别如下。
(1)主要元数据文件metadata.mfs,当mfsmaster运行时会被命名为metadata.mfs.back。
(2)元数据改变日志changelog.*.mfs.存储了过去的N小时的文件改变(N的数值是由BACK_LOGS参数设置的,参数的设置在mfschunkserver.cfg配置文件中)。

Master发生故障时,可以从metalogger中恢复master,步骤如下:
1)按照以前配置再安装一台mfsmaster
2)将metalogger上/usr/local/mfs/var/mfs/目录下的文件复制到mfsmaster相应的目录中。

[root@master ~]# scp root@192.168.200.102:/usr/local/mfs/var/mfs/* /usr/local/mfs/*

3)利用mfsmetarestore命令合并元数据changelogs

[root@master ~]# /usr/local/mfs/sbin/mfsmetarestore -m metadata_ml_mfs.bak -o metadata.mfschangelog_ml.*.mfs

如果是全新安装的Master,恢复数据后,需要更改metalogger和 chunkserver 配置 MASTER_HOST 的IP地址, 客户端也需要重新挂载。


该文章采用「CC 协议」,转载必须注明作者和本文链接.
分类: Linux