分布式存储MooseFS的搭建
MFS一般指得的就是MooseFS,还有一个MogileFS(FastDFS就跟它很像),分布式文件系统大家已经都不陌生了,谷歌的GFS,apache的HDFS,淘宝的TGS。
了解一个东西一般应该先找到它的官网,下面是对应的一些链接:
MooseFS的官网:https://moosefs.com/index.html
yum安装:https://moosefs.com/download/centosfedorarhel.html
官方文档:https://moosefs.com/documentation/moosefs-3-0.html
一、MooseFS的简单介绍
1.1 MooseFS的组件
master server
master server为管理服务器,也称元数据服务器,在整个体系中负责管理文件系统,存储每个文件的元数据(信息大小,属性和文件位置,包括有关非常规的所有信息文件,即目录,套接字,管道和设备)。因此,当文件数量增加的时候,内存使用量也会增加。根据官方的数据,100万个文件chunk信息,大概需要300M的内存空间来进行。对于磁盘来讲,Master Server 对磁盘的使用量不是很大,这个取决于所用的文件和chunk块的数目(记录在主元数据文件)以及对文件作出操作的数量(记录在元数据更改日志),一般情况下 20G 可以用来存储信息 2500 万个文件变更记录长达50小时。需要用一个稳定的服务器来担任。目前MFS只支持一个元数据服务器master,针对 Master Server采用双电源双路配置,多块磁盘使用RAID1或RAID10,进行冗余。当然还会有其他措施。
元数据存储在管理节点的内存中,并周期性的刷盘,并定时同步到日志节点。数据节点将存储空间分片,每片称为chunk,最大是64MB,每个chunk在数据节点上就是一个文件。
data servers
数据存储服务器也称Chunk Server,它是真正存储数据的载体,也就是块服务器。由于 MooseFS 的默认负载均衡算法的问题,所以一般Chunk Server 的磁盘大小保持一致为保证 MooseFS 在使用过程中,各个 Chunk 节点的数据使用量是大致一致的。避免导致磁盘容量大的 Chunk Server 使用量会加大,而磁盘容量小的 Chunk Server 的使用量会变小。
metalogger server
元数据备份服务器,也叫元数据日志服务器。备份master服务器的变化日志文件,文件类型为changelog_ml.*.mfs。当元数据服务器数据丢失或者损毁,可从日志服务器取得文件进行恢复。
client
客户端,使用MFS文件系统来存储和访问的主机称为MFS的客户端,成功挂接MFS文件系统以后,就可以像以前使用NFS一样共享这个虚拟性的存储了。详细点就是使用mfsmount进程与管理服务器通信(接收和修改
文件元数据)和chunkservers(以交换实际的文件数据)。mfsmount基于FUSE1机制(USErspace中的文件系统),因此MooseFS可用在每个操作系统上使用工作的FUSE实现(Linux,FreeBSD,MacOS X)。
1.2 MooseFS的读写过程
读过程:
1、客户端向元数据服务器发出读请求。
2、元数据服务器把所需数据存放的位置(Chunk Server的IP地址和chunk编号)告知客户端。
3、客户端向已知的Chunk Server请求发送数据。
4、Chunk Server向客户端发送数据。
特点:数据传输并不经过元数据服务器,这样既减轻元数据服务器的压力,也同时增大了整个系统的吞吐能力。在多个客户端读取数据时,读取点会被分散到不同的数据服务器。
写过程:
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、客户端告知元数据服务器本次写入完毕。
1.3 客户端如何工作的
已安装MooseFS的客户端计算机上的所有文件操作与其他文件系统完全相同。 操作系统的内核将所有文件操作传输到与mfsmount进程通信的FUSE模块。 mfsmount进程通过网络随后与管理服务器和数据服务器(块服务器)进行通信。 整个过程对用户是完全透明的。
每当需要对文件元数据进行操作时,mfsmount与管理服务器通信:
•创建文件
•删除文件
•阅读目录
•阅读和更改属性
•更改文件大小
•开始阅读或写入数据
•可以访问MFSMETA上的特殊文件
mfsmount使用与存储文件的相关块的数据服务器(块服务器)的直接连接。 写入文件时,完成写入处理后,管理服务器从mfsmount接收更新文件长度和上次修改时间的信息。 此外,数据服务器(块服务器)相互通信以复制数据,以便在不同机器上实现文件的适当数量的副本。
1.4 容错
管理命令允许系统管理员在每个目录或每个文件级别上指定应该维护的“目标”或副本数。 将目标设定为多个并具有多个数据服务器将提供容错能力。 当文件数据存储在多个副本(在多个数据服务器上)时,系统可以抵御单个数据服务器的故障或临时网络中断。这当然不是指“目标”设置为1的文件 在这种情况下,文件将仅存在于单个数据服务器上,而不管系统中部署了多少数据服务器。 特别重要的文件可能将其目标设置为高于2的数字,这将允许这些文件同时抵抗多个服务器的故障。一般来说,可用的副本的设置应该多一个比预期的无法访问或无序服务器数量多。
在单个数据服务器遇到网络故障或断开连接的情况下,存储在其中的至少两个副本的文件将可以从另一个数据服务器访问。 现在的“目标”下的数据将被复制到另一个可访问的数据服务器上,以再次提供所需的份数。应该注意的是,如果可用服务器的数量低于为给定文件设置的“目标”,则无法保留所需的份数。 类似地,如果与当前设置的目标相同数量的服务器,如果数据服务器已经达到其容量的100%,则由于另一个数据服务器进行,它将无法保存现在低于其目标的文件的副本 离线。 在这种情况下,应尽快将新的数据服务器连接到系统,以便维护文件所需的份数。
可以随时将新的数据服务器连接到系统。新容量将立即可用于存储新文件或保存来自其他数据服务器的文件的复制副本。管理实用程序可用于查询文件系统中文件的状态,以确定是否有任何文件在其下目标(设定份数)。此实用程序也可用于根据需要更改目标设置。存储在块中的数据片段进行版本控制,因此重新连接数据服务器与较旧的数据副本(即,如果已经脱机一段时间)不会导致文件变得不连贯。数据服务器将同步其自身以保存当前版本的块,其中将过滤的块将被删除,并且可用空间将被重新分配以容纳新的块。客户端计算机(运行mfsmount进程)的失败将不会影响文件系统或其他客户操作的一致性。在最坏的情况下尚未从故障客户端计算机发送的数据可能会丢失。
博文来自:www.51niux.com
二、MooseFS环境的部署安装
初步环境规划(保证时间同步什么的就不说了要做的):
master服务器:192.168.1.101
metalogger服务器:192.168.1.102
chunk server服务器 : 192.168.1.104,192.168.1.105,192.168.1.106,192.168.1.107
client主机:192.168.1.103
2.1 master、metalogger、chunk server的安装(按照步骤一致,因为没有选择区分比较大的选项)
# yum install zlib zlib-devel -y
# useradd mfs -u 1001 -s /sbin/nologin #当然也可以使用其他用户,不见得非要mfs
# cd /tools/
# wget http://ppa.moosefs.com/src/moosefs-3.0.94-1.tar.gz
# tar zxf moosefs-3.0.94-1.tar.gz
# cd moosefs-3.0.94
# ./configure --prefix=/usr/local/mfs-3.0.94 --with-default-user=mfs --with-default-group=mfs #安装很简单,我就用默认的安装就可以了,多安装的不启动就可以了。要严格的话可以参考下面。
#make && make install
# ln -s /usr/local/mfs-3.0.94 /usr/local/mfs
# ./configure --help #下面是安装的一些可选功能 --disable-option-checking : 忽略无法识别的--enable/--with选项 --disable-mfsmaster : 不要建立mfsmaster --disable-mfsmetalogger :不要建立mfsmetalogger --disable-mfssupervisor :不要构建mfssupervisor --disable-mfschunkserver:不要建立mfschunkserver --disable-mfsmount : 不要建立mfsmount --disable-mfscgi : 不要安装CGI脚本 --disable-mfscli :不要安装CLI脚本 --disable-mfscgiserv :不要安装CGI服务器 --disable-mfsnetdump :不要构建mfsnetdump #可选包 --with-mfscgi-dir=CGIDIR:选择CGI目录(default = DATADIR/mfscgi) --with-mfscgiserv-dir=CGISERVDIR:选择CGI目录(默认=SBINDIR) --without-zlib :不要使用zlib进行PNG压缩 --with-default-user=USER:选择默认用户运行守护程序 --with-default-group=GROUP:选择默认组来运行守护程序 --with-default-mastername=MASTER_DNS_NAME:定义指向所有主人的默认DNS名称(缺省值= mfsmaster)
2.2 mfs客户端的安装
#yum install fuse fuse-devel -y
#useradd mfs -u 1001 -s /sbin/nologin
# cd /tools/
# wget http://ppa.moosefs.com/src/moosefs-3.0.94-1.tar.gz
# tar zxf moosefs-3.0.94-1.tar.gz
# cd moosefs-3.0.94
# ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --enable-mfsmount --disable-mfsmaster --disable-mfsmetalogger --disable-mfschunkserver --disable-mfscgi --disable-mfscli --disable-mfscgiserv --disable-mfsnetdump
#make && make install
# ln -s /usr/local/mfs-3.0.94 /usr/local/mfs
博文来自:www.51niux.com
三、MooseFS各节点的配置
3.1 master节点上面的配置
# cd /usr/local/mfs/etc/mfs/
# cp mfsmaster.cfg.sample mfsmaster.cfg #主配置文件
# cp mfsexports.cfg.sample mfsexports.cfg #mfs挂载权限设置
#cp mfstopology.cfg.sample mfstopology.cfg #机架感知文件
# vim mfsexports.cfg #加上下面一句话
192.168.1.0/24 / rw
#192.168.1.53 / rw,alldirs,mapall=500:500,password=51niux.com #也可以这样指定权限外加加个密码的方式。
#chown -R mfs:mfs /usr/local/mfs/var #授权,这个目录要记录元数据文件内容的
# /usr/local/mfs/sbin/mfsmaster -a #产生metadata.mfs文件
#不执行上面命令的话会是下面的报错:
open files limit has been set to: 16384 working directory: /usr/local/mfs-3.0.94/var/mfs lockfile created and locked initializing mfsmaster modules ... exports file has been loaded topology file has been loaded loading metadata ... can't find metadata.mfs - try using option '-a' init: metadata manager failed !!! error occurred during initialization - exiting
# /usr/local/mfs/sbin/mfsmaster start #启动master服务
# netstat -lntup|grep mfs #启动了三个端口9419,9420,9421
tcp 0 0 0.0.0.0:9419 0.0.0.0:* LISTEN 24722/mfsmaster tcp 0 0 0.0.0.0:9420 0.0.0.0:* LISTEN 24722/mfsmaster tcp 0 0 0.0.0.0:9421 0.0.0.0:* LISTEN 24722/mfsmaster
3.2 日志服务器metalogger配置
# chown -R mfs:mfs /usr/local/mfs/var/
# cd /usr/local/mfs/etc/mfs/
# cp mfsmetalogger.cfg.sample mfsmetalogger.cfg
# vim mfsmetalogger.cfg #先简单将下面两句话前面的#去掉并修改一下
MASTER_HOST = 192.168.1.101 #master主机的IP地址 MASTER_PORT = 9419 #master主机的端口
# /usr/local/mfs/sbin/mfsmetalogger start #启动metalogger节点服务
3.3 chunk server配置
# df -h|grep /data #测试环境,还是先挂了两块盘,每块盘是50G,做的xfs文件系统。如果是线上的话,一般都是满盘(12块盘)8T(因为现在最大就是支持到8T)
/dev/sdb 50G 57M 50G 1% /data01 /dev/sdc 50G 56M 50G 1% /data02
# cd /usr/local/mfs/etc/mfs/
# cp mfschunkserver.cfg.sample mfschunkserver.cfg
# cp mfshdd.cfg.sample mfshdd.cfg
# vim mfschunkserver.cfg #修改配置文件
MASTER_HOST = 192.168.1.101 MASTER_PORT = 9420
# vim mfshdd.cfg #在文件行尾加上下面两行
/data01 /data02
# chown -R mfs:mfs /data01 #授权一下不然没法写数据
# chown -R mfs:mfs /data02
# /usr/local/mfs/sbin/mfschunkserver start #启动chunkserver服务
#如果只有一个chunkserver服务器的话,设置几份副本数也是白扯的,只会有一份文件没有副本,多盘也白扯,它这个是根据节点数来的......你就一个节点虽然用工具查看应该是2份副本,但是只会有一份数据。
3.4 mfs client的安装
# mkdir /data #创建挂载目录
# /usr/local/mfs/bin/mfsmount /data -H 192.168.1.101 #执行挂载操作,192.168.1.101(master)挂载到/data
# df -h #查看多了下面一句话,这就是我们客户端所挂载的,可以见只有100G。
192.168.1.101:9421 100G 577M 100G 1% /data
3.5 启动和停止监控服务端(mfssetgoal)web gui
客户端是看不出什么问题的,只知道我去访问主master,然后能通能挂载能显示空间就算完事,但是我们作为管理者得管理吧,如何很直观的进行查看呢?
在master服务器192.168.1.101上面进行启动一个服务:
# /usr/local/mfs/sbin/mfscgiserv start #查看是否多了个9425端口
#url访问地址是:http://192.168.1.101:9425
#出现上图的原因是因为,默认找的就是mfsmaster,要么我们就要把master端的主机名设置成masmaster。当然也不用这样,如下图:
#上面这种做法只能是每次登的时候都这么来一下子,因为配置文件什么的你都没改,每次打开url还是找DNS里面设置的mfsmaster。
3.6 试着找一下为什么client挂只挂载了100G,明显不对啊
#从图中可以看出只有192.168.1.104是存活状态,另外两个节点是离线状态,但是配置文件都是统计的,服务也启动了啊。
查看离线存储节点的日志:
# tail -f /var/log/messages #从日志里面发现连接不上master就找问题白,让它连接上就是了白
mfschunkserver[16238]: MATOCS_MASTER_ACK - wrong meta data id. Can't connect to master mfschunkserver[16238]: connecting ...
#上图是解决完之后的,会发现每个节点都挂载了两块盘,盘大小是50G.
现在我们再在192.168.1.103客户端上面查看一下:
# df -h #这就对了三台机器,就相当于50G*6=300G
192.168.1.101:9421 300G 1.7G 299G 1% /data
#现在我们再把192.168.1.107和192.168.1.108搞一下,看一下是不是动态扩容呢?
注:Centos6系统默认没有mkfs.xfs命令,需要yum install xfsprogs kmod-xfs -y 安装一下,再来对磁盘空间进行xfs文件系统格式化。
# df -h #客户端一直是挂载状态,什么都没有操作,再次查看(我们只需要在后端再添加新的存储节点,master端也不需要重启,只需要让新的存储节点将IP指向到master端就可以)
192.168.1.101:9421 500G 2.9G 497G 1% /data #可见自动就扩展到500G了。
#通过cgi的web监控也可以看到192.168.1.103是客户端并且挂载到了/data目录
注:
#上面的图是现在又五个存储节点,每个节点提供的存储总大小是100G.
Traceback (most recent call last): File "/usr/local/mfs-3.0.94/share/mfscgi/mfs.cgi", line 4513, in conn = MFSConn(hostip,port) File "/usr/local/mfs-3.0.94/share/mfscgi/mfs.cgi", line 1349, in __init__ self.connect() File "/usr/local/mfs-3.0.94/share/mfscgi/mfs.cgi", line 1372, in connect self.socket.connect((self.host,self.port)) File "/usr/lib64/python2.7/socket.py", line 224, in meth return getattr(self._sock,name)(*args) error: [Errno 113] No route to host
#这段报错看下面最后一句话是有一个主机没有连接上,但是从上上图可以看到我们的我们的五台主机命名已经都连上了啊。(原因是192.168.1.108这台主机开了防火墙,关闭就好了。就不贴图了。当然也有可能挂载盘瞎折腾有点问题了要格式化一把。)
#这里主要想记录的是,像Disks一些栏会因为某个主机的影响而导致整体显示失败,这时候就需要你来排查一下了,当然这种情况也比较少。
注:
如果服务端做了密码验证操作,客户端如果挂载的话有两种方式:
第一种方式:
#/usr/local/mfs/bin/mfsmount /data -H 192.168.1.101 -p
#在上面红色区域输上密码验证成功就可以挂载了,当然这种形式比较隐秘除了你别人不知道你挂载的密码是什么,当然这种就是交互式的了。
第二种方式:
#cat /usr/local/mfs/etc/mfs/mfsmount.cfg
mfsmaster=192.168.1.101 mfspassword=www.51niux.com /data
#/usr/local/mfs/bin/mfsmount #因为上面配置文件已经配置了,所以这里直接执行挂载命令就可以了。