mogilefs详解和配置


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

MogileFS由3个部分组成:

    (1) server:主要包括mogilefsd和mogstored两个应用程序。mogilefsd实现的是tracker,它通过数据库来保存元数据信息,包括站点domain、class、host等;mogstored是存储节点(store node),它其实是个WebDAV服务,默认监听在7500端口,接受客户端的文件存储请求。在MogileFS安装完后,要运行mogadm工具将所有的store node注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。
    (2) utils(工具集):主要是MogileFS的一些管理工具,例如mogadm等。
    (3) 客户端API:MogileFS的客户端API很多,例如Perl、PHP、Java、Python等,用这个模块可以编写客户端程序,实现文件的备份管理功能等。

存储主机(节点)

    这个是 MogileFS 存储文件存放在这些机器上,也是 mogstored 节点,也叫 Storage Server,一台存储主要都要启动一个 mogstored 服务.扩容就是增加这些机器.

设备(device)

    一个存储节点,以就是上面的主机,可以有多个 device, 就是用来存放文件的目录(例如挂载的目录),每个设备都有一个设备id,需要在 mogstored 的配置文件中的 docroot 配置的项目 指定的目录下面创建相应的设备的目录,目录名为 $docroot/dev$id,设备是不能删除的.只能将其设备的状态的值置为dead,当一个设备 dead 之后,就真的 dead了,里面的数据也无法恢复了,且这个dead了的设备的 id 也不能再用.


分布式存储或分布式文件系统:

    集中式:
        共享存储
            NAS
            SAN

    分布式存储或分布式文件系统一般遵循两个法则:
        1.文件在存储级别只是表现为数据流,而不提供文件系统本身的功能
        2.提供文件系统功能
        但是至少每个数据流要有一个唯一标识(按名存取),元数据必不可少

    分布式两种存储方式:
        1.分布式一般专门有一个服务器存元数据(元数据节点),其他节点存储数据
        元数据节点会分配好数据到各个服务器上 再对数据进行冗余--datablock

        2.无专门提供的元数据节点时,那每一个节点都存储了整个集群的完整的元数据,和一部分数据(如果不是一部分就不叫分布式存储了)   -- 好处在于没有单点

    分布式存储的挑战:
        节点间的通信
        数据存储
        数据空间平衡
        容错
        文件系统支持

    分布式:
        文件系统:有文件系统接口
        存储:无文件系统接口,通过api访问

    分布式文件系统的常见实现:
        GFS:google file system  海量数据高效存储
        HDFS: Hadoop Distribute filesystem

            元数据都放在元数据节点上,但是这些元数据都是存储在内存中,所以存储文件数量有限,而且整个系统的单点所在,对于存储海量小数据不是很理想,但是试用于一些文件数不多的大文件

        淘宝开源的存储文件系统
            TFS:Taobao file system
                开源将元数据存储于关系型数据库或其他高性能存储中,从而能维护海量的文件元数据,
                但是带来的劣势:
                    1.依靠外部的组件来实现文件系统,依赖的组件变多,组件不在完整
                    2.放在外部存储中,没有放在内存中性能高

            GlasterFS:
                去中心化设计(没有专门的元数据节点),即无专门提供的元数据节点,每一个节点都存储了整个集群的完整的元数据,和一部分数据

            ceph:
                整合进linux内核当中的分布式文件系统,已经被收录进内核

            MooseFS:mfs

            MogileFS:经过测表明MogileFS的性能比MooseF高

        MogileFS 架构:适合存储海量小文件 
            1.Tracker:元数据节点,负责从Database中检索元数据或从Database中存储元数据
            2.Database:存文件的元数据(关系型数据库) 用户的访问权限也在其中存取  
            3.Storage Node

            每一个客户端在实现数据存取时
                1.找Tracker获得元数据,Tracker会告诉你数据在哪,或者在哪个Storage Node上存储
                2.client 再去相应的Storage Node上进行存取

                橙色表示:元数据存取线路,Database和Storage 交互的原因是因为 数据的访问权限也定义在Database中
                绿色:client 请求路线
                蓝色:Storage Node中的数据冗余


            特性:
                  mogilefs的高可用不包括数据库 所以数据库的高可用要自己做

                  1.基于http 存储 所以非常适用于web站点中
                  2.数据存储冗余
                  3.自动文件复制
                  4.简单名称空间(可取名的范围就叫命名空间,MogileFS没有目录的概念)
                  5.不共享任何东西 shared-nothing
                  6.自动提供冗余,不需要raid设备
                  7.不能追加写,随机写,只能整个文件替换
                  8.Tracker client传输,管理数据复制,删除,查询,修复及其监控
                  9.数据通过HTTP/WEBDAV服务上传到Storage node(数据存储时的服务为Mogstored)
                  10.mysql存储mogilefs的元数据

            客户端请求:
                1.client --> 请求反代服务器(nginx(扮演mogilefs client))--->tracker--->database(返回元数据)--->反代服务器(nginx)--->storage node--->反代服务器(nginx)--->client


            mogilefs high availability
                
                Tracker高可用:
                    每个节点既是tracker又是mogstored

                前面用nginx做反代,因为是静态内容,所以不需要cookie或者session,无状态的即可

                要注意的是,nginx要加入插件才可以进行storage的查询(因为在nginx访问数据的时候用的就不是http机制了,此时nginx扮演mogilefs的客户端)

                    
            mogilefs核心概念:
                Domain:描述一个名称空间 一个mogilefs可以有多个domain(相当于目录)
                        用来存放不同的文件(大小,类型)
                        同一个Domain内,key必须唯一
                        不同Domain内,key可以相同
                class (将多个小文件合并成一个class(单独被冗余的复制单元)最小复制单元)
                    一个Domain内可以有多个class
                        文件属性管理
                        定义文件存储在不同设备商的份数
                
                Domian+fid:定位文件


            mogilefs install:
                mogilefs-server:公共存储
                mogilefs-utils配置工具
                perl-perlbal
                perl-Danga-Socket

            早期的mogilefs 在centos6上能运行,即使在centos7上也能运行但是可能会报错
            所以:
            安装之后编辑/etc/rc.d/init.d/mogilefs 

                    在其中加上pidfile=/var/run/mogilefsd/mogstored.pid
                
                start 
                    在lockfile后加上 && echo $(pidof mogstored) >${pidfile}

                stop:
                    lockfile后加上 ${pidfile}
        

    mogilefs安装:
            
            1.使用cpan在线安装MogileFS和相关模块:

        [root@centos7 ~]# perl -MCPAN -e shell 
        cpan >install App::cpanminus 
        cpan >install MogileFS::Server 
        cpan >install MogileFS::Utils 
        cpan >install IO::AIO 
        cpan >install IO::WrapTie 
        cpan >install Danga::Socket
        
        conf: 
            /etc/mogilefs/{mogifsd.conf, mogstored.conf}


        设定数据库:
        
        create database mogfsdb; # 创建数据库

        MariaDB [(none)]>grant all privileges on mogfsdb.* to 'moguser'@'127.0.0.1' identified by 'mogpass';
         
        MariaDB [(none)]> grant all privileges on mogfsdb.* to 'moguser'@'192.168.1.113' identified by 'mogpass';
         
        MariaDB [(none)]> flush privileges;

        mogdbsetup --dbhost=127.0.0.1 --dbpass=mogpass
        
        用户名默认为:mogile

        useradd -r mogilefs

        mkdir /var/run/mogilefsd/

        chown -R mogilefs.mogilefs /var/run/mogilefsd

        修改主配置文件:/etc/mogilefs/mogilefsd.conf    

        /etc目录下创建mogilefs目录,并提供配置文件mogilefsd.conf

        [root@centos7 ~]# vim /etc/mogilefs/mogilefsd.conf
             
             # 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  # 指定pid文件位置
             # Database connection information
             db_dsn = DBI:mysql:mogfsdb:host=127.0.0.1  # 修改为上面授权的账号和密码
             db_user = moguser                           # mysql用户
             db_pass = mogpass                          # mysql密码
             # IP:PORT to listen on for mogilefs client requests
             listen = 0.0.0.0:7001                     # 监听的地址和端口(所有地址的7001端口)
             # Optional, if you don't define the port above.
             conf_port = 7001
             # 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                             # 用于回收资源的进程数
             # 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

        mogilefsd服务脚本:mogilefs在centos7的上用脚本运行可能会报错 修改地方

                #!/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   ------开启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} && echo $(pidof mogstored) > ${pidfile} || 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} ${pidfile} || 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


        存储节点:

        解决依赖关系,需要安装perl-IO-AIO

        启动:
        mogstored -c /etc/mogilefs/mogstored.conf -daemon


        #通知Trackers有什么host需要添加 有什么Storage需要添加
        mogadm host add 192.168.0.203 –ip=192.168.0.203 –port=7500 –status=alive

    mogadm等用法:
            mogadm check 检测节点 查看节点状态
            
        添加节点:
            mogadm host list 每一个存储节点为一个host
            mogadm host add 192.168.117.130(节点名称) --ip=192.168.117.130 --status=alive(默认为done)
            mogadm host add 192.168.117.131(节点名称) --ip=192.168.117.131 --status=alive(默认为done)
            mogadm host add 192.168.117.132(节点名称) --ip=192.168.117.132 --status=alive(默认为done)

            mogadm host add 192.168.117.130 1        添加第一个设备
            mogadm host add 192.168.117.131 2        添加第二个设备
            mogadm host add 192.168.117.132 3        添加第三个设备

            mogadm domain add images    创建一个图片存储域
            mogadm domain add files     创建名字为files的domain 在其中保存class

            mogadm domain list 查看所以域

            mogadm class list 

                中的 mindevcount:最少设备数量 replpolicy:复制策略,基于主机  hashtype:hash类型
                复制策略表示最少保存几个副本 ,所以最少设备数量就要和复制策略数相等

            mogadm class add images jpeg 创建class class类型为jpeg 不指定则为default
             mogadm class add images png ....

             mogadm class add files plaintext --maindevcount=1 不复制副本

             mogadm class add files html --replpolicy="MultipleHost(3)" 最少保存三份副本

         上传:
             mogupload 

                 mogupload --trackers=172.16.100.68:7001 --domain=images --class=jpeg --key='/1.jpg' --file='./1.jpg'

         查询文件:
               mogfileinfo:

                   mogfileinfo --trackers=host --domain=foo --key='./hello.jpg'
                   mogfileinfo --trackers=192.168.117.130:7001  --domain=images --key='/1.jpg'

           显示可用key
               moglistkey:
                   moglistkey --trackers=192.168.117.130:7001 --domain=images
           
           列出指定域下的所以id
               moglistfids 
                   moglistfid --trackers=192.168.117.130:7001
                   moglistfid --trackers=192.168.117.130:7001 --fromfid=123(从哪个id开始) --count=5000(列出多少个)


           mogstats

               mogstats --db_dsn="DBI:mysql:mogilefs:host=192.168.117.130" --db_user='moguser' --db_pass='mogpass' --verbose --stats='devices,files'

       删除:
           mogadm domain delete images 删除domain 先删除类 
           
           mogadm class delete images jpeg   注意的是 删除类要先删除类中的文件

           mogdelete --trackers=192.168.117.130:7001 --domain=images --key='/1.jpg'

       centos7 上编译安装nginx 使其支持nginx_mogilefs_module

                1、解决依赖关系

    # yum groupinstall "Development Tools" "Server Platform Deveopment"
    # yum install openssl-devel pcre-devel

    2、安装

    首先添加用户nginx,实现以之运行nginx服务进程:
    # groupadd -r nginx
    # useradd -r -g nginx nginx

    接着开始编译和安装:
    # ./configure \
      --prefix=/usr \
      --sbin-path=/usr/sbin/nginx \
      --conf-path=/etc/nginx/nginx.conf \
      --error-log-path=/var/log/nginx/error.log \
      --http-log-path=/var/log/nginx/access.log \
      --pid-path=/var/run/nginx/nginx.pid  \
      --lock-path=/var/lock/nginx.lock \
      --user=nginx \
      --group=nginx \
      --with-http_ssl_module \
      --with-http_flv_module \
      --with-http_stub_status_module \
      --with-http_gzip_static_module \
      --http-client-body-temp-path=/var/tmp/nginx/client/ \
      --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
      --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
      --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
      --http-scgi-temp-path=/var/tmp/nginx/scgi \
      --with-pcre \
      --with-debug \
      --add-module=
    

    # make && make install  make时报警如果是可以忽略的 可以直接去修Makefile将其中的 -Werror 去了 即警告不阻止

    在其中的--add-module=中加入你想要编译进去的模块 --add-module=../nginx_mogilefs_module-1.0.4

    如果在编译时报错 要自己解决依赖关系  pcre-devel openssl-devel

    说明:
    1、Nginx可以使用Tmalloc(快速、多线程的malloc库及优秀性能分析工具)来加速内存分配,使用此功能需要事先安装gperftools,而后在编译nginx添加--with-google_perftools_module选项即可。
    2、如果想使用nginx的perl模块,可以通过为configure脚本添加--with-http_perl_module选项来实现,但目前此模块仍处于实验性使用阶段,可能会在运行中出现意外,因此,其实现方式这里不再介绍。如果想使用基于nginx的cgi功能,也可以基于FCGI来实现,具体实现方法请参照网上的文档。

    centos7 

        提供unit文件
        也可以提供server

    [Unit]
        Description=The nginx HTTP and reverse proxy server
        after=network.target remote-fs.target nss-lookup.target

    [service]
        Type=forking
        PIDFile=/var/run/nginx/nginx.pid
        ExecStartPre=/usr/local/nginx/sbin/nginx -t   (应用程序所在地)
        ExecStart=/usr/local/nginx/sbin/nginx
        ExecReload=/bin/kill -s HUP $MAINPID          
        KillMode=process
        Killsignal=SIGQUIT
        TimeoutStopSec=5
        PrivateTmp=true

    [Install]
        WanteBY=multi-user.target     

    脚本文件修改完成后
    systemctl daemon-reload 重载一下


    Nginx 做为 MogileFS 的前端客户端

    我们使用 Nginx 来获取文件,做前端的查询代理时需要使用到mogilefs的这个模块.可以下载这个模块编译进 Nginx 就行了.直接使用 ./configure –add-module= 这个参数就可以了.
    最新的这个模块的下载地址是:https://github.com/vkholodkov/nginx-mogilefs-module
    使用这个需要考虑到网站原来的 url 是什么样的.比如:

    http://www.a.com/uploads/front_page/A6B00135E24AB17E043B9B5453762438.png
    这个 URL 中的 UUID 是 A6B00135E24AB17E043B9B5453762438.png.这时我们使用这个做 key 来存成 MogileFS 中就行.
    再结合 rewrite,只要 key 在 url 里有,就能直接代理到后端的 mogilefs.象如下的写法,会直接取 A6B00135E24AB17E043B9B5453762438.png 来做查询用的 key.

    location  ~ ([^\/]+)$ { #只要不是根结尾的都进行反代
            mogilefs_tracker 192.168.1.xxx:7001;
            mogilefs_domain img;
            mogilefs_methods GET;
            mogilefs_noverify on; 是否不做校验
     
            mogilefs_pass {
                    proxy_pass $mogilefs_path;   这个变量可以在反代时让nginx构建出一个mogilefs的请求报文发给后端的tracker主机
                    proxy_hide_header Content-Type; 隐藏Content-Type
                    proxy_buffering off;
            }
    }
    如果使用了多个 tracker 的话,要配置使用多个 tracker 来进行负载均衡和备份.可以直接配置 tracker 为 upstrame:


    upstream online_mogilefs {
      server 10.0.0.1:7001;
      server 10.0.0.2:7001;
    }
    然后后面配置 tracker 的连接时,直接加上就行了

    mogilefs_tracker online_mogilefs;
    如果你还想配置使用 mogilefs 的 Nginx 上传,使用其中的 put 功能然后就不要安装客户端上传送,就需要打个补丁.
    上面的配置其实也是一样,关键对于上传的配置,需要给方法修改为

    mogilefs_methods PUT DETEL;

实例:

    location  /images { 如果在上传文件时key后加上了如/1.jpg此处images后面不上/ 如果为1.jpg 则location后/images/
            mogilefs_tracker 192.168.117.130:7001;
            mogilefs_domain img;
            mogilefs_methods GET;
            mogilefs_noverify on; 是否不做校验
     
            mogilefs_pass {
                    proxy_pass $mogilefs_path;   这个变量可以在反代时让nginx构建出一个mogilefs的请求报文发给后端的tracker主机
                    proxy_hide_header Content-Type; 隐藏Content-Type
                    proxy_buffering off;
            }

    Tracker高可用:
        在每一个服务器上启用tracker

        systemctl start mogilefsd.service 

    Tracker负载均衡
        upstrem trackers{
        server 192.168.117.130:7001
        server 192.168.117.131:7001
        server 192.168.117.132:7001
            check interval=1000 rise fall=5 timeout=1000 这种自检测 只有tengine可以使用 nginx可能不支持
        }

        调用时:
            location  /images { 
            mogilefs_tracker trackers;
            mogilefs_domain img;
            mogilefs_methods GET;
            mogilefs_noverify on; 是否不做校验


        健康状态检测:
            localtion /status{
            check_status;
            allow 192.168.117.130;
            deny all;
            }

    systemctl reload nginx 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值