Moosefs 分布式存储node
MFS 特性: linux
1. Free(GPL) web
2. 通用文件系统,不须要修改上层应用就可使用 浏览器
3. 能够在线扩容,体系架构可伸缩性极强。 缓存
4. 部署简单。 安全
5. 高可用,可设置任意的文件冗余程度(提供比 raid1+0 更高的冗余级别,而绝对不会影响读或 服务器
写的性能,只会加速!) 网络
6. 可回收在指定时间内删除的文件(“回收站”提供的是系统级别的服务,不怕误操做了,提供类 session
似 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 启动后,metalogger、chunker、client 三个元素都能自动与 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。这样将会丢失那些正在传输的数据。