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

 

一、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. Go testing 库 testing.T 和 testing.B 简介

    testing.T 判定失败接口 Fail 失败继续 FailNow 失败终止 打印信息接口 Log 数据流 (cout 类似) Logf format (printf 类似) SkipNow 跳过当 ...

  2. 解决Linux 安装python3 .5 解决pip 安装无法成功问题ssl安全拦截无法pip安装库问题

    pip is configured with locations that require TLS/SSL, however the ssl module in Python is not avail ...

  3. select和epoll

    C/S编程模型,对每一个客户端都要开辟一个新的线程,效率必定低下.普通select模型是开辟两个线程,一个用来监听客户端的连接,另一个用于处理客户端请求. fd_set set; FD_ZERO(&a ...

  4. git did not exit cleanly (exit code 1)

    git pull的时候报如下错误: error: Your local changes to the following files would be overwritten by merge: 文件 ...

  5. Kafka个人总结

    Kafka 应对场景:消息持久化.吞吐量是第一要求.状态由客户端维护.必须是分布式的.Kafka 认为 broker 不应该阻塞生产者,高效的磁盘顺序读写能够和网络 IO 一样快,同时依赖现代 OS ...

  6. iOS:多媒体(18-01-25更)

    1.音频 2.视频 1. 2.AVPlayer 1.音频 2.视频 1. 2.AVPlayer 0).写在前面 AVPlayer 主要包含 AVPlayer.AVPlayerItem.AVPlayer ...

  7. CentOS7集成Apache和SVN

    本文主要介绍如何在CentOS7环境下集成Apache和SVN,完成后可以通过浏览器访问SVN仓库. 1.查看系统环境,关闭防火墙和SELinux. [root@Docker /]# systemct ...

  8. python写员工信息表作业笔记

    需求 流程图

  9. koa中静态文件资源中间件实现

    项目实践过程中,会使用非常多的静态资源,怎样可以直接在浏览器中访问到这些静态资源 const fs = require('fs'); const path = require('path'); mod ...

  10. vue项目使用微信公众号支付总结

    微信公众号支付 1. 使用jssdk调用微信支付,具体查看开发文档: 使用的vuex,在mutations中 wechatPay (state, data) { state.payObject = d ...