一、分布式文件系统介绍

    定义:分布式存储系统是大量普通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:最小复制单元

            文件属性管理器

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

    

     理想架构

分布式文件系统MogileFS_第1张图片



     实际架构


分布式文件系统MogileFS_第2张图片

系统环境: 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.sock
pid-file = /tmp/mysql.pid

character_set_server = utf8         #server级别字符集
default_storage_engine  = InnoDB     #默认存储

log_error  = /var/log/mysql/mysqld.log
log-bin  = /u01/mysql/log/mysql-bin    #log-bin文件存放目录
log-bin-index  = /u01/mysql/log/mysql-bin.index
expire_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=mogpass

This 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

Create/Upgrade database name 'mogilefs'? [Y/n]: y

Grant all privileges to user 'moguser', connecting from anywhere, to the mogilefs database 'mogilefs'? [Y/n]: y
Failed 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'

# 去数据库查看,已经创建了,但没有tables
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mogilefs           |
| mysql              |
| performance_schema |
| test          
mysql> use mogilefs;
Database changed
mysql> 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=mogpass

This 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 -pmogilefs
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server 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 its
affiliates. Other names may be trademarks of their respective
owners.

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 names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> 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 syslog
daemonize = 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 information
db_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 requests
listen = 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 start
Starting mogilefsd                                         [  OK  ]
# netstat -tnlp |grep 7001
tcp        0      0 192.168.5.13:7001    0.0.0.0:*   LISTEN      3613/mogilefsd

4、在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  #tracker
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  #storage
MogileFS-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.conf
maxconns = 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/mogstored

5、命令详解
查看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 list
node1 [1]: alive
  IP:       192.168.5.11:7500

node2 [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 list
node1 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      0.043     18.517     18.560        100

node2 [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 list
node1 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      0.043     18.517     18.560        100

node2 [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 list
node1 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      0.043     18.517     18.560        100

node2 [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,可以看到

分布式文件系统MogileFS_第3张图片

分布式文件系统MogileFS_第4张图片


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

# 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,显示

分布式文件系统MogileFS_第5张图片

分布式文件系统MogileFS_第6张图片

不光可以上传文件,还可以下载文件,使用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.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogstore
# service mogstored start
Starting 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=1
92.168.5.13 --status=alive
# mogadm --trackers=192.168.5.13:7001 host list
node1 [1]: alive
  IP:       192.168.5.11:7500

node2 [2]: alive
  IP:       192.168.5.12:7500

node3 [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 list
node1 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      0.043     18.517     18.560        100

node2 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      0.043     27.984     28.027        100

node3 [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     #node1
Starting mogilefsd                 [  OK  ]
# ss -tnl|grep 7001
LISTEN     0      128    192.168.5.11:7001     *:*

# service mogilefsd start     #node2
Starting mogilefsd                 [  OK  ]
# ss -tnl|grep 7001
LISTEN     0      128    192.168.5.12:7001     *:*

6、验证MogileFS的高可用

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

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

# mogadm --trackers=192.168.5.11:7001 host list
node1 [1]: alive
  IP:       192.168.5.11:7500

node2 [2]: alive
  IP:       192.168.5.12:7500

node3 [3]: alive
  IP:       192.168.5.13:7500

# mogadm --trackers=192.168.5.12:7001 host list
node1 [1]: alive
  IP:       192.168.5.11:7500

node2 [2]: alive
  IP:       192.168.5.12:7500

node3 [3]: alive
  IP:       192.168.5.13:7500

# mogadm --trackers=192.168.5.13:7001 host list
node1 [1]: alive
  IP:       192.168.5.11:7500

node2 [2]: alive
  IP:       192.168.5.12:7500

node3 [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





还没有写完,以后继续写