文章前面想说的话:这篇博客写出来真是有点累到了,本来昨天就基本就写好了,放在草稿里面,今天打开就没有了!!唉,就尼玛离我而去了,只有重写,然后中间虚拟机还“爆炸”重启又搞了一会,不容易呀!!希望各位博友看到有理解错误的地方还是能帮我指出来。

 

一、MFS简介

1、MFS是啥,能做啥?

MooseFS是一种分布式文件系统,它把数据分散存放在多个物理服务器上,前面只放置一台负责“调度”元数据服务器,最终呈现给用户的则是一个统一的资源。相对于集中式文件系统来说,分布式系统拥有更好的扩展性、稳定性、数据的安全性。

2、架构及实现原理

⑴、MooseFS文件系统架构包括以下四种角色:

a.管理服务器 managing server (Master):负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝。

b.元数据日志服务器 Metalogger server(Metalogger):负责备份Master服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在master server出问题的时候接替其进行工作。

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

d.客户机挂载使用client computers:通过fuse内核接口挂接远程管理服务器上所管理的数据存储服务器,看起来共享的文件系统和本地 unix 文件系统使用一样的效果。

⑵、实现原理

①MFS WIRTE 过程大概:

1、客户端向元数据服务器发送写入请求。
2、元数据服务器与Chunk Server进行交互(只有当所需的分块Chunks不存在的时候才进行这个交互):
 a、元数据服务器只是在某些服务器创建新的分块chunks。
 b、Chunk Servers告知元数据服务器,步骤a已经操作成功。
3、元数据服务器告知客户端,你可以在哪个Chunk Server的哪些Chunks写入数据。
4、客户端向指定的Chunk Server写入数据
5、Chunk Server与其他Chunk Server进行数据同步。
6、Chunk Server之间同步成功。
7、Chunk Server告知客户端数据写入成功。

8、客户端告知元数据服务器本次写入完毕。

如下图:

②MFS READ 过程大概:

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

4、Chunk Server向客户端发送数据

如下图:

二、MFS实战部署

1、环境

系统及虚拟化软件:CENTOS 7.3、VMworkstation

四台虚拟机:Master(10.0.0.5)、LOG SERVER(10.0.0.6)、CHUNK SERVER1(10.0.0.31)

、CHUNK SERVER2(10.0.0.32)、CLIENT直接装在CHUNK SERVER2上

所需软件包和依赖包:moosefs-3.0.96.tar.gz、zlib-devel、make、gcc、fuse、fuse-devel

 

2、Mster服务器安装、部署

1
2
3
4
5
6
7
8
##node3(10.0.0.5)上安装MFS
[root@node3 src]#useradd mfs -s /sbin/nologin -M -g 1002 ##确保每一台上的MFS用户GID、UID相同
[root@node3 src]#tar -xf moosefs-3.0.96.tar.gz
[root@node3 src]#cd moosefs-3.0.96
[root@node3 moosefs-3.0.96]#./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
...
[root@node3 moosefs-3.0.96]#make && make install 
 ...
1
2
3
4
5
6
7
8
##配置Mster服务器文件
[root@node3 moosefs-3.0.96]#/usr/local/mfs/etc/mfs
[root@node3 mfs]#cp mfsexports.cfg.sample mfsexports.cfg
[root@node3 mfs]# cp mfsmaster.cfg.sample  mfsmaster.cfg
[root@node3 mfs]#vim mfsexports.cfg         ##只需修改此文件,一般mfsmaster.cfg使用默认即可
*            /         rw,alldirs,mapall=mfs:mfs,password=redhat          ##最后一行添加。文件中,每一个条目就是一个配置规则,而每一个条目又分为三个部分,
                                                                          ##其中第一部分是mfs客户端的ip地址或地址范围,第二部分是被挂载的目录,第三个部分用来设置mfs客户端可以拥有的访问权限
[root@node3 mfs]#cp /usr/local/mfs/var/mfs/metadata.mfs.empty /usr/local/mfs/var/mfs/metadata.mfs  ##手工开启元数据文件默认是empty文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
##MFS启动以及检测
[root@node3 mfs]# /usr/local/mfs/sbin/mfsmaster start 
open files limit has been set to: 16384
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmaster modules ...
exports file has been loaded
mfstopology configuration file (/usr/local/mfs/etc/mfstopology.cfg) not found - using defaults
loading metadata ...
metadata 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@node3 src]#  ps -ef | grep mfs      #检测服务是否开启
mfs        1799      1  0 Oct29 ?        00:06:16 /usr/local/mfs/sbin/mfsmaster -a
root      23864   1462  0 16:46 pts/0    00:00:00 grep --color=auto mfs
 
[root@node3 mfs]#netstat -ntlp           ##检测端口是否开启,本来服务器成功部署
tcp        0      0 0.0.0.0:9419            0.0.0.0:*               LISTEN      1799/mfsmaster      
tcp        0      0 0.0.0.0:9420            0.0.0.0:*               LISTEN      1799/mfsmaster      
tcp        0      0 0.0.0.0:9421            0.0.0.0:*               LISTEN      1799/mfsmaster

 

3、LOG SERVER安装、部署

1
2
3
4
5
6
7
8
##node4(10.0.0.6) 安装MFS
[root@node3 src]#useradd mfs -s /sbin/nologin -M -g 1002
[root@node3 src]#tar -xf moosefs-3.0.96.tar.gz
[root@node3 src]#cd moosefs-3.0.96
[root@node3 moosefs-3.0.96]#./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount
...
[root@node3 moosefs-3.0.96]#make && make install 
 ...
1
2
3
4
5
##配置 LOG SERVER 
[root@node4 moosefs-3.0.96]# cd /usr/local/mfs/etc/mfs/
[root@node4 mfs]# cp mfsmetalogger.cfg.sample mfsmetalogger.cfg
[root@node4 mfs]# vim mfsmetalogger.cfg 
MASTER_HOST = 10.0.0.5       ##此行值修改为MSTER SERVER IP,连接日志服务器连接到主服务器上备份元数据
1
2
3
4
5
6
7
##MFS启动以及检测
[root@node4 ~]# /usr/local/mfs/sbin/mfsmetalogger start
...
[root@node4 ~]# ps -ef |  grep meta  ##程序正常工作
mfs        1768      1  0 Oct29 ?        00:02:35 /usr/local/mfs/sbin/mfsmetalogger start
[root@node4 ~]# netstat -lantp|grep metalogger  ##与MASTER 端口建立连接
tcp        0      0 10.0.0.6:60518          10.0.0.5:9419           ESTABLISHED 1768/mfsmetalogger

 

4、CHUNK SERVER1安装、部署

 
1
2
3
4
5
6
7
8
##node1(10.0.0.31)安装MFS
[root@node3 src]#useradd mfs -s /sbin/nologin -M -g 1002 ##确保每一台上的MFS用户GID、UID相同
[root@node3 src]#tar -xf moosefs-3.0.96.tar.gz
[root@node3 src]#cd moosefs-3.0.96
[root@node3 moosefs-3.0.96]#./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --disable-mfsmount ##配置发生改变
...
[root@node3 moosefs-3.0.96]#make && make install 
 ...
1
2
3
4
5
6
7
8
9
10
##配置CHUNK SERVER1
[root@node1 moosefs-3.0.96]# cd /usr/local/mfs/etc/mfs/
[root@node1 mfs]#cp mfschunkserver.cfg.sample mfschunkserver.cfg
[root@node1 mfs]# vim mfschunkserver.cfg 
MASTER_HOST = 10.0.0.5  ##修改此行值为MASTER IP
[root@node1 mfs]#cp mfshdd.cfg.sample  mfshdd.cfg
[root@node1 mfs]#mkdir /data    ##创建用来储存数据目录
[root@node1 mfs]#chown -R mfs:mfs /data/
[root@node1 mfs]#vim mfshdd.cfg                ##该文件用来设置你将 Chunk Server 的哪个目录共享出去给 Master Server进行管理。当然,虽然这里填写的是共享的目录,但是这个目录后面最好是一个单独的分区。
/data                                 ###最后一行加入储存数据的目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
###启动MFS、状态检查
[root@node1 mfs]# /usr/local/mfs/sbin/mfschunkserver start
open files limit has been set to: 16384
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
setting glibc malloc arena max to 4
setting glibc malloc arena test to 4
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@node1 ~]# ps -ef | grep  chunk
mfs        1818      1  0 Oct29 ?        00:08:05 /usr/local/mfs/sbin/mfschunkserver
root       9827   1623  0 17:11 pts/0    00:00:00 grep --color=auto chunk
##连接是否建立
[root@node1 ~]# netstat -lantp|grep 9420
tcp        0      0 10.0.0.31:43148         10.0.0.5:9420           ESTABLISHED 1818/mfschunkserver

 

5、CHUNK SERVER2和CLIENT安装、部署

1
2
3
4
5
6
7
8
##node2(10.0.0.32)安装MFS
[root@node3 src]#useradd mfs -s /sbin/nologin -M -g 1002 ##确保每一台上的MFS用户GID、UID相同
[root@node3 src]#tar -xf moosefs-3.0.96.tar.gz
[root@node3 src]#cd moosefs-3.0.96
[root@node3 moosefs-3.0.96]#./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfsmaster --enable-mfsmount ##由于我硬件限制,我将CLINET和CHUNK SERVER2安装在一起,配置要--enable-mfsmount
...
[root@node3 moosefs-3.0.96]#make && make install 
 ...
1
2
3
4
5
6
7
8
9
[root@node2 moosefs-3.0.96]# cd /usr/local/mfs/etc/mfs/
[root@node2 mfs]#cp mfschunkserver.cfg.sample mfschunkserver.cfg
[root@node2 mfs]# vim mfschunkserver.cfg 
MASTER_HOST = 10.0.0.5  ##修改此行值为MASTER IP
[root@node2 mfs]#cp mfshdd.cfg.sample  mfshdd.cfg
[root@node2 mfs]#mkdir /data    ##创建用来储存数据目录
[root@node2 mfs]#chown -R mfs:mfs /data/
[root@node2 mfs]#vim mfshdd.cfg                ##该文件用来设置你将 Chunk Server 的哪个目录共享出去给 Master Server进行管理。当然,虽然这里填写的是共享的目录,但是这个目录后面最好是一个单独的分区。
/data
1
##服务启动状态检测应与CHUNK SERVER1几乎相同
1
2
3
4
5
6
7
8
##CLINET部分,先检查fuse模块是否加载
[root@node2 bin]# lsmod | grep fuse
fuse                   87741  1            ##如果没有,modeprobe fuse 加载此模块如果在失败应该是内核版本过低,升级内核、
##创建CLIENT 挂载目录
[root@node2 bin]#mkdire /mfsdata
[root@node2 bin]#chown -R mfs:mfs /mfsdata/
##挂载目录
[root@node2 bin]#/usr/local/mfs/bin/mfsmount /mfsdata -H 10.0.0.5

三、MFS功能测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@node2 /]# cd /mfsdata/
[root@node2 mfsdata]# vim 111.txt
wo shi 11111
##切换到MASTER SERVER
[root@node3 mfs]# vim /usr/local/mfs/var/mfs/changelog.0.mfs   
89: 1509355991|SESADD(#10705800883749376268,1,16,0000,1001,1001,1001,1001,1,9,0,4294967295,167772192,/mfsdata):2
90: 1509356218|ACQUIRE(2,5)
91: 1509356218|ATTR(5,420,1001,1001,1509356218,1509356218,0,0)
92: 1509356229|ACCESS(1)
93: 1509356231|CREATE(1,.111.txt.swp,1,384,18,1001,1001,0):12
94: 1509356231|ACQUIRE(2,12)
##切换到LOG SERVER
[root@node4 mfs]# vim changelog_ml.0.mfs
89: 1509355991|SESADD(#10705800883749376268,1,16,0000,1001,1001,1001,1001,1,9,0,4294967295,167772192,/mfsdata):2
90: 1509356218|ACQUIRE(2,5)
91: 1509356218|ATTR(5,420,1001,1001,1509356218,1509356218,0,0)
92: 1509356229|ACCESS(1)
93: 1509356231|CREATE(1,.111.txt.swp,1,384,18,1001,1001,0):12
94: 1509356231|ACQUIRE(2,12)
95: 1509356231|CREATE(1,.111.txt.swx,1,384,18,1001,1001,0):13
96: 1509356231|ACQUIRE(2,13)
##可以看到LOG SERVER已经把MASTER SERVER 记录备份到日志服务器上
##在CLIENT上,还可以具体查看数据的副本数量,更多功能有兴趣自己可以查一下
[root@node2 mfsdata]# /usr/local/mfs/bin/mfsfileinfo  /mfsdata/111.txt 
/mfsdata/111.txt:
    chunk 0: 0000000000000007_00000001 / (id:7 ver:1)
        copy 1: 10.0.0.31:9422 (status:VALID)
        copy 2: 10.0.0.32:9422 (status:VALID)

四、总结

从原理架构到实际搭建部署,不知道大家有没有发现一点,在MSTAER SERVER这个点不是有点像是单点,在实际生产环境中是尽量允许单点的存在,特别是想在“调度器”这类角色的服务器上,他们的状态影响着整个服务器集群的状态和对外提供服务的好坏。虽然放置了一台日志服务器,可以从日志服务器拿备份的元数据做恢复,但是恢复的这段时间服务就要停掉吗??所以后面我们要把MFS跟DRBD高可用结合起来,实现故障的自动切换。

mfs分布式系统从理论简介到实战部署的更多相关文章

  1. Zookeeper+Kafka完全分布式实战部署

    Zookeeper+Kafka完全分布式实战部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实我之前部署过kafak和zookeeper的完全分布式,集群是可以正常使用没错, ...

  2. 分布式系统CAP理论与CA选择

    总结: CAP指的是数据一致性.服务可用性.分区容错性:(这里的一致性指的是强一致性,又叫原子性或线性一致性:可用性指的是所有读写操作都要能终止,没有时延上的要求) 分布式系统中P是必选项:在P必选的 ...

  3. Docker swarm 实战-部署wordpress

    Docker swarm 实战-部署wordpress 创建一个overlay的网络 docker network create -d overlay demo 6imq8da3vcwvj2n499k ...

  4. nginx之 nginx-1.9.7 编译安装、理论简介

    nginx是一个web网站常用的高性能http和反向代理服务器,其具有较好的并发能力,被网易.百度.腾讯.新浪等网站广泛使用. 一. 理论简介 1.首先弄清楚正向代理和反向代理 正向代理:代理客户端, ...

  5. K8S(13)监控实战-部署prometheus

    k8s监控实战-部署prometheus 目录 k8s监控实战-部署prometheus 1 prometheus前言相关 1.1 Prometheus的特点 1.2 基本原理 1.2.1 原理说明 ...

  6. 分布式系统CAP理论

    在单机的数据库系统之中,我们很容易实现一套满足ACID 特性的 事务处理系统, 事务的一致性不存在问题. 但是在分布式系统之中,由于数据分布在不同的主机结点上,如何对着些数据进行分布式的事务处理就具有 ...

  7. Cesium简介以及离线部署运行

    Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...

  8. Tcpcopy简介与实战

    码农博客 即将到期,现将博客中部分文章转载到博客园.本文发表与2012年,基于tcpcopy 0.6版本.转载时略有删减. Tcpcopy简介 TCPCopy是一种请求复制(所有基于tcp的packe ...

  9. LTTng 简介&使用实战

    一.LTTng简介 LTTng: (Linux Trace Toolkit Next Generation),它是用于跟踪 Linux 内核.应用程序以及库的系统软件包.LTTng 主要由内核模块和动 ...

随机推荐

  1. 13.56Mhz SI522兼容MFRC522的资料以及对比性能

    (13.56Mhz芯片) SI522是一颗专门替代MFRC522/FM17522,PIN对PIN 完全软硬件兼容.相对于MFRC522,SI522完全替换,不需要做任何更改,同时接受模式下功耗低10m ...

  2. ansible实用例子

    寻找/etc/ 名为"hosts" 递归查找 ansible webserver -m find -a ' path=/etc/ file_type=any recurse=yes ...

  3. .net core 实践笔记(一)--开篇

    ** 温馨提示:如需转载本文,请注明内容出处.** 本文链接:https://www.cnblogs.com/grom/p/9902000.html  最近无聊自己设计了一个小项目,基本都使用想用没用 ...

  4. oracle 11G dataguard 恢复

    检查主备机的sys 密码是否一致,忘记密码可以修改,同步 .alter user sys identified by xxx: orapwd file=oraxxx.ora password=admi ...

  5. C# WinForm开发系列 - ListBox/ListView/Panel【zz】

    原文传送:http://www.cnblogs.com/peterzb/archive/2009/06/18/1505424.html 1.ColorListBox   ColorListBox.zi ...

  6. webStorm安装以及集成git使用!

    一:安装webstorm 百度网盘地址:https://pan.baidu.com/s/1K96mg7WYHc6X3odtk7_f2g 密码:2cgd   二:破解webstorm 1:选择liste ...

  7. 闲来无事做了一个项目,内有redis,EasyUI样式简单应用,七层分页查询,API跨域。

    <link href="~/jquery-easyui-1.5.3/themes/default/easyui.css" rel="stylesheet" ...

  8. Java接口和抽象类详解

    父类定义了相关子类的共有属性和行为.而接口可以定义类的共同行为(包括非相关的类). 了解接口前,先来说说抽象类.抽象类介乎于普通类和接口之间,提供部分实现方法以及未实现方法,可以看作为一个半成品. 抽 ...

  9. 【js】 ajax 与 axios 区别

    ajax 与 axios区别 Ajax: Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发 ...

  10. TopJUI Combobox onSelect 事件失效BUG

    版本:2.2.8 onChange : function(b, c) 两个参数:当前选择后在Combobox中显示的数据,实际是textField:另一个是改变前的数据 onSelect : func ...