一、分布式文件系统介绍

    定义:分布式存储系统是大量普通PC服务器通过与Internet互联,对外作为一个整体提供存储服务。分布式文件系统,顾名思义,就是分布式+文件系统。它包含这两个方面的内涵,从文件系统的客户端使用的角度来看,它就是一个标准的文件系统,提过一系列的API,由此进行文件或者目录的创建、移动、删除,以及对文件的读写等操作。从内部实现来看,分布式系统则不再和普通文件系统一样负责管理本地磁盘,它的文件内容和目录结构都不是存储再本地磁盘上,而是通过网络传输到远端系统上。并且,同一个文件存储不只是在一台机器上,而是在一组机器上分布式存储,协同提供服务。   

    特性:

    1、可扩展:分布式存储系统可以扩展到几百台至几千台的集群规模,且随着集群规模的增长,系统整体性能表现为线性增长;

    2、低成本:分布式存储系统的自动容错、自动负载均衡机制使其可以构建再普通PC机之上;另外,线性扩展能力也使得增长、减少机器非常方便,可以实现自动运维;

    3、高性能:无论针对整个集群还是单台服务器,都要求分布式系统具备高性能。

    4、易用性:分布式存储系统需要能够提供易用的对外接口;另外,也要求具备完善的监控、运维工具,并能方便的与其他系统集成,如从hadoop云计算系统导入数据;

    挑战:在于数据、状态信息的持久化,要求在自动迁移,自动容错、并发读写的过程中保证数据的一致性;

二、CAP理论

    来自Berkerly的Eric Brewer教授提出了一个著名的CAP理论:一致性(Consistency),可用性(Availability)和分区容忍性(Tolerance of networkPartition)三者不能同时满足;

    C:读操作总是能够读取到之前完成的写操作结果,满足这个条件的系统成为强一致系统,这里的“之前”一般对同一个客户端而言;

    A:读写操作再单台机器发生故障的情况下依然能够正常执行,而不需要等待发生故障的机器重启或者其上的服务迁移到其他机器;

    P:机器故障、网络故障、机房停电等异常情况下仍然能够满足一致性可可用性;

分布式存储系统要求能够自动容错,即分区可容忍性总是需要满足的,因此,一致性和写操作的可用性就不能同时满足了,需要再这两者间权衡,是选择不允许丢失数据,保持强一致,还是允许少量数据丢失以获得更好的可用性;

三、常见分布式文件系统

    GFS(Google File System):Google公司为了满足自己公司需求而开发的基于Linux的专有分布式文件系统。由于其元数据时存储再内存中,所以在存储文件数量上注定不可能达到海量存储,主要是存储大文件使用。

    HDFS(Hadoop Distributen File System):hadoop的重要组成之一,几乎完全山寨版的GFS。

    TFS:淘宝自主研发,将元数据存储于关系型数据库或其它高性能存储中,从而能维护海量文件元数据;主要用于存储海量小文件,维护难度大

    GlusterFS:去中心化的设计模式;擅长处理单个大文件;

    Ceph:Linux内核级实现的文件系统,目前已经直接被收录进Linux内核;bug较多,稳定性不佳

    MooseFs:持FUSE,相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差,国人用的较多;

    MogileFS:元数据放在数据库中,擅长处理海量小文件,性能较好;

    FastDFS:轻量级分布式系统,擅长处理海量小文件

四、MogileFS详细介绍

    MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发。Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。目前使用MogileFS 的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和安居客等,分别为所在的组织或公司管理着海量的图片。

    1、MogileFS由3个部分组成:

    (1)、server:主要包括mogilefsd和mogstored两个应用程序。mogilefsd实现的是tracker,它通过数据库来保存元数据信息,包括站点domain、class、host等;

    (2)、utils(工具集):主要是MogileFS的一些管理工具,例如modadm等。

    (3)、客户端API:MogileFS的客户端API很多,例如Perl、php、Java、python等,用这个模块可以编写客户端程序,实现文件的备份管理功能等。

    

    2、MogileFS特性:

     (1)、工作于应用层:http,nfs;

     (2)、无单点:三大组件(tracker,mogstore,database)皆可以实现高可用;

     (3)、自动完成文件复制:复制的最小单位不是文件,而是class;基于不同的class,文件可以被自动的复制到多个有足够存储空间的存储节点上;

     (4)、传输无需特殊协议:可以通过NFS或HTTP协议进行通信;

     (5)、名称空间:文件通过一个给定的key来确定,是一个全局的命名空间;没有目录,基于域实现文件隔离;

     (6)、不共享任何数据:无需通过昂贵的SAN来共享磁盘,每个存储节点只需维护自己所属的存储设备(device)即可;

     两个关键术语:

        domain:name space,命名空间

            一个MogileFS可以有多个Domain

            用来存放不同文件(大小、类型)

            同一个Domain内,key必须唯一

            不同Domain内,key可以相同

         class:最小复制单元

            文件属性管理器

            定义文件存储再不同设备上的份数

    

     理想架构

     实际架构

系统环境: Centos6.7   

     工作流程  

        1、客户端向服务器端发送请求

        2、nginx通过调度将请求转达给其中一个mogilefs的tracker

        3、tracker接收到请求向后端数据库获取存储位置并返回给nginx

        4、nginx接到存储位置再到mogilefs的存储上获取实际存储数据并返回给客户端

五、MogileFS实现

1、node3上安装mysql并配置其root用户允许远程连接# tar xf mysql-5.6.22-linux-glibc2.5-x86_64.tar.gz -C /usr/local# cd /usr/local# ln -sv mysql-5.6.22-linux-glibc2.5-x86_64/ mysql# groupadd -g 306 mysql# useradd -g 306 -u 306 -s /sbin/nologin -M -r mysql# mkdir /u01/mysql/{data,log} -pv# chown -R mysql.mysql /u01/mysql/# cd /usr/local/mysql# chown root.mysql ./*# scripts/mysql_install_db --user=mysql --datadir=/u01/mysql/data# cp support-files/mysql.server /etc/rc.d/init.d/mysqld# chmod +x /etc/rc.d/init.d/mysqld# chkconfig --add mysqld# echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf# ldconfig# ldconfig -p | grep mysql# ln -sv /usr/local/mysql/include/ /usr/include/mysql# echo "export PATH=$PATH:/usr/local/mysql/bin" > /etc/profile.d/mysql.sh# . /etc/profile.d/mysql.sh# vim /etc/my.cnf[mysqld]lower_case_table_names =1          #不区分大小写datadir = /u01/mysql/data          #数据目录port = 3306                        #端口socket = /tmp/mysql.sockpid-file = /tmp/mysql.pidcharacter_set_server = utf8         #server级别字符集default_storage_engine  = InnoDB     #默认存储log_error  = /var/log/mysql/mysqld.loglog-bin  = /u01/mysql/log/mysql-bin    #log-bin文件存放目录log-bin-index  = /u01/mysql/log/mysql-bin.indexexpire_logs_days  = 30        skip-name-resolve# mkdir /var/log/mysql# service mysqld start# mysql> GRANT ALL ON *.* TO 'root'@'192.168.%.%' IDENTIFIED BY 'mogilefs';  #授权Query OK, 0 rows affected (0.00 sec)> flush privileges;          #重读授权Query OK, 0 rows affected (0.01 sec)2、安装如下软件包,虽然只是配置tracker,但还是安装了storage的包,是因为后面做高可用时用到 MogileFS-Server-2.46-2.el6.noarch.rpm             #通行组件 MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm   #traker MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm   #storage MogileFS-Utils-2.19-1.el6.noarch.rpm              #工具包 Perlbal-1.78-1.el6.noarch.rpm Perlbal-doc-1.78-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm        #客户端开发使用 perl-Net-Netmask-1.9015-8.el6.noarch.rpm          #机架感知能力 perl-Perlbal-1.78-1.el6.noarch.rpm                #依赖包 # yum -y localinstall *.rpm  #安装所有包由于node3是做tracker的,用到的主要程序包是MogileFS-Server-mogilefsd,其他和配置tracker没有太大关系,MogileFS-Server-mogilefsd生成的主要文件# rpm -ql MogileFS-Server-mogilefsd/etc/mogilefs/mogilefsd.conf   #主配置文件/etc/rc.d/init.d/mogilefsd     #启动脚本/usr/bin/mogdbsetup            #数据库初始化工具/usr/bin/mogilefsd             #mogilefsd主进程3、初始化MogileFS数据库:使用可以连接到mysql的用户和密码,创建一个MogileFS使用的数据库和数据库的管理用户以及设置密码# mogdbsetup --dbhost=192.168.5.13 --dbrootuser=root --dbrootpass=mogilefs --dbname=mogilefs --dbuser=moguser --dbpass=mogpassThis will attempt to setup or upgrade your MogileFS database.It won't destroy existing data.Run with --help for more information.  Run with --yes to shut up these prompts.Continue? [N/y]: yCreate/Upgrade database name 'mogilefs'? [Y/n]: yGrant all privileges to user 'moguser', connecting from anywhere, to the mogilefs database 'mogilefs'? [Y/n]: yFailed to grant privileges: Access denied for user 'root'@'192.168.%.%' to database 'mogilefs'  # 注意有错提示Failed to grant privileges: Access denied for user 'root'@'192.168.%.%' to database 'mogilefs'# 去数据库查看,已经创建了,但没有tablesmysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mogilefs           || mysql              || performance_schema || test          mysql> use mogilefs;Database changedmysql> show tables;Empty set (0.00 sec)# 手动创建用户moguser,并授权mogilefs的所有权限mysql> grant all on mogilefs.* to moguser@'192.168.%.%' identified by 'mogpass';Query OK, 0 rows affected (0.00 sec)mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)# 重新执行初始化数据库命令,并查看。# mogdbsetup --dbhost=192.168.5.13 --dbrootuser=root --dbrootpass=mogilefs --dbname=mogilefs --dbuser=moguser --dbpass=mogpassThis will attempt to setup or upgrade your MogileFS database.It won't destroy existing data.Run with --help for more information.  Run with --yes to shut up these prompts.Continue? [N/y]: y# mysql -uroot -pmogilefsWelcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 14Server version: 5.6.22-log MySQL Community Server (GPL)Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> use mogilefs;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> show tables;     #可以正常看到已经有表了+----------------------+| Tables_in_mogilefs   |+----------------------+| checksum             || class                || device               || domain               || file                 || file_on              || file_on_corrupt      || file_to_delete       || file_to_delete2      || file_to_delete_later || file_to_queue        || file_to_replicate    || fsck_log             || host                 || server_settings      || tempfile             || unreachable_fids     |+----------------------+17 rows in set (0.00 sec)# 修改mogilefsd.conf文件设置连接mysql的用户名和密码,mogilefsd监听的地址和端口,启用的一些线程# Enable daemon mode to work in background and use syslogdaemonize = 1# Where to store the pid of the daemon (must be the same in the init script)pidfile = /var/run/mogilefsd/mogilefsd.pid# Database connection informationdb_dsn = DBI:mysql:mogilefs:host=192.168.5.13     #DBI:perl连接mysql的驱动,mysql数据库类型,mogdb连接的数据库,host(mysql服务器地址)db_user = moguser   #连接数据库的用户db_pass = mogpass   #连接数据库的密码# IP:PORT to listen on for mogilefs client requestslisten = 192.168.5.13:7001    #mogilefsd监听的地址# Optional, if you don't define the port above.conf_port = 7001    #监听的端口# Number of query workers to start by default.query_jobs = 10    #启用的请求线程,为10表示只能并发10个客户端;注意客户端不是用户访问量,而是连接使用mogilefsd的服务器# Number of delete workers to start by default.delete_jobs = 1    #用于删除的线程# Number of replicate workers to start by default.replicate_jobs = 5    #用于作复制的线程数量# Number of reaper workers to start by default.# (you don't usually need to increase this)reaper_jobs = 1    #在存储失败后将文件复制请求重新放置于队列中的线程# Number of fsck workers to start by default.# (these can cause a lot of load when fsck'ing)#fsck_jobs = 1# Minimum amount of space to reserve in megabytes# default: 100# Consider setting this to be larger than the largest file you# would normally be uploading.#min_free_space = 200# Number of seconds to wait for a storage node to respond.# default: 2# Keep this low, so busy storage nodes are quickly ignored.#node_timeout = 2# Number of seconds to wait to connect to a storage node.# default: 2# Keep this low so overloaded nodes get skipped.#conn_timeout = 2# Allow replication to use the secondary node get port,# if you have apache or similar configured for GET's#repl_use_get_port = 1#设置完成启动服务并验证7001端口已经启动# service mogilefsd startStarting mogilefsd                                         [  OK  ]# netstat -tnlp |grep 7001tcp        0      0 192.168.5.13:7001    0.0.0.0:*   LISTEN      3613/mogilefsd4、在node1和node2上安装配置storage#安装如下软件包,配置storage主要用到的软件包是MogileFS-Server-mogstored#注意:这块建议先安装epel源,有可能有些依赖关系能解决MogileFS-Server-2.46-2.el6.noarch.rpm             #通用组件MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm  #trackerMogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  #storageMogileFS-Utils-2.19-1.el6.noarch.rpm             #工具包perl-MogileFS-Client-1.14-1.el6.noarch.rpm      #客户端开发使用perl-Net-Netmask-1.9015-8.el6.noarch.rpm        #机架感知能力perl-Perlbal-1.78-1.el6.noarch.rpm               #依赖包#Mogstored依赖与perl-IO-AIO这个包,需要额外安装,否则mogstored无法正常启动# yum -y install perl-IO-AIO     #这个必须装,不然后面会出错# yum -y localinstall *.rpm#MogileFS-Server-mogstored生成的文件# rpm -ql MogileFS-Server-mogstored/etc/mogilefs/mogstored.conf  #主配置文件/etc/rc.d/init.d/mogstored    #脚本文件/usr/bin/mogautomount         #自动挂载的工具/usr/bin/mogstored            #主程序#创建一个目录准备存储文件,并且设置属主和属组为mogilefs,否则tracker节点会无法读取数据分别在node1,和node2上执行# mkdir /mogstore# chown -R mogilefs.mogilefs /mogstore/将存储目录挂载到单独的分区# vim /etc/fstab/dev/sda5               /mogstore               ext4    defaults        0 0# mount|grep mogstore/dev/sda5 on /mogstore type ext4 (rw)#在存储目录创建设备编号目录,注意此目录各个节点不能重名# mkdir /mogstore/dev1    #在node1上# mkdir /mogstore/dev2    #在node2上#修改配置文件# vim /etc/mogilefs/mogstored.confmaxconns = 10000              #最大并发连接数httplisten = 0.0.0.0:7500    #http协议监听的端口mgmtlisten = 0.0.0.0:7501    #管理监听的端口docroot = /mogstore           #文件存储的目录#设置完成启动服务,并验证端口是否正常启动# netstat -tnlp|egrep "7500|7501"tcp        0      0 0.0.0.0:7500    0.0.0.0:*        LISTEN      3324/mogstored      tcp        0      0 0.0.0.0:7501    0.0.0.0:*        LISTEN      3324/mogstored5、命令详解查看MogileFS-Utils生成的命令,只列出常用的命令# rpm -ql MogileFS-Utils/usr/bin/mogadm     #MogileFS管理工具,可以实现将mogstored加入到mogilefsd/usr/bin/mogdelete      #删除文件/usr/bin/mogfetch       #获取文件/usr/bin/mogfiledebug   /usr/bin/mogfileinfo    #查看文件/usr/bin/moglistfids/usr/bin/moglistkeys/usr/bin/mogrename/usr/bin/mogstats/usr/bin/mogtool/usr/bin/mogupload      #上传文件Mogadm命令的常用功能:mogadm check         #状态监测mogadm stats         #显示MogileFS的状态统计信息mogadm host ...      #管理主机mogadm device ...    #管理设备mogadm domain ...    #管理域mogadm class ...     #管理类mogadm slave ...     #管理复制mogadm fsck ...      #文件系统检查和修复mogadm rebalance ... #重新均衡(MogileFS运行时间久了mogstored存储的数据量有可能不一样,重新均衡一下各个节点的数据就差不多了)mogadm settings ...  #设置文件复制数说明:# mogadm -h (可以使用-h或者--help获取帮助,不过我测试好像后面跟什么都可以获取帮助)Usage:  (enter any command prefix, leaving off options, for further help)  mogadm check                     Check the state of the MogileFS world.  mogadm stats                     Show MogileFS system statistics.  (DEPRECATED: use mogstats instead)  mogadm host ...         host add ...              Add a host to MogileFS.         host delete ...           Delete a host.         host list                 List all hosts.         host mark ...             Change the status of a host.  (equivalent to 'modify --status')         host modify ...           Modify a host's properties.  mogadm device ...         device add ...            Add a device to a host.         device list ...           List all devices, for each host.         device mark ...           Mark a device as {alive,dead,down,drain,readonly}         device modify ...         Modify a device's properties.         device summary ...        List the summary of devices, for each host.  mogadm domain ...         domain add ...            Add a domain (namespace)         domain delete ...         Delete a domain.         domain list               List all hosts.  mogadm class ...         class add ...             Add a file class to a domain.         class delete ...          Delete a file class from a domain.         class list                List all classes, for each domain.         class modify ...          Modify properties of a file class.  mogadm slave ...         slave add ...             Add a slave node for store usage         slave delete ...          Delete a slave node for store usage         slave list                List current store slave nodes.         slave modify ...          Modify a slave node for store usage  mogadm fsck ...         fsck clearlog             Clear the fsck log         fsck printlog             Display the fsck log         fsck reset ...            Reset fsck position back to the beginning         fsck start                Start (or resume) background fsck         fsck status               Show fsck status         fsck stop                 Stop (pause) background fsck         fsck taillog              Tail the fsck log  mogadm rebalance ...         rebalance policy ...      Add or adjust the current policy         rebalance reset           Reset an existing policy         rebalance settings        Display rebalance settings         rebalance start           Start a rebalance job         rebalance status          Show status of current rebalance job         rebalance stop            Stop a rebalance job         rebalance test            Show what devices the current policy would match  mogadm settings ...         settings list             List all server settings         settings set ...          Set server setting 'key' to 'value'.         6、配置分布式集群(在Node3上)# mogadm --trackers=192.168.5.13:7001 host add node1 --ip=192.168.5.11 --status=alive# mogadm --trackers=192.168.5.13:7001 host add node2 --ip=192.168.5.12 --status=alive             add:表示添加主机    node1:表示主机名,可以随便写(自己知道就行)    --ip:表示添加的主机地址    --status=alive:表示添加之后的状态为上线    #添加完成之后查看主机列表# mogadm --trackers=192.168.5.13:7001 host listnode1 [1]: alive  IP:       192.168.5.11:7500node2 [2]: alive  IP:       192.168.5.12:7500  #添加设备节点虽然已经添加完成,但是还不能存储数据,如果想存储数据需要追踪存储节点上的设备# mogadm --trackers=192.168.5.13:7001 device add node1 1# mogadm --trackers=192.168.5.13:7001 device add node2 2    add:表示添加设备    node1:节点名称,必须和添加主机时保存一致    1和2:添加的dev设备编号    #添加完成查看device列表可以看到设备# mogadm --trackers=192.168.5.13:7001 device listnode1 [1]: alive                    used(G)    free(G)   total(G)  weight(%)   dev1:   alive      0.043     18.517     18.560        100node2 [2]: alive                    used(G)    free(G)   total(G)  weight(%)   dev2:   alive      0.000      0.000      0.000        100   #补充:这里多增加一个node2节点的设备,添加为dev3,   # mogadm --trackers=192.168.5.13:7001 device add node2 3# mogadm --trackers=192.168.5.13:7001 device listnode1 [1]: alive                    used(G)    free(G)   total(G)  weight(%)   dev1:   alive      0.043     18.517     18.560        100node2 [2]: alive                    used(G)    free(G)   total(G)  weight(%)   dev2:   alive      0.000      0.000      0.000        100   dev3:   alive      0.000      0.000      0.000        100   #删除方法:这里没有deleted命令,需要使用mark将dev3标记为dead状态就删除了# mogadm --trackers=192.168.5.13:7001 device mark node2 3 dead# mogadm --trackers=192.168.5.13:7001 device listnode1 [1]: alive                    used(G)    free(G)   total(G)  weight(%)   dev1:   alive      0.043     18.517     18.560        100node2 [2]: alive                    used(G)    free(G)   total(G)  weight(%)   dev2:   alive      0.000      0.000      0.000        100   #定义名称空间(domain):# mogadm --trackers=192.168.5.13:7001 domain add p_w_picpaths# mogadm --trackers=192.168.5.13:7001 domain add conffiles# mogadm --trackers=192.168.5.13:7001 domain list domain               class                mindevcount   replpolicy   hashtype-------------------- -------------------- ------------- ------------ ------- conffiles            default                   2        MultipleHosts() NONE    p_w_picpaths               default                   2        MultipleHosts() NONE     #domain:dmoain的名字 #class:domain创建完成之后会自动创建一个class,所有文件都存放在class中 #mindevcount:最小复制单元,为2表示上传的文件最少存储两个副本 #replpolioy:复制策略,MultipheHosts()表示多主机实现复制,这里不用管为默认即可 #hashtype:class在命名时是使用哈希进行计算的,这里表示哈希算法,NONE表示没有使用哈希算法 #定义class:#由于创建domain会自动创建class,所以会出现class# mogadm --trackers=192.168.5.13:7001 class list domain               class                mindevcount   replpolicy   hashtype-------------------- -------------------- ------------- ------------ ------- conffiles            default                   2        MultipleHosts() NONE    p_w_picpaths               default                   2        MultipleHosts() NONE    #新添加一个class# mogadm --trackers=192.168.5.13:7001 class add p_w_picpaths bjwf1 --mindevcount=2# mogadm --trackers=192.168.5.13:7001 class list domain               class                mindevcount   replpolicy   hashtype-------------------- -------------------- ------------- ------------ ------- conffiles            default                   2        MultipleHosts() NONE    p_w_picpaths               bjwf1                     2        MultipleHosts() NONE    p_w_picpaths               default                   2        MultipleHosts() NONE    #验证分布式系统:分布式文件系统已经搭建好,可以使用mogupload命令上传测试# mogupload --trackers=192.168.5.13:7001 --domain=p_w_picpaths --key='/1.jpg'   --file='/u01/p_w_picpaths/138-140911113024.jpg'    #--domain=p_w_picpaths:表示存储到p_w_picpaths这个domain中   #--key='/1.jpg':访问文件的URL地址   #--fill=:本地上传文件地址 #查看上传的文件信息,在node1有了文件,node2上没有,出问题了# mogfileinfo --trackers=192.168.5.13:7001 --domain=p_w_picpaths --key='/1.jpg'- file: /1.jpg     class:              default  devcount:                    1    domain:               p_w_picpaths       fid:                    4       key:               /1.jpg    length:               176531 - http://192.168.5.11:7500/dev1/0/000/000/0000000004.fid #经过排查发现node2上/mogstore上的属组和属主是root,没有改成mogilefs# chown -R mogilefs.mogilefs /mogilefs   #在node2上修改文件#重启node3上的mogilefsd,和node2上的mogstored服务,再次上传# mogupload --tracker=192.168.5.13:7001 --domain=p_w_picpaths --key='/2.jpg' --file='/u01/p_w_picpaths/0958.png' # mogfileinfo --trackers=192.168.5.13:7001 --domain=p_w_picpaths --key='/2.jpg'- file: /2.jpg    #再次查看,可看到两个节点上都已经有了文件     class:              default  devcount:                    2    domain:               p_w_picpaths       fid:                    7       key:               /2.jpg    length:               363755 - http://192.168.5.11:7500/dev1/0/000/000/0000000007.fid - http://192.168.5.12:7500/dev2/0/000/000/0000000007.fid

访问上面的两个URL,可以看到

刚刚上传的是图片,这次在上传一个文本文件试试

# mogupload --trackers=192.168.5.13:7001 --domain=conffiles --key='/configures/fstab' --file='/etc/fstab' # mogfileinfo --trackers=192.168.5.13:7001 --domain=conffiles --key='/configures/fstab'- file: /configures/fstab     class:              default  devcount:                    2    domain:            conffiles       fid:                    8       key:    /configures/fstab    length:                  805 - http://192.168.5.12:7500/dev2/0/000/000/0000000008.fid - http://192.168.5.11:7500/dev1/0/000/000/0000000008.fid

访问上面的两个URL,显示

不光可以上传文件,还可以下载文件,使用mogfetch指定那个domain是那个,key路径,使用file在指明下载之后存储到本地的那里即可

# mogfetch --trackers=192.168.5.13:7001 --domain=conffiles --key='/configures/fstab' --file='/root/fstab'

# ll /root/fstab

-rw-r--r--. 1 root root 805 Feb  5 14:47 /root/fstab

六、MogileFS高可用

在node{1.2.3}这三个节点上都安装启动mogilefsd和mogstored,使客户端无论访问哪一个节点都可以获取到数据,而且replpolicy设置最少两份,就算是一台节点故障下线其他节点仍然可以继续提供服务。

1、在node3上安装mogstored的依赖包。

yum install perl-IO-AIO

2、创建存储目录并挂载

# mkdir /mogstore/dev3# chown -R mogilefs.mogilefs /mogstore# vim /etc/fstab/dev/sda5        /mogstore        ext4    defaults      0 0# mount -a# mount |grep mogstore/dev/sda5 on /mogstore type ext4 (rw

3、修改配置文件并启动服务

# vim /etc/mogilefs/mogstored.confmaxconns = 10000httplisten = 0.0.0.0:7500mgmtlisten = 0.0.0.0:7501docroot = /mogstore# service mogstored startStarting mogstored                       [  OK  ]# netstat -tnlp |egrep "7500|7501"tcp    0      0 0.0.0.0:7500     0.0.0.0:*                   LISTEN      2927/mogstored      tcp    0      0 0.0.0.0:7501     0.0.0.0:*                 LISTEN      2927/mogstored

4、配置完成后使用mogadm命令将自己也添加到集群中并将node3的设备也添加到集群中

# mogadm --trackers=192.168.5.13:7001 host add node3 --ip=192.168.5.13 --status=alive# mogadm --trackers=192.168.5.13:7001 host listnode1 [1]: alive  IP:       192.168.5.11:7500node2 [2]: alive  IP:       192.168.5.12:7500node3 [3]: alive  IP:       192.168.5.13:7500# mkdir /mogstore/dev4# chown -R mogilefs.mogilefs /mogstore   #挂载原因# mogadm --trackers=192.168.5.13:7001 device add node3 4  #以前添加过3,没有删除,只是标记为没有的,但是这块显示已经有了,所以改为4, 暂时没找到方法把以前的干掉# mogadm  --trackers=192.168.5.13:7001 device listnode1 [1]: alive                    used(G)    free(G)   total(G)  weight(%)   dev1:   alive      0.043     18.517     18.560        100node2 [2]: alive                    used(G)    free(G)   total(G)  weight(%)   dev2:   alive      0.043     27.984     28.027        100node3 [3]: alive                    used(G)    free(G)   total(G)  weight(%)   dev4:   alive      0.042     18.518     18.560        100

5、将node1和node2配置成mogilefsd并启动

这里可以直接将node3的配置文件拷贝过来,修改配置文件的监听地址即可

# scp /etc/mogilefs/mogilefsd.conf node1:/etc/mogilefs/ # scp /etc/mogilefs/mogilefsd.conf node2:/etc/mogilefs/# vim /etc/mogilefs/mogilefsd.conf #node1上listen = 192.168.5.11:7001# vim /etc/mogilefs/mogilefsd.conf #node2上listen = 192.168.5.12:7001# service mogilefsd start     #node1Starting mogilefsd                 [  OK  ]# ss -tnl|grep 7001LISTEN     0      128    192.168.5.11:7001     *:*# service mogilefsd start     #node2Starting mogilefsd                 [  OK  ]# ss -tnl|grep 7001LISTEN     0      128    192.168.5.12:7001     *:*

6、验证MogileFS的高可用

在三个节点各自配置好了tracker和storage之后高可用的MogileFS就配置完成了。 

验证方法如下:无论使用mogadm连接那一个节点,都可以看到节点中包含了三个主机

# mogadm --trackers=192.168.5.11:7001 host listnode1 [1]: alive  IP:       192.168.5.11:7500node2 [2]: alive  IP:       192.168.5.12:7500node3 [3]: alive  IP:       192.168.5.13:7500# mogadm --trackers=192.168.5.12:7001 host listnode1 [1]: alive  IP:       192.168.5.11:7500node2 [2]: alive  IP:       192.168.5.12:7500node3 [3]: alive  IP:       192.168.5.13:7500# mogadm --trackers=192.168.5.13:7001 host listnode1 [1]: alive  IP:       192.168.5.11:7500node2 [2]: alive  IP:       192.168.5.12:7500node3 [3]: alive  IP:       192.168.5.13:7500

上传文件验证,由于只是设置两个复制份数,所以上传的文件会随机出现在两个节点中。

# mogupload --trackers=192.168.5.11:7001 --domain=conffiles --key='/rpcbind' --file='/etc/rc.d/init.d/rpcbind' #这里可以写三个IP地址,也可以写一个,IP中间用,分隔# mogfileinfo --trackers=192.168.5.11:7001 --domain=conffiles --key='/rpcbind' - file: /rpcbind        #这里可以写三个IP地址,也可以写一个,IP中间用,分隔     class:              default  devcount:                    2    domain:            conffiles       fid:                   13       key:             /rpcbind    length:                 2073 - http://192.168.5.11:7500/dev1/0/000/000/0000000013.fid - http://192.168.5.13:7500/dev4/0/000/000/0000000013.fid

七、Nginx反向代理MogileFS

Nginx默认不支持MogileFS的配置,需要在编译nginx时指定nginx_mogilefs_module模块才可以代理MogileFS

 

nginx的mogilefs模块官方配置地址

http://www.grid.net.ru/nginx/mogilefs.en.html

还没有写完,以后继续写