Moosefs 分布式存储


                                                   Moosefs 分布式存储

MFS 特性:

1. Free(GPL)

2. 通用文件系统,不需要修改上层应用就可以使用

3. 可以在线扩容,体系架构可伸缩性极强。

4. 部署简单。

5. 高可用,可设置任意的文件冗余程度(提供比 raid1+0 更高的冗余级别,而绝对不会影响读或

写的性能,只会加速!)

6. 可回收在指定时间内删除的文件(“回收站”提供的是系统级别的服务,不怕误操作了,提供类

oralce 的闪回等高级 dbms 的即时回滚特性!)

7. 提供 netapp,emc,ibm 等商业存储的 snapshot 特性。(可以对整个文件甚至在正在写入的文

件创建文件的快照)

8. google filesystem 的一个 c 实现。

9. 提供 web gui 监控接口。

10. 提高随机读或写的效率。

11. 提高海量小文件的读写效率。

可能的瓶颈:

1. master 本身的性能瓶颈。mfs 系统 master 存在单点故障如何解决?moosefs+drbd+heartbeat

来保证 master 单点问题?不过在使用过程中不可能完全不关机和间歇性的网络中断!

2. 体系架构存储文件总数的可遇见的上限。(mfs 把文件系统的结构缓存到 master 的内存中,

件越多,master 的内存消耗越大,8g 对应 2500w 的文件数,2 亿文件就得 64GB 内存 )

master 服务器 CPU 负载取决于操作的次数,内存的使用取决于文件和文件夹的个数。

MFS 文件系统结构:

包含 4 种角色:

管理服务器 managing server (master)

元数据日志服务器 Metalogger server(Metalogger)

数据存储服务器 data servers (chunkservers)

客户机挂载使用 client computers各种角色作用:

1. 管理服务器:负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷

贝。

2. 元数据日志服务器: 负责备份 master 服务器的变化日志文件,文件类型为

changelog_ml.*.mfs,以便于在 master server 出问题的时候接替其进行工作。

3. 数据存储服务器:负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数

据传输。

4. 客户端: 通过 fuse 内核接口挂接远程管理服务器上所管理的数据存储服务器,看起来共享的文

件系统和本地 unix 文件系统使用一样的效果。原始的读/写速度很明显是主要取决于所使用的硬盘的性能、网络的容量和拓扑结构的,使用的硬

盘和网络的吞吐量越好,整个系统的性能也就会越好。


********************************************************************

ip分配:

管理服务器managing server (master) 172.25.28.7 (vm7)                            

数据存储服务器1 managing server (master) :172.25.28.1(vm1)

数据存储服务器2 managing server (master) :172.25.28.4(vm4)

客户机挂载使用 client computers:172.25.28.42 (我的真机)

软件下载:www.moosefs.org

生成 rpm,便于部署:

# yum install gcc make rpm-build fuse-devel zlib-devel -y

# rpmbuild -tb mfs-1.6.27.tar.gz  

# ls ~/rpmbuild/RPMS/x86_64

mfs-cgi-1.6.27-4.x86_64.rpm

mfs-cgiserv-1.6.27-4.x86_64.rpm

mfs-chunkserver-1.6.27-4.x86_64.rpm

mfs-client-1.6.27-4.x86_64.rpm

mfs-master-1.6.27-4.x86_64.rpm

mfs-metalogger-1.6.27-4.x86_64.rpm

主控服务器 Master server 安装:

# yum localinstall -y mfs-cgiserv-1.6.27-4.x86_64.rpm  mfs-cgi-1.6.27-4.x86_64.rpm mfs-master-1.6.27-4.x86_64.rpm

cd /etc/mfs/

[root@vm7 mfs]# mv mfsexports.cfg.dist mfsexports.cfg

# vi mfsexports.cfg

192.168.0.0/24

/

rw,alldirs,maproot=0

该文件每一个条目分为三部分:

第一部分:客户端的 ip 地址

第二部分:被挂接的目录

第三部分:客户端拥有的权限

地址可以指定的几种表现形式:

*              所有的 ip 地址

A.B.C.D                 单个 ip 地址

A.B.C.D/BITS         IP 网络地址/位数掩码

A.B.C.D/E.F.G.H IP 网络地址/子网掩码

A.B.C.D-E.F.G.H IP 地址范围

目录部分需要注意两点:

/ 标识 MooseFS ;

. 表示 MFSMETA 文件系统

权限部分:

ro     只读模式共享

rw     读写方式共享

alldirs   许挂载任何指定的子目录

maproot    映射为 root,还是指定的用户

password    指定验证密码,客户端挂载时使用

[root@vm7 mfs]# mv mfsmaster.cfg.dist mfsmaster.cfg

mfsmaster.cfg:

此文件中凡是用#注释掉的变量均使用其默认值,基本不需要就可以工作:

#WORKING_USER WORKING_GROUP:是运行 master server 的用户和组;

#SYSLOG_IDENT:master server syslog 中的标识;

#LOCK_MEMORY:是否执行 mlockall()以避免 mfsmaster 进程溢出(默认为 0);

#NICE_LEVE:运行的优先级(如果可以默认是 -19; 注意: 进程必须是用 root 启动);

#EXPORTS_FILENAME:被挂接目录及其权限控制文件的存放位置

#TOPOLOGY_FILENAME : 定义 MFS 网络拓扑结构的文件位置

#DATA_PATH:数据存放路径,此目录下大致有三类文件,changelog,sessions stats;

#BACK_LOGS:metadata 的改变 log 文件数目(默认是 50);

#BACK_META_KEEP_PREVIOUS:保存以前 mfs 元数据的文件数,默认值是 1;

#REPLICATIONS_DELAY_INIT:延迟复制的时间(默认是 300s);

#REPLICATIONS_DELAY_DISCONNECT:chunkserver 断开的复制延迟(默认是 3600);

# MATOML_LISTEN_HOST:metalogger 监听的 IP 地址(默认是*,代表任何 IP);

# MATOML_LISTEN_PORT:metalogger 监听的端口地址(默认是 9419);

# MATOCS_LISTEN_HOST:用于 chunkserver 连接的 IP 地址(默认是*,代表任何 IP);

# MATOCS_LISTEN_PORT:用于 chunkserver 连接的端口地址(默认是 9420);

# MATOCU_LISTEN_HOST/MATOCL_LISTEN_HOST:用于客户端挂接连接的 IP 地址(默认是*, 代表任何 IP);

# MATOCU_LISTEN_PORT/MATOCL_LISTEN_PORT:用于客户端挂接连接的端口地址(默认 是 9421);

#CHUNKS_LOOP_CPS:chunks 的回环每秒检查的块最大值,默认 100000;

# CHUNKS_LOOP_TIME :chunks 的回环频率(默认是:300 );

# CHUNKS_SOFT_DEL_LIMIT :一个 chunkserver 中可以删除 chunks 的最大数,软限 (默认: 10)

#CHUNKS_HARD_DEL_LIMIT:一个 chunkserver 中可以删除 chunks 的最大数,硬限 (默认: 25)

# REPLICATIONS_DELAY_DISCONNECT:chunkserver 断开后的复制延时(默认:3600 )

# CHUNKS_WRITE_REP_LIMIT:在一个循环里复制到一个 chunkserver 的最大 chunk 数目(默 认是 2)

# CHUNKS_READ_REP_LIMIT :在一个循环里从一个 chunkserver 复制的最大 chunk 数目(默 认是 10)

# REJECT_OLD_CLIENTS:弹出低于 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@vm7 mfs]# mv  mfstopology.cfg.dist mfstopology.cfg

# cd /var/lib/mfs

# cp metadata.mfs.empty metadata.mfs

# chown nobody /var/lib/mfs

修改/etc/hosts 文件,增加下面的行:

172.25.28.7 mfsmaster

# mfsmaster start

启动 master server

working directory: /var/lib/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 configuration file (/etc/mfstopology.cfg) not found - using defaults

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


此时进入/var/lib/mfs 可以看到 moosefs 所产生的数据:

.mfsmaster.lock      文件记录正在运行的 mfsmaster 的主进程

metadata.mfs, metadata.mfs.back MooseFS 文件系统的元数据 metadata 的镜像

changelog.*.mfs MooseFS 文件系统元数据的改变日志(每一个小时合并到metadata.mfs 中一次)

注意:Metadata 文件的大小是取决于文件数的多少(而不是他们的大小)changelog 日志的大小是取决 于每小时操作的数目,但是这个时间长度(默认是按小时)是可配置的。


# mfscgiserv

#启动 CGI 监控服务

lockfile created and locked

starting simple cgi server (host: any , port: 9425 , rootpath: /usr/share/mfscgi)

# cd /usr/share/mfscgi/

# chmod +x chart.cgi mfs.cgi

在浏览器地址栏输入 http://172.25.28.7:9425 即可查看 master 的运行情况


存储块服务器 Chunk servers 安装:

分别在两台存储机器上面执行以下操作:

# yum localinstall -y mfs-chunkserver-1.6.26-1.x86_64.rpm

# cd /etc/

# cp mfschunkserver.cfg.dist mfschunkserver.cfg

解释:

# WORKING_USER = nobody

# WORKING_GROUP =

# SYSLOG_IDENT = mfschunkserver

# LOCK_MEMORY = 0

# NICE_LEVEL = -19

# DATA_PATH = /var/lib/mfs

# MASTER_RECONNECTION_DELAY = 5:在失去连接之后延迟多少秒重新连接 master

# BIND_HOST = *:本地地址用于连接 mfsmaster(默认值是*,即默认的本地地址)

# MASTER_HOST = mfsmaster:master 服务器的主机名或是 ip 地址。

# MASTER_PORT = 9420

# MASTER_TIMEOUT = 60

# CSSERV_LISTEN_HOST = *:允许挂载的客户端连接的 IP 地址(*允许全部)

# CSSERV_LISTEN_PORT = 9422:允许挂载的客户端连接的端口

# HDD_CONF_FILENAME = /etc/mfshdd.cfg:分配给 MFS 使用的磁盘空间配置文件的位置

# 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

# cp mfshdd.cfg.dist mfshdd.cfg

# vi mfshdd.cfg

定义 mfs 共享点

/mnt/chunk1

/mnt/chunk2

# chown -R nobody:nobody /mnt/chunk1

# chown -R nobody:nobody /mnt/chunk2

修改/etc/hosts 文件,增加下面的行:

172.25.28.7 mfsmaster

mkdir /var/lib/mfs

chown nobody /var/lib/mfs

# mfschunkserver start

working directory: /var/lib/mfs

lockfile created and locked

initializing mfschunkserver modules ...

hdd space manager: path to scan: /mnt/mfschunks2/

hdd space manager: path to scan: /mnt/mfschunks1/

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

现在再通过浏览器访问 http://172.25.28.7:9425/ 应该可以看见这个 MooseFS 系统的全部信息, 包括主控 master 和存储服务 chunkserver


客户端 client 安装:

# yum localinstall -y mfs-client-1.6.26-1.x86_64.rpm

# cd /etc

# cp mfsmount.cfg.dist mfsmount.cfg

# vi mfsmount.cfg    定义客户端默认挂载

/mnt/mfs

[root@localhostmfs]# mfsmount

mfsmaster accepted connection with parameters: read-write,restricted_ip ; root mapped to root:root

[root@localhostmfs]# df

Filesystem     1K-blocks      Used Available Use% Mounted on

mfsmaster:9421   5313664    553408   4760256  11% /mnt/mfs


MFS 测试:

MFS 挂载点下创建两个目录,并设置其文件存储份数:

# cd /mnt/mfs

# mkdir dir1 dir2

# mfssetgoal -r 2 dir2/

设置在 dir2 中文件存储份数为两个,默认是一个

dir2/:

inodes with goal changed:

1

inodes with goal not changed:

0

inodes with permission denied:

0

对一个目录设定“goal”,此目录下的新创建文件和子目录均会继承此目录的设定,但不会改变已 经存在的文件及目录的 copy 份数。但使用-r 选项可以更改已经存在的 copy 份数。

拷贝同一个文件到两个目录

# cp /etc/passwd dir1# cp /etc/passwd dir2

查看文件信息

# mfsfileinfo dir1/passwd

dir1/passwd:

chunk 0: 0000000000000001_00000001 / (id:1 ver:1)

copy 1: 192.168.0.2:9422

# mfsfileinfo dir2/passwd

dir2/passwd:

chunk 0: 0000000000000002_00000001 / (id:2 ver:1)

copy 1: 192.168.0.1:9422

copy 2: 192.168.0.2:9422

关闭 mfschunkserver2 后再查看文件信息

# mfsfileinfo dir1/passwd

dir1/passwd:

chunk 0: 0000000000000001_00000001 / (id:1 ver:1)

no valid copies !!!

# mfsfileinfo dir2/passwd

dir2/passwd:

chunk 0: 0000000000000002_00000001 / (id:2 ver:1)

copy 1: 192.168.0.1:9422

启动 mfschunkserver2 ,文件回复正常。

恢复误删文件

# rm -f dir1/passwd

# mfsgettrashtime dir1/

dir1/: 86400

文件删除后存放在“ 垃圾箱”中的时间称为隔离时间, 这个时间可以用 mfsgettrashtime 命令来查 看,mfssettrashtime 命令来设置,单位为秒,默认为 86400 秒。

# mkdir /mnt/mfsmeta

# mfsmount -m /mnt/mfsmeta/ -H mfsmaster

挂载 MFSMETA 文件系统,它包含目录 trash (包含仍然可以被还原的删除文件的信息)trash/undel (用于获取文件)。把删除的文件,移到/ trash/undel ,就可以恢复此文件。 # cd /mnt/mfsmeta/trash

# mv 00000004\|dir1\|passwd undel/

dir1 目录中可以看到 passwd 文件恢复

MFSMETA 的目录里,除了 trash trash/undel 两个目录,还有第三个目录 reserved,该目 录内有已经删除的文件,但却被其他用户一直打开着。在用户关闭了这些被打开的文件后, reserved 目录中的文件将被删除,文件的数据也将被立即删除。此目录不能进行操作。


修改 linux 下最大文件描述符的限制:

在进行大量小文件写时,可能会出现了一个严重错误,有可能和操作系统文件描述符有关。操作

系统默认文件描述符为 1024.

1.6.26 版本默认为 100000

建议上线时,master chunker 修改文件描述符系统级限制:它是限制所有用户打开文件描述符的总和,可以通过修改内核参数来更改该限制:

# vi /etc/sysctl.conf 添加

fs.file-max=102400

如果此值默认够大可以不用更改

# sysctl -p

命令使其生效。

用户级限制:只是修改用户级的最大文件描述符限制,也就是说每一个用户登录后执行的程序占

用文件描述符的总数不能超过这个限制。

# vi /etc/security/limits.conf

* - nofile 102400

保存退出后重新登录,其最大文件描述符已经被永久更改了。

file-max 参数相对应的还有 file-nr,这个参数是只读的,可以查看当前文件描述符的使用情况。

# sysctl -a|grep file

fs.file-nr = 12800 0 782554

fs.file-max = 782554


快照

MooseFS 系统的另一个特征是利用 mfsmakesnapshot 工具给文件或者是目录树做快照:

# mfsmakesnapshot source ... destination

Mfsmakesnapshot 是在一次执行中整合了一个或是一组文件的拷贝,而且任何修改这些文件的源 文件都不会影响到源文件的快照, 就是说任何对源文件的操作,例如写入源文件,将不会修改副 本(或反之亦然)

文件快照可以用 mfsappendchunks,例如:

# mfsappendchunks destination-file source-file ...

当有多个源文件时,它们的快照被加入到同一个目标文件中(每个 chunk 的最大量是 chunk)


为了安全停止 MooseFS 集群,建议执行如下的步骤:

# umount -l /mnt/mfs    #客户端卸载 MooseFS 文件系统

# mfschunkserver stop  #停止 chunk server 进程

# mfsmetalogger stop   #停止 metalogger 进程

# mfsmaster stop          #停止主控 master server 进程

安全的启动 MooseFS 集群:

# mfsmaster start          #启动 master 进程

# mfschunkserver start   #启动 chunkserver 进程

# mfsmetalogger start     #启动 metalogger 进程

# mfsmount                     #客户端挂载 MooseFS 文件系统

实际上无论如何顺序启动或关闭,未见任何异常,master 启动后,metaloggerchunkerclient 三个元素都能自动与 master 建立连接。


故障测试:

Client 客户端断电、断网对 MFS 的体系不产生影响.如果客户端误杀 killall -9 mfsmount 进程,需要先 umount /mnt/mfs,然后再 mfsmount。否则会 提示:/mnt/mfs: Transport endpoint is not connected

chunkserver :

传输一个大文件,设置存储 2 份。传输过程中,关掉 chunker1,这样绝对会出现有部分块只存在 chunker2 ;启动 chunker1,关闭 chunker2,这样绝对会有部分块只存在 chunker1 上。 把 chunker2 启动起来。整个过程中,客户端一直能够正常传输。使用 mfsfileinfo 查看此文件,发 现有的块分布在 chunker1 ,有的块分布在 chunker2 上。使用 mfssetgoal -r 1 ,所有块都修 改成 1 块了,mfssetgoal -r 2,所有块都修改成 2 份了。


断网、杀掉 mfschunkserver 程序对 MFS 系统无影响。

断电:

#无文件传输时,对两个 chunker 都无影响;

#当有文件传输时,但是文件设置存储一份时,对文件的存储无影响。

#文件设置存储两份,数据传输过程中,关掉 chunker1,等待数据传输完毕后,启动

chunker1.chunker1 启动后,会自动从 chunker2 复制数据块。整个过程中文件访问不受影响。

#文件设置存储两份,数据传输过程中,关掉 chunker1,不等待数据传输完毕,开机启动

chunker1.chunker1 启动后,client 端会向 chunker1 传输数据,同时 chunker1 也从 chunker2 复 制缺失的块。 只要不是两个 chunker 服务器同时挂掉的话,就不会影响文件的传输,也不会影响服务的使用。

master :

断网、杀掉 MFS master 服务对 MFS 系统无影响。

断电可能会出现以下的情况:

#当没有文件传输时,可在服务器重启之后,运行 mfsmetarestore –a 进行修复,之后执行

mfsmaster start 恢复 master 服务。

# mfsmetarestore -a

loading objects (files,directories,etc.) ... ok

loading names ... ok

loading deletion timestamps ... ok

loading chunks data ... ok

checking filesystem consistency ... ok

connecting files and chunks ... ok

store metadata into file: /var/lib/mfs/metadata.mfs

# mfsmaster start

working directory: /var/lib/mfs

lockfile created and locked

initializing mfsmaster modules ...

loading sessions ... ok

sessions file has been loaded

exports file has been loaded

mfstopology configuration file (/etc/mfstopology.cfg) not found - using defaults

loading metadata ...

loading objects (files,directories,etc.) ... ok

loading names ... ok

loading deletion timestamps ... ok

loading chunks data ... ok

checking filesystem consistency ... ok

connecting files and chunks ... ok

all inodes: 5

directory inodes: 3

file inodes: 2

chunks: 2

metadata file has been loaded

stats file has been loaded

master <-> metaloggers module: listen on *:9419

master <-> chunkservers module: listen on *:9420

main master server module: listen on *:9421

mfsmaster daemon initialized properly

#当有文件传输时,可能会在/usr/local/mfs/sbin/mfsmetarestore –a 进行修复时可能会出现:

# mfsmetarestore -a

loading objects (files,directories,etc.) ... ok

loading names ... ok

loading deletion timestamps ... ok

loading chunks data ... ok

checking filesystem consistency ... ok

connecting files and chunks ... ok

S:115: error: 32 (Data mismatch)

此时无法修复也无法启动 master 服务,有个应急的办法是将 metadata.mfs.back 复制成

metadata.mfs,然后再启动 master。这样将会丢失那些正在传输的数据。



你可能感兴趣的:(Moosefs 分布式存储)