分布式存储 之 MogileFS

一、分布式存储简介

与目前常见的集中式存储技术不同,分布式存储技术并不是将数据存储在某个或多个特定的节点上,而是通过网络使用企业中的每台机器上的磁盘空间,并将这些分散的存储资源构成一个虚拟的存储设备,数据分散的存储在企业的各个角落(概念来自百度百科)

   集中式存储:将数据存储在某个或者多个特定的节点上,而分布式存储是将数据在指定个数的存储设备上每个拷贝一个副本。


二、mogilefs

  • mogilefs的简介:

       MogileFS 是一个开源的分布式文件系统,用于组建分布式文件集群,由 LiveJournal 旗下 Danga Interactive 公司开发,Danga 团队开发了包括 Memcached、MogileFS、Perlbal 等不错的开源项目:(注:Perlbal 是一个强大的 Perl 写的反向代理服务器)。目前国内使用 MogileFS 的有图片托管网站 yupoo 等。


  • mogilefs的特性:

    • 应用层: 不需要特殊的核心组件

    • 无单点失败: MogileFS分布式文件存储系统安装的三个组件(存储节点、跟踪器、跟踪用的数据库),均可运行在多个 机器上,因此没有单点失败。(你也可以将跟踪器和存储节点运行在同一台机器上,这样你就没有必要用4台机器)推荐至少两台机器。

    • 自动的文件复制: 基于不同的文件“分类”,文件可以被自动的复制到多个有足够存储空间的存储节点上,这样可以满足这个“类别”的最少复制要求。比如你有一个图片网站,你可 以设置原始的JPEG图片需要复制 至少三份,但实际只有1or2份拷贝,如果丢失了数据,那么MogileFS分布式文件存储系统可以重新建立遗失的拷贝数。用这种办 法,MogileFS(不做RAID)可以节约磁盘,否则你将存储同样的拷贝多份,完全没有必要。

    • 比RAID好: 在一个非存储区域网络的RAID(non-SAN RAID)的建立中,磁盘是冗余的,但主机不是,如果你整个机器坏了,那么文件也将不能访问。 MogileFS分布式文件存储系统在不同的机器之间进行文件复制,因此文件始终是可用的

    • 简单的命名空间: 文件通过一个给定的key来确定,是一个全局的命名空间。你可以自己生成多个命名空间,只要你愿意,不过这样可能在同一MogileFS中会造成key冲突

    • 不用共享任何东西: MogileFS分布式文件存储系统不需要依靠昂贵的SAN来共享磁盘,每个机器只用维护好自己的磁盘。

    • 不需要RAID: 在MogileFS中的磁盘可以是做了RAID的也可以是没有,如果是为了安全性着想的话RAID没有必要买了,因为MogileFS分布式文件存储系统已经提供了。

    • 传输中立,无特殊协议: MogileFS分布式文件存储系统客户端可以通过NFS或HTTP来和MogileFS的存储节点来通信,但首先需要告知跟踪器一下。


  • mogilefs的结构:

       1、Tracker    

       2、Database

       3、Storage Node


       有两个服务进程:MogileFSd  和 mogstored


  • mogilefs组成部分:

       前面提到 Tracker and Database 和 Storage Nodes, Client 组成,我们这先不讲 Client.因为Client实际上是一个 Perl 的 pm,可以写程序调用该 pm 来使用 MogileFS 系统,对整个系统进行读写操作。另外,象 nginx 之类有相关的模块。另外也有做成象文件系统一样采用fuse方式挂载.


   1、Tracker(跟踪器、调度器) -------------> 最好做高可用

           这个是 MogileFS 的核心部分,通俗点讲,就他是一个调度器。MogileFSd 进程就是 trackers程序,类似 MogileFS 的 wiki 上介绍的,trackers 做了很多工作,Replication ,Deletion,Query,Reaper,Monitor等等。这个是基于事件的( event-based ) 父进程/消息总线来管理所有来之于客户端应用的交互(requesting operations to be performed), 包括将请求负载平衡到 “query workers” 中,让 MogileFSd 的子进程去处理. mogadm,mogtool 的所有操作都要跟 trackers 打交 道,Client 的一些操作也需要定义好 trackers,因此最好同时运行多个 trackers 来做负载均衡。trackers 也可以只运行在一台机器 上,也可以跟其他程序运行在一起(不建议)


           配置文件位置:/etc/mogilefs/mogilefsd.conf


   2、Database(存放元数据的数据库,一般是关系型数据库)  ------------------->  最好做高可用

           数据库用来存放 MogileFS 的元数据 (命名空间, 和文件在哪里). 是 Trackers 来操作和管理它。你可以用 mogdbsetup 程序来初始化数据库。因为数据库保存了MogileFS的所有元数据,如果这儿挂了,那么整个 MogileFS 将处于不可用状态。因此最好是HA结构。


   3、mogstored (存储节点)

          实际文件存放的地方,存储节点是一个HTTP服务器,用来做删除,存放,重命名等事情,任何WebDAV服务器都可以,不过推荐使用mogstored。 MogileFSd 可以配置到两个机器上使用不同的端口。mogstored为所有DAV操作(和流量监控),并且你自己选择的快速的HTTP服务器用来做 GET 操纵(给客户端提供文件)。

          典型的应用:一个挂载点有一个大容量的SATA磁盘,他们被挂载到 /var/mogdata/devNN,只要配置完配置文件后 mogstored 程序启动将会使本机成为一个存储节点。当然还需要 mogadm 这个工具增加这台服务器到 Cluster中。


       配置文件:/etc/mogilefs/mogstored.conf


  • Mogilefs 服务进程

    • MogileFSd - MogileFS的主守护进程

      • 指运行在上面的 tracker(调度器)上,配置文件为: /etc/MogileFS/MogileFSd.conf


    • mogstored - MogileFS存储守护进程

      • 指运行在存储节点(Storage Node)上,配置文件为: /etc/MogileFS/mogstored.conf



三、MogileFS安装


wKioL1Nu3UDhwZ8lAAERMEDhxOg299.jpg


在安装好yum源之后,使用yum安装,自动解决依赖关系,有可能还需要安装 pcre。


[root@station140 ~]# yum -y install *


[root@station140 ~]# cd /etc/mogilefs/mog
mogilefsd.conf  mogstored.conf
#安装生成两个配置文件,mogilefsd.conf用来配置 stacker(调度器),启动服务为: mogilefsd      
#mogstored.conf用来配置Storage Node(存储节点),启动服务为:mogstored    都分别以守护进程运行


四、配置使用

   配置使用之前,我们先要把我们的database(数据库)准备好,因为我们要给stracker 和 mogstore 授权,授权后才能他们才能进行初始化。    

   本文不对mysql的安装讲解,直接使用,若对mysql的安装还不了解,可以看其他博客补充。


1、MySQL配置:授权


GRANT ALL ON mogilefs.* TO 'mogilefs'@'192.168.%.%' IDENTIFIED BY 'mogilefs';
     #给tracker(调度器)连接数据库授权
GRANT ALL ON mogilefs.* TO 'mogdb'@'192.168.%.%' IDENTIFIED BY 'mogdb';
     #给mogstored(数据存储)连接数据库授权
GRANT ALL ON *.* 'root'@'172.16.%.%' IDENTIFIED BY 'passwd';
     #如果root有密码的话,后面就不需要跟 IDENTIFIED BY ''


2、Mogilefs安装


[root@station140 mogilefs]# ls  安装如下包。
MogileFS-Server-2.46-2.el6.noarch.rpm            Perlbal-doc-1.78-1.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm  perl-MogileFS-Client-1.14-1.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  perl-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm             perl-Perlbal-1.78-1.el6.noarch.rpm
Perlbal-1.78-1.el6.noarch.rpm


使用yum安装,可以自动解决依赖关系


1、yum -y install *.rpm
          如果手动编译安装,那么需要手动创建 'mogilefs' 用户
[2]、useradd -r mogilefs --> #手动编译安装需要创建
3、chown -R mogilefs.mogilefs /var/run/mogilefsd/
4、提供服务脚本
     vim /etc/rc.d/init.d/mogilefsd  --> stracker服务器上
     vim /etc/rc.d/init.d/mogstored  --> Storage Node服务器上


stracker 和 Storage Node 服务器上的服务脚本分别为:


mogilefsd服务脚本:
#!/bin/bash
#
# mogilefsd - Startup script for the MogileFS tracker
#
# chkconfig: - 85 15
# description: MogileFS tracker
# processname: mogilefsd
# config: /etc/mogilefs/mogilefsd.conf
# pidfile: /var/run/mogilefsd/mogilefsd.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Path to the apachectl script, server binary, and short-form for messages.
lockfile=${LOCKFILE-/var/lock/subsys/mogilefsd}
RETVAL=0
prog=$(which mogilefsd)
start() {
    ulimit -n 65535
    echo -n $"Starting mogilefsd"
    su - mogilefs -c "$prog -c /etc/mogilefs/mogilefsd.conf --daemon"
    RETVAL=$?
    [ $RETVAL = 0 ] && success && touch ${lockfile} || failure
    echo
    return $RETVAL
}
stop() {
    echo -n $"Stopping mogilefsd"
    netstat -nlp|grep "mogilefsd"|grep -v grep|awk '{print $7}'|awk -F"/" '{print $1}'|xargs kill -9
    RETVAL=$?
    [ $RETVAL = 0 ] && success && rm -f ${lockfile} || failure
    echo
}
reload() {
    echo -n $"Reloading mogilefsd: "
    killall mogilefsd -HUP
    RETVAL=$?
    [ $RETVAL = 0 ] && success || failure
    echo
}
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status mogilefsd
        RETVAL=$?
        ;;
    restart)
        stop
        sleep 1
        start
        ;;
    reload)
        reload
        ;;
    *)
        echo $"Usage: mogilefsd {start|stop|restart|reload|status}"
        exit 1
esac
exit $RETVAL



mogstored服务脚本:
#!/bin/bash
#
# mogstored - Startup script for the MogileFS storage
#
# chkconfig: - 86 14
# description: MogileFS storage
# processname: mogstored
# config: /etc/mogilefs/mogstored.conf
# pidfile: /var/run/mogilefsd/mogstored.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Path to the apachectl script, server binary, and short-form for messages.
lockfile=${LOCKFILE-/var/lock/subsys/mogstored}
RETVAL=0
configfile='/etc/mogilefs/mogstored.conf'
prog=$(which mogstored)
start() {
    ulimit -n 65535
    echo -n $"Starting mogstored"
    su - mogilefs -c "$prog -c $configfile --daemon"  &> /dev/null
    RETVAL=$?
    [ $RETVAL = 0 ] && success && touch ${lockfile} || failure
    echo
    return $RETVAL
}
stop() {
    echo -n $"Stopping mogstored"
    netstat -nlp|grep "mogstored"|grep -v grep|awk '{print $7}'|awk -F"/" '{print $1}'|xargs kill -9
    RETVAL=$?
    [ $RETVAL = 0 ] && success && rm -f ${lockfile} || failure
    echo
}
reload() {
    echo -n $"Reloading mogstored: "
    killall mogstored -HUP
    RETVAL=$?
    [ $RETVAL = 0 ] && success || failure
    echo
}
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status mogstored
        RETVAL=$?
        ;;
    restart)
        stop
        sleep 1
        start
        ;;
    reload)
        reload
        ;;
    *)
        echo $"Usage: mogstored {start|stop|restart|reload|status}"
        exit 1
esac
exit $RETVAL


3、配置mogstored存储节点


1、解决依赖关系,需要安装perl-IO-AIO
      2、 将mogstored和mysql建立起联系,在mysql生成相关的数据库 
            mogdbsetup --dbhost=192.168.1.103 --dbport=3306 --dbname=mogdb --  dbrootuser=root --dbrootpass=passwd --dbuser=moguser --dbpass=mogpass --yes
      3、修改配置文件 mogilefsd.conf
            vim  /etc/mogilefs/mogilefsd.conf
            db_dsn = DBI:mysql:mogdb:host=192.168.1.103 
                mysql:mogdb 表示mysql与mogdb这个用户的数据库相连接;
                host=192.168.1.103 表示mysql服务器所在地址; 
            db_user = mogdb    #初始化后,访问mysql数据库的访问帐号
            db_pass = mogdb    #初始化后,访问mysql数据库的访问密码
            listen = 192.168.1.103:7001  #指mogstored监听的地址和端口
      4、将服务添加到系统开机自动启动中,并启动
             chkconfig --add mogstored  ---> 指手动编译安装需要的步骤
             chkconfig --add mogilefsd 
             chkconfig mogilefsd on
             chkconfig mogstored on
             service mogilefs start  启动mogilefs来保持和mysql的连接;
      5、创建存储分区
             mkdir /dfs/mogdata/dev1 -pv  为了简单,直接创建一个目录
             chown -R mogilefs.mogilefs /dfs/mogilefs/dev1
      6、修改配置文件 mogstored.conf
              vim /etc/mogilefs/mogstored.conf
              maxconns = 10000
              httplisten = 0.0.0.0:7500
              mgmtlisten = 0.0.0.0:7501
              docroot = /dfs/mogdata/       只需要修改这里。
      7、启动服务
             service mogstored start


4、配置tracker调度器mogilefs节点


1、将mog和mysql建立起联系,在mysql生成相关的数据库 
      mogdbsetup --dbhost=192.168.1.103 --dbport=3306 --dbname=mogilefs --  dbrootuser=root --dbrootpass=passwd --dbuser=mogilefs --dbpass=mogilefs --yes
2、修改配置文件
      db_dsn = DBI:mysql:mogilefs:host=192.168.1.103 
           mysql:mogilefs 表示mysql与mogilefs这个用户的数据库相连接;
           host=192.168.1.103 表示mysql服务器所在地址; 
      db_user = mogilefs    #初始化后,访问mysql数据库的访问帐号
      db_pass = mogilefs    #初始化后,访问mysql数据库的访问密码
      listen = 192.168.1.103:7001  #指mogilefs监听的地址和端口
3、将服务添加到系统开机自动启动中,并启动
       chkconfig --add mogilefsd  ---> 指手动编译安装需要的步骤
       chkconfig mogilefsd on
       service mogstored start

 

以下是/etc/mogilefs/mogilfsd.conf的配置文件


[root@station140 ~]# vim /etc/mogilefs/mogilefsd.conf
# Enable daemon mode to work in background and use syslog
daemonize = 1  #1指的是,以后台方式运行
# Where to store the pid of the daemon (must be the same in the init script)
pidfile = /var/run/mogilefsd/mogilefsd.pid    #pid文件路径
# Database connection information
db_dsn = DBI:mysql:mogilefs:host=192.168.1.103  #用mysql做为元数据存储,mysql用户名为mogilefs mysql主机地址为:192.168.1.103
#db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = mogilefs    #初始化后,访问mysql数据库的访问帐号
db_pass = mogilefs    #初始化后,访问mysql数据库的访问密码
# IP:PORT to listen on for mogilefs client requests
listen = 192.168.1.103:7001  #指mogilefs监听的地址和端口
#listen = 127.0.0.1:7001
# Optional, if you don't define the port above.
conf_port = 7001  #mogilefs的配置端口
# Number of query workers to start by default.
query_jobs = 10   #默认开启请求的进程数
# 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


以上,mogilefs中的 tracker 和 mogstore 两个节点就安装和配置完毕


以下为相关命令的用法:

   注意:

       以下命令中,因为mogilefsd和mogstored在每个节点上都启动了,意味着,一个节点既做mogilefsd又做mogstored,所以下面的 --trackers= # 才和 add # --ip=# 相同,如果mogilefsd和mogstored没在一个节点上,就要注意--trackers=#,就要指向自己定义的tracker那台服务器地址了。


  • 添加mogstored需要以下几步:


1、
  mogadm --trackers=192.168.1.103:7001 host add 192.168.1.103 --ip=192.168.1.103 --status=alive
      将192.168.1.103主机名,IP为192.168.1.103,加入到trackers中。
2、   
  mogadm --trackers=192.168.1.103:7001 decice add 192.168.1.103 1
      给192.168.1.103 tracker中添加一个本主机 192.168.1.103 的设备,设备号为 1.
3、
  mogadm --trackers=192.168.1.103:7001 domain add XXX
      给trackers中添加一个区域为XXX,也就是不同的'目录'
4、
  mogadm --trackers=192.168.1.103:7001 class add images class0 --mindevcount=2
      给trackers中 给images 添加 一个类 叫 class0 ,定义最少复制2份到某设备上
  • 查看类的命令用法:


mogadm --trackers=192.168.1.103:7001 host list
          列出tracker上的可用的 mogstored 主机
mogadm --trackers=192.168.1.103:7001 device list
          列出tracker上可用的 mogstored 设备   
mogadm --trackers=192.168.1.103:7001 class list
          列出tracker上可用的 mogstored 类
#
    查看tracker中domain(目录)中存在的文件的'键'所对应的值:
mogfileinfo --trackers=192.168.1.103:7001 --domain=images --key='/images/1.png'
    查看tracker中domain(目录)中所存在哪些文件:
moglistkeys --trackers=192.168.1.103:7001 --domain=images


  • 下载文件:


mogfetch --trackers=192.168.1.103 --domain=images  --key='1.png' --file='/tmp/a.png'
              将trackers中注册了的storage中的domain(区域或者目录)中,键为1.png的文件下载到本地'/tmp'下,改文件名为 a.png.


  • 上传文件:


mogupload --trackers=192.168.1.103:7001 --domain=images --key='/images/1.png' --file='/tmp/1.png'
              将/tmp/1.png 加入到 images 这个区域或者说目录当中,设置其键值存储中的键为'/images/1.png'


  • 解析网页响应过程


当用户在浏览器中输入 http://www.a.com/a/b/1.png时,前端perlbal或者
nginx将图片请求发送给 trackers,trackers查找自己,发现这个 /a/b/1.png
对应数据库中的 /images/1.png这个键、trackers讲请求返还给客户端,
客户端再去请求 database,当database收到用户请求的是/images/1.png,
然后就将 /images/1.png键所对应的值发送给客户端。
(对应的值在 Storage Node中存储着,位置可能是:/domain/1.png )


  • MogileFS 中文件管理:


我们可以简单的使用 mogtool 来加入文件,当然也可以用 Client 的 API 来管理。
    加入文件,到 MogileFS 中
    $mogtool inject <file_name> <key_name>  --domain=<domain_name>
    取出文件
    $mogtool extract <key_name> <file_name> --domain=<domain_name>
     大文件管理( >64M ),这时,mogtool 会给文件切成 64M 一全的大小
    $mogtool inject --bigfile <file_name> <key_name>  --domain=<domain_name>
    $mogtool extract --bigfile <key_name> <file_name> --domain=<domain_name>


  • 查看mogilefs分布式存储的状态


mogstats --config=/etc/mogilefs/mogilefs.conf
      --config=/ 后面跟此节点的mogilefs的配置文件
  mogstats --config=/etc/mogilefs/mogilefs.conf --stats="domain"
      仅显示domain信息
  mogstats --db_dsn="DBI:mysql:mogdb:host=192.168.1.103" --db_user="moguser" --db_pass="mogpass"
      也可以通过此方法查看


你可能感兴趣的:(分布式存储,mogilefs)