2022年分布式文件系统MooseFS .pdf
分布式文件系统 MFS(moosefs)实现存储共享作者 :田逸 () 由于用户数量的不断攀升,我对访问量大的应用实现了可扩展、高可靠的集群部署(即lvs+keepalived 的方式),但仍然有用户反馈访问慢的问题。通过排查个服务器的情况,发现问题的根源在于共享存储服务器NFS。在我这个网络环境里,N 个服务器通过nfs 方式共享一个服务器的存储空间,使得NFS 服务器不堪重负。察看系统日志,全是nfs 服务超时之类的报错。一般情况下,当nfs 客户端数目较小的时候,NFS 性能不会出现问题;一旦NFS服务器数目过多,并且是那种读写都比较频繁的操作,所得到的结果就不是我们所期待的。下面是某个集群使用nfs 共享的示意图:用户负载均衡器Web服务器NFS备份服务器mysql服务器NFS服务器挂接 nfs这种架构除了性能问题而外,还存在单点故障,一旦这个NFS 服务器发生故障,所有靠共享提供数据的应用就不再可用,尽管用rsync 方式同步数据到另外一个服务器上做nfs 服务的备份,但这对提高整个系统的性能毫无帮助。基于这样一种需求,我们需要对nfs 服务器进行优化或采取别的解决方案,然而优化并不能对应对日益增多的客户端的性能要求,因此唯一的选择只能是采取别的解决方案了;通过调研,分布式文件系统是一个比较合适的选择。采用分布式文件系统后,服务器之间的数据访问不再是一对多的关系(1 个 NFS 服务器,多个 NFS 客户端),而是多对多的关系,这样一来,性能大幅提升毫无问题。到目前为止, 有数十种以上的分布式文件系统解决方案可供选择,如 lustre,hadoop,Pnfs 等等。我尝试了PVFS,hadoop,moosefs 这三种应用,参看了lustre、KFS 等诸多技术实施方法,最后我选择了moosefs(以下简称MFS)这种分布式文件系统来作为我的共享存储服务器。为名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 什么要选它呢?我来说说我的一些看法:1、 实施起来简单。 MFS 的安装、 部署、配置相对于其他几种工具来说,要简单和容易得多。看看 lustre 700 多页的 pdf 文档,让人头昏吧。2、 不停服务扩容。 MFS 框架做好后, 随时增加服务器扩充容量;扩充和减少容量皆不会影响现有的服务。注:hadoop 也实现了这个功能。3、 恢复服务容易。除了MFS 本身具备高可用特性外,手动恢复服务也是非常快捷的,原因参照第 1 条。4、 我在实验过程中得到作者的帮助,这让我很是感激。MFS 特性 (根据官方网站翻译)高可靠性(数据能被分成几个副本存储在不同的计算机里)通过增加计算机或增加新的硬盘动态扩充可用磁盘空间可以设置删除文件的空间回收时间rootmysql-bk serydir# mfsgettrashtime bind-9.4.0.tar.gzbind-9.4.0.tar.gz: 600文件被删除10 分钟后( 600 秒) ,才真正删除文件,回收磁盘空间。为文件创建快照MFS 文件系统的组成1、 元数据服务器。在整个体系中负责管理管理文件系统,目前MFS 只支持一个元数据服务器master,这是一个单点故障,需要一个性能稳定的服务器来充当。希望今后MFS能支持多个master 服务器,进一步提高系统的可靠性。2、 数据存储服务器chunkserver。真正存储用户数据的服务器。存储文件时,首先把文件分成块,然后这些块在数据服务器chunkserver 之间复制(复制份数可以手工指定,建议设置副本数为3) 。数据服务器可以是多个,并且数量越多, 可使用的 “磁盘空间” 越大,可靠性也越高。3、 客户端。使用MFS 文件系统来存储和访问的主机称为MFS 的客户端,成功挂接MFS文件系统以后,就可以像以前使用NFS 一样共享这个虚拟性的存储了。元数据服务器安装和配置元数据服务器可以是linux, 也可以是unix,你可以根据自己的使用习惯选择操作系统,在我的环境里 ,我是用 freebsd做为 MFS 元数据的运行平台。GNU 源码, 在各种类 unix 平台的安装都基本一致。(一)安装元数据服务1、下载 GNU 源码 wget http:/ zxvf mfs-1.5.12.tar.gz 3、切换目录cd mfs-1.5.12 4、创建用户useradd mfs s /sbin/nologin 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - 5、配置./configure -prefix=/usr/local/mfs -with-default-user=mfs -with-default-group=mfs 6、编译安装make ; make install (二)配置元数据服务元数据服务器的配置文件是mfsmaster.cfg,我在安装 MFS 时指定了前缀,因此这个文件的位置在 /usr/local/mfs/etc/mfsmaster.cfg. 我们打开这个配置文件,看看都有哪些内容:# WORKING_USER = mfs # WORKING_GROUP = mfs # LOCK_FILE = /var/run/mfs/mfsmaster.pid # DATA_PATH = /usr/local/mfs/var/mfs # SYSLOG_IDENT = mfsmaster # BACK_LOGS = 50 # REPLICATIONS_DELAY_INIT = 300 # REPLICATIONS_DELAY_DISCONNECT = 3600 # MATOCS_LISTEN_HOST = * # MATOCS_LISTEN_PORT = 9420 # MATOCU_LISTEN_HOST = * # MATOCU_LISTEN_PORT = 9421 # CHUNKS_LOOP_TIME = 300 # CHUNKS_DEL_LIMIT = 100 # CHUNKS_REP_LIMIT = 15 尽管每行都被注释掉了,但它们却是配置文件的默认值,要改变这些值,需要取消注释,然后明确指定其取值。接下来说明一下其中一些项目的含义。LOCK_FILE = /var/run/mfs/mfsmaster.pid 文件锁所在的位置,它的功能是避免启动多次启动同一个守护进程。由于系统中本来不存在目录/var/run/mfs ,因此需要手动创建mkdir /var/run/mfs ,然后更改其属主chown R mfs:mfs /var/run/mfs 这样MFS 服务就能对这个目录有创建/写入 mfsmaster.pid 文件的权限了。DATA_PATH = /usr/local/mfs/var/mfs 数据存放路径,只元数据的存放路径。那么这些数据都包括哪些呢?进目录看看,大致分3种类型的文件:这些文件也同样要存储在其他数据存储服务器的相关目录。MATOCS_LISTEN_PORT = 9420 MATOCS-master to chunkserver,即元数据服务器使用 9420 这个监听端口来接受数据存储服务器chunkserver 端的连接。MATOCU_LISTEN_PORT = 9421 元数据服务器在9421 端口监听, 用以接受客户端名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - 对 MFS 进行远程挂接(客户端以mfsmount 挂接 MFS)其他部分看字面意思都不难理解。还有几个与时间有关的数值,其单位是秒。这个配置文件,不必做修改就能工作了。(三)元数据服务器master 启动元数据服务器可以单独启动,即使没有任何数据存储服务器(chunkserver)也是能正常工作的,因此当我们安装配置完MFS 后,即可启动它。执行命令/usr/local/mfs/sbin/mfsmaster start ,如果没有意外,元数据库服务器就应该作为一个守护进程运行起来。现在我们可以通过 3 个方面来检查一下MFS master 的运行状况:1、 检查进程2、 检查网络状态3、 检查系统日志MFS 的日志会直接写入系统日志。当我们增加数据存储服务器(chunkserver)或数据存储服务器( chunkserver)处故障时,都能在系统日志找到这些记录。注意,这个日志跟元数据变化日志不是一回事情。(四) 、关闭元数据服务器关闭元数据服务器,务必使用/usr/local/mfs/sbin/mfsmaster s 这种方式,如果直接使用kill杀死进程, 将导致下次启动时出现找不到相关文件,而不能正常启动服务器。这个一定要谨慎。当然,如果发生了这个事情,还是可以通过mfsmetastore 来恢复的。数据存储 chunkserver 服务器的安装配置数据存储服务器chunkserver 也是可以运行在各种类unix 平台的, 因此不再多说。 一个 MFS环境到底能集群多少服务器,作者的说法是上PB 容量,个人建议,最好3 台以上;并且专门用来做存储,不要把它跟master 搞到一个机器(理论上没问题,实现也是可以的,但这不是一个好策略) 。因为每个数据存储服务器的安装和配置都是相同的,所以只需按照一个名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - 服务器的操作就可以了。(一) 、安装数据存储服务器chunkserver 1、下载 GNU 源码 wget http:/ zxvf mfs-1.5.12.tar.gz 3、切换目录cd mfs-1.5.12 4、创建用户useradd mfs s /sbin/nologin 5、配置./configure -prefix=/usr/local/mfs -with-default-user=mfs -with-default-group=mfs 6、编译安装make ; make install (二)配置数据存储服务器chunkserver 数据存储服务器有2 个配置服务器需要修改,一个是主配置文件mfschunkserver.cfg ,另一个配置文件是mfshdd.cfg 。每个服务器用来分配给MFS 使用的空间最好是一个单独的硬盘或者一个 raid 卷,最低要求是一个分区。作者举的例子是创建一个大文件,然后挂接在本地,这不好,只能用来做实验了。1、修改配置文件/usr/local/mfs/etc/mfschunkserver.cfg 。下面是修改了的配置文件:#WORKING_USER = mfs #WORKING_GROUP = mfs # DATA_PATH = /usr/local/mfs/var/mfs # LOCK_FILE = /var/run/mfs/mfschunkserver.pid # SYSLOG_IDENT = mfschunkserver # BACK_LOGS = 50 # MASTER_RECONNECTION_DELAY = 30 MASTER_HOST = 192.168.0.19 MASTER_PORT = 9420 # MASTER_TIMEOUT = 60 # CSSERV_LISTEN_HOST = * # CSSERV_LISTEN_PORT = 9422 # CSSERV_TIMEOUT = 60 # CSTOCS_TIMEOUT = 60 # HDD_CONF_FILENAME = /usr/local/mfs/etc/mfshdd.cfg 这个配置文件里,没有注释符号“#”就是被修改过的项了,接下来是里面某些项的含义说明:MASTER_HOST = 192.168.0.19 元数据服务器的名称或地址,可以是主机名,也可以是 ip 地址,只要数据存储服务器能访问到元数据服务器就行。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - LOCK_FILE = /var/run/mfs/mfschunkserver.pid 与元数据服务器master 的处理完全相同 . CSSERV_LISTEN_PORT = 9422 CSSERV chunkserver,这个监听端口用于与其它数据存储服务器间的连接,通常是数据复制。HDD_CONF_FILENAME = /usr/local/mfs/etc/mfshdd.cfg 分配给 MFS 使用的磁盘空间配置文件的位置。2、修改配置文件 /usr/local/mfs/etc/mfshdd.cfg 。在我的服务器上, 只有一个 1T 的 SATA 硬盘,分了一个800G 容量的分区来做为MFS 存储服务的组成部分。为了使mfs 拥有写目录的权限,需要修改目录的属主。我的服务器的分区挂接点是/data , 用 chown R mfs:mfs /data 把属主改变。因为我的每个服务器只需贡献一个分区做为MFS,因此配置文件只需要如下一行内容就可以了:这个文件默认情况下有好几行,我们最好把它删掉,因为按常规情况用注释符号“#”好像不起作用。(三)启动数据存储服务器chunkserver 在数据存储服务器chunkserver 执行命令/usr/local/mfs/sbin/mfschunkserver start 启动数据存储守护进程 .通过以下几种方式来检查chunkserver 的运行状态 . 1、 查看进程ps aux | grep mfschunkserver 2、 查看网络状态,正常情况下应该看见9422 处于监听状态,如果有其他数据存储服务器 chunkserver 在同一个元数据服务器master 管理下运行的话,应该能看见其他chunkserver 跟本机的连接情况: 3、 查看 元数据服务器 的系统日志,可以看见新增的数据存储服务器chunkserver 被加入。tail -f /var/log/messages Mar 27 14:28:00 mfs-ctrl mfsmaster29647: server 3 (192.168.0.71): usedspace: 65827913728 (61 GB), totalspace: 879283101696 (818 GB), usage: 7.49% (四)关闭数据存储服务器跟元数据服务器master 相似,执行命令/usr/local/mfs/sbin/mfschunkserver s , chunkserver 服务就停下来了。为了使系统重启过程能自动启动chunkserver 服务,可以通过在/etc/rc.local文件追加行/usr/local/mfs/sbin/mfschunkserver start 来达到这个目的(master 的自动重启处理也可同样处理) 。MFS 客户端的安装及配置我的生产环境,只有centos 和 freebsd 两种环境,因此下面的描述,只有centos 及 freebsd挂接 MFS 文件系统的情形,其他类型的unix 系统,待日后尝试。对比前面的操作过程,客户端挂接后使用MFS 集群文件系统才是最费时的事情。一、 centos作为 MFS 的客户端。(一)安装 MFS 客户端Mfsmount 需要依赖 FUSE,因此需要先安装好fuse,这里我选用 fuse-2.7.4.tar.gz。/data 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - - - - - - 1、解包tar zxvf fuse-2.7.4.tar.gz 2、切换目录cd fuse-2.7.4. 3、配置./configure 4、编译安装make;make install 如果系统已经安装了fuse,则跳过这个步骤。安装 MFS 客户端程序1、修改环境变量文件/etc/profile ,追加下面的行,然后再执行命令source /etc/profile 使修改生效。如果不执行这个操作,在后面安装MFS 的过程中,执行命令./configure -enable-mfsmount时可能出现checking for FUSE. no configure: error: mfsmount build was forced, but fuse development package is not installed这样的错误,而不能正确安装MFS 客户端程序。2、解包tar zxvf mfs-1.5.12.tar.gz 3、切换目录cd mfs-1.5.12 4、创建用户useradd mfs s /sbin/nologin 5、配置./configure -prefix=/usr/local/mfs -with-default-user=mfs -with-default-group=mfs -enable-mfsmount 6、编译安装make ; make install 检查 MFS 客户端安装的结果。通过查看目录/usr/local/mfs/bin 目录的文件, 应该发现如下文件:(二)挂接和使用MFS 文件系统1、创建挂接点mkdir /mnt/mfs 2、挂接 MFS /usr/local/mfs/bin/mfsmount h 192.168.0.19 .注意,所有的MFS 都是挂接同一个元数据服务器master,而不是其他数据存储服务器chunkserver ! 3、通过查看磁盘使用情况来检查是否被挂接成功。rootmysql-bk # df -h Filesystem Size Used Avail Use% Mounted on /dev/hda1 19G 2.7G 16G 15% / /dev/hda7 51G 180M 48G 1% /backup /dev/hdc1 145G 6.4G 131G 5% /data /dev/hda5 19G 173M 18G 1% /home export KG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - /dev/hda3 24G 217M 23G 1% /var /dev/hda2 29G 1.6G 26G 6% /usr tmpfs 1.7G 0 1.7G 0% /dev/shm MFS 2.5T 256G 2.2T 11% /mnt/mfs 4、 进入目录 /mnt/mfs,上传一个文件,看是否正常?接着在手动用touch 创建一个文件,然后再删除它们,看是否可以正常操作。5、 设置文件副本数量,建议以3 份为佳。设置副本数目mfsrsetgoal 3 /mnt/mfs 查看设置是否如我所愿mfsgetgoal /mnt/mfs/serydir/bind-9.4.0.tar.gz /mnt/mfs/serydir/bind-9.4.0.tar.gz: 3 6、设置删除文件后空间回收时间。默认的回收时间为7 天(604800秒)修改回收时间为10 分钟mfsrsettrashtime 600 /mnt/mfs 6、 把挂接命令追加到文件/etc/rc.local ,可实现开机自动启动挂接MFS. 二、 freebsd作为 MFS 客户端Freebsd 安装和挂接MFS 集群文件系统 ,比 centos 操作起来要复杂一些.mfsmount 需要依赖fuse,并且需要在内核中加载fusefs 模块。(一)安装fuse 1、解包tar zxvf fuse-2.7.4.tar.gz 2、切换目录cd fuse-2.7.4. 3、配置./configure 4、编译安装make;make install 如果系统已经安装了fuse,则跳过这个步骤。(二)安装内核模块fusefs-kmod 1、执行系统命令sysinstall 2、光标选定Configure, 进入下一步。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - - - - - - - 3、选择“ Packages”,进入下一步。4、选择“ FTP”作为安装源,进入下一步。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - 5、选择“ kld”后,回车执行默认动作“OK ” ,进入下一步选软件包。6、选择“ fusefs-kmod-0.3.9.p1_2 ”,按OK 返回到第“ 4”步出现的那个操作界面。这时我们用“ Tab”键选中底部右边的“Install” ,完成安装后,会出现一个安装成功的提示,然后瞬间消失。 加载 fusefs 模块kldload /usr/local/modules/fuse.ko . 如果加载不成功,请检查是否存在模块文件 fuse.ko. 检查 fusefs 模块是否被加载到内核:如果没有类似上面馆的输出,就表明fusefs 模块没有加载成功。(三)安装包pkg-config :1、cd /usr/ports/devel/pkg-config 2、make install clean (四)安装MFS 客户端1、解包tar zxvf mfs-1.5.12.tar.gz 2、切换目录cd mfs-1.5.12 3、创建用户pw useradd mfs s /sbin/nologin 4、配置./configure -prefix=/usr/local/mfs -with-default-user=mfs -with-default-group=mfs -enable-mfsmount 5、编译安装make ; make install 检查 MFS 客户端安装的结果。通过查看目录/usr/local/mfs/bin 目录的文件, 应该发现如下文件:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - (五)挂接和使用MFS 文件系统1、创建挂接点mkdir /mnt/mfs 2、挂接 MFS /usr/local/mfs/bin/mfsmount h 192.168.0.19 .注意,所有的MFS 都是挂接同一个元数据服务器master,而不是其他数据存储服务器chunkserver ! 3、通过查看磁盘使用情况来检查是否被挂接成功。rootmysql-bk # df -h Filesystem Size Used Avail Capacity Mounted on /dev/ad4s1a 26G 570M 24G 2% / devfs 1.0K 1.0K 0B 100% /dev /dev/ad4s1g 356G 157G 170G 48% /data /dev/ad4s1f 17G 215M 15G 1% /home /dev/ad4s1d 28G 1.1G 25G 4% /usr /dev/ad4s1e 24G 362M 21G 2% /var /dev/fuse0 2.5T 256G 2.2T 11% /mnt/mfs 4、 进入目录 /mnt/mfs,我们可以看见前面步骤用centos 上传到分布式文件系统MFS 里的文件。5、 设置文件副本数量,建议以3 份为佳。设置副本数目mfsrsetgoal 3 /mnt/mfs 查看设置是否如我所愿mfsgetgoal /mnt/mfs/serydir/bind-9.4.0.tar.gz /mnt/mfs/serydir/bind-9.4.0.tar.gz: 3 6、设置删除文件后空间回收时间。默认的回收时间为7 天(604800秒)修改回收时间为10 分钟mfsrsettrashtime 600 /mnt/mfs (六)自动挂接MFS 创建文件 /etc/rc.local, 加入如下内容:. #!/bin/sh /sbin/kldload /usr/local/modules/fuse.ko /usr/local/mfs/bin/mfsmount -h 192.168.0.19 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - 就能实现开机或重启系统自动挂接MFS 文件系统。破坏性测试一、测试数据存储服务器我用 5 个服务器组成了MFS 的存储平台, 其中一个是master,其余四个服务器是chunkserver.先停止一个chunkserver 服务,然后在某个MFS 客户端往挂接点的目录(/mnt/mfs)里复制数据或者创建目录/文件、或者读取文件、或者删除文件,观察操作是否能正常进行。再停止第 2 个 chunkserver,重复执行上述操作;然后再停止第3 个服务器,执行类似的文件读些操作。减少chunkserver 试验后,我们再来逐步增加chunkserver 服务器 ,然后对 MFS 执行读写等相关访问操作,检验其正确性。通过增减chunkserver 服务器的测试, 服务的可靠性确实不错,哪怕只剩下最后一个服务器,也能正常提供存储访问服务。二、测试元数据服务器元数据服务器最重要的文件在目录/usr/local/mfs/var/mfs ,MFS 每一个数据的变化,都被记录在这个目录的文件里,我们可以通过备份这个目录的全部文件,来保障整个MFS 文件系统的可靠性 .在正常情况下,元数据服务器的改变日志文件(changelogs) 实时地、自动地复制到所有的数据存储服务器,并且以changelog_csback.*.mfs的形式命名。换句换说,即使元数据服务器报废了, 也能再部署一个元数据服务器,然后从数据存储服务器chunkserver 取得恢复所需要的文件。(一)本地测试1、停止元数据服务/usr/local/mfs/sbin/mfsmaster 2、备份元数据服务器数据cd /usr/local/mfs/var; tar czvf mfs.tgz mfs 3、删除目录mv mfs mfs.bk 或 rm rf mfs 4、启动元数据服务 ./sbin/mfsmaster start 启动失败,提示不能初始化数据。5、解包tar zxvf mfs.tgz 6、执行恢复操作. /sbin/mfsmetarestore a 7、启动元数据服务 ./sbin/mfsmaster start 8、在 MFS客户端检查MFS存储的数据是否跟恢复前一致?能否正常访问等等。(二)迁移测试1、 安装新的MFS元数据服务器。2、 复制元数据服务器数据目录(/usr/local/mfs/var/mfs)到这个新的元数据服务器。3、 停止原先的那个元数据服务器(关闭计算机或停止它的网络服务)。4、 更改新的元数据服务器的ip 为原来那个服务器的ip.5、 启动新的元数据服务 /usr/local/mfs/sbin/mfsmaster start6、 在 MFS客户端检查MFS存储的数据是否跟恢复前一致?能否正常访问等等。感谢 Pawel Kalinowski (mfs 作者)提供帮助! 2009/3/30 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -