MogileFS介绍

MogileFS

    是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发。
    Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。
    目前使用MogileFS 的公司非常多,以大众点评为例,用户全部图片均有mogileFS存储,数据量已经达到500TB级别以上。

mogilefs的特性

    支持多节点冗余
    可实现自动的文件复制
    使用名称空间(命名空间),每个文件通过key来确定。123.jpg /000/000/00/01/md5hash.fid
    不需要RAID,应用层可以直接实现RAID,不共享任何东西,通过“集群”接口提供服务
    工作于应用层,没有特殊的组件要求;
    不共享任何数据,MogileFS不需要依靠昂贵的SAN来共享磁盘,每个机器只用维护好自己的磁盘

mogileFS主要由三部分构成

    tracker节点,database节点,storage节点    1》Tracker(MogileFSd 进程):
        这个是 MogileFS 的核心部分,他是一个调度器,MogileFSd 进程就是trackers进程程序,trackers 做了很多工作:Replication(复制),Deletion,Query,Reaper(收割程序),Monitor 等等,这个是基于事件的( event-based ) 父进程/消息总线来管理所有来之于客户端应用的交互(requesting operations to be performed),包括将请求负载平衡到多个“query workers”中,然后让 MogileFSd 的子进程去处理;    2》MySQL:
        用来存放 MogileFS 的元数据 (命名空间, 和文件在那里),是Trackers 来操作和管理它,可以用mogdbsetup程序来初始化数据库,因为数据库保存了MogileFS的所有元数据,建议做成HA架构;    3》Storage Nodes:
        这个是 MogileFS 存储文件存放在这些机器上,也是 mogstored 节点,也叫 Storage Server,一台存储主要都要启动一个 mogstored 服务,扩容就是增加这些机器,实际文件存放的地方。

mogileFS架构

    每次文件的上传和读取,都经过前端TrackerServer 服务。
    trackerServer 服务器受到client 端的请求,查询数据库,返回一个上传或者是读取的可用的后端StorageServer 的地址,然后由client 端直接操作后端StorageServer 服务器。
    upload 操作返回就是成功或者失败的结果。    read 操作就是返回对应的查询数据。

mogileFS管理的几个概念

    Domain:
        一个MogileFS可以有多个Domain,用来存放不同文件(大小,类型),同一个Domain内key必须唯一,不同Domain内,key可以相同。
        每一个存储节点称为一个主机host,一个主机上可以有多个存储设备dev(单独的硬盘),每个设备都有ID号,Domain+Fid用来定位文件。    Class:
        文件属性管理,定位文件存储在不同设备上的份数。

mogilefs安装方式

    yum安装
        使用epel源进行安装环境包
        yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO
        本地安装的rpm包:
            MogileFS-Server-2.46-2.el7.noarch.rpm  #核心服务
            MogileFS-Server-mogilefsd-2.46-2.el7.noarch.rpm  # tracker节点
            MogileFS-Server-mogstored-2.46-2.el7.noarch.rpm  #Storage存储节点
            MogileFS-Utils-2.19-1.el7.noarch.rpm  #主要是MogileFS的一些管理工具,例如mogadm等。
            perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm  #socket
            perl-MogileFS-Client-1.14-1.el7.noarch.rpm  #客户端
            perl-Perlbal-1.78-1.el6.noarch.rpm 
    perl程序安装
        通过perl的包管理命令cpanm进行安装
        yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes
        cpanm安装
            wget http://xrl.us/cpanm -O /usr/bin/cpanm; sudo chmod +x
            /usr/bin/cpanm            #cpanm DBD::mysql
            #cpanm MogileFS::Server
            #cpanm MogileFS::Utils
            #cpanm MogileFS::Client
            #cpanm IO::AIO

mogilefs程序路径

    主程序:/usr/bin/mogilefsd
    命令行管理工具程序:/usr/bin/mogadm
    主配置文件(Tracker):/etc/mogilefs/mogilefsd.conf
    主配置文件(Storage Nodes):/etc/mogilefs/mogstored.conf

mogilefs程序功能的配置文件

    daemonize = 1   ##设置为1表示启动为守护进程
    db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
    db_user = username
    db_pass = password   ##配置数据库连接相关信息
    listen = 127.0.0.1:7001   ##mogilefs监听地址,监听在127.0.0.1表示只允许从本机登录进行管理
    query_jobs = 10   ##启动多少个查询工作线程
    delete_jobs = 1  ##启动多少个删除工作线程
    replicate_jobs = 5  ##启动多少个复制工作线程
    reaper_jobs = 1  ##启动多少个用于回收资源的线程
    maxconns = 10000  ##存储系统的最大连接数.
    httplisten = 0.0.0.0:7500  ##可通过http访问的服务端口
    mgmtlisten = 0.0.0.0:7501  ##mogilefs的管理端口
    docroot = /var/mogdata  ##该项决定了数据的在storage上存储的实际位置,建议使用的是一个单独挂载使用的磁盘

mogilefs服务初始化

    1》数据库授权        GRANT ALL PRIVILEGES ON *.* TO 'mogile' @'localhost' IDENTIFIED BY 'mogile' WITH GRANT OPTION;
    2》设定数据库:
        mogdbsetup --help
        mogdbsetup --dbhost=127.0.0.1 --dbpass=mogpass
        用户名默认为:mogile
    3》添加运行用户
        useradd -r mogilefs
        mkdir /var/run/mogilefsd/
        chown -R mogilefs.mogilefs /var/run/mogilefsd #yum安装的话已经完成
    4》修改主配置文件:
        /etc/mogilefs/mogilefsd.conf
    5》启动服务 (tracker 服务为 # mogilefsd ) (storage服务为  #mogstored &)

mogilefs的管理

    mogstored 程序的启动将使主机本身成为一个存储的节点,mogstored 的启动后,还需要使用 mogadm 来让当前的这个主机加入到 MogileFS 的系统中.这就是一个存储节点.注意存储节点中还需要添加设备,每个设备有一个 uniq 的 ID 号.同样也要使用 mogadm 来加入到 MogileFS 的系统中.    MogileFS 中的存储主机(节点)管理
        现在加入“存储节点”到 trackers 中.告诉注册自己到 trackers.相当于为每个主机加入 MogileFS 的存储系统
        添加主机,将主机信息注册到数据库中
            mogadm host add  --ip=127.0.0.1 --port=7500 --status=alive
        检查这个主机是否加入到 MogileFS 的系统中.
            mogadm host list
        可以修改主机IP
            mogadm host modify node1 --ip=123.xxx.xxx.70 --status=alive    
    MogileFS 中的存储设备管理
        建一个目录 ( 并且需要 mount 一个硬盘给这个目录 ) 给这个"设备" 使用, 我们这的例子是使用dev1在主机中建一个目录,建目录使用 dev + ID 这种格式,记的所有系统中 ID 不能重复.也必须和配置文件中的路径一样.
            mkdir -p /data/mogdata/dev1
        一定要注意, 给相对应用的块设备 mount 到这个点, 软链也行. 不然写文件都会写到系统硬上,其它的硬盘都是空的
        给"设备"加入”存储的节点“当中,相当于为每个设备加入 MogileFS 的存储系统
            mogadm device add  ID
        检查我们加入的"设备"信息,这样就能见到上面这个设备了.还能显示加入的大小.
            mogadm device list
        标记失效的设备,当硬盘坏了,设备有问题时,这时会自动在一个域内复制到最小设置的保存份数.恢复上面一样在一次 add 设备就好了
            mogadm device mark   ID dead    
    MogileFS 中域,类的管理
        当上面的准备好了,MogileFS 是运行中时,接下来我们要建一个我们自己的'名字空间'和加入文件到存储当中.
        我们使用 mogadm 的工具来能创建一个"域"和"类".也可以使用这个来增加文件到"类"中.
        建"域"
            mogadm domain add 
        检查"域",显示存在的域
            mogadm domain list
        在"域"中建"类",并加入最小保存份数
            mogadm class add   --mindevcount=3
    MogileFS 中文件管理
        我们可以简单的使用 mog 开头的系列 Linux 命令, 来进行管理, 当然也可以用 Client 的 API来管理. 新的 MogileFS 的工具, 拆分成多个了. 下面这些命令, 都需要在/etc/mogilefs/mogilefs.conf 中指定 trackers , 不然就需要在下面的命令都加上 –trackers来指定.        1. 上传文件
            mogupload --domain=magedu --key= --file=        2. 查询文件
            mogfileinfo --trackers=host --domain= --key=        3.查询一个叫 crossdomain 的 key .在指定的 domain 中.
            mogfileinfo --domain=magedu --key=magedu        4. 删除指定文件
            mogdelete --domain= --key=        5. 列出所有的文件 key
            这个可以列出指定 domain 下面的所有的 key , 也可以指定的一个前缀, 来找特定前缀的所有文件的 key.
            moglistkeys --domain= --key_prefix=        6. 列出指定 fid 的文件
            这个 fromfid 是指 mogileFS 内部的文件 id , 这个是自增的, 你可以指定一个开始的位置, 指定显示多少文件, 这个用于查询指定时间段内上传的文件时很有用. 比如我们在 8 点上传了一个文件, 是 100 的 id, 我们可以查询到从这个之后的所有的 id 的文件.
            moglistfids --fromfid= --count=<数量>
    
    暂时停止服务器
        如果你需要维护一个服务器,比如更新内存,升级操作系统之类的需要关机的操作,推荐你在操作之前先设置这些为 "down". MogileFS 对这种偶然的故障可以很弹性的处理.
        mogadm host mark mystorage down
        mogadm host mark mystorage alive
    硬盘设备编号
        添加新的硬盘设备需要给一个唯一的,增量的设备 ID(devid).
        如果你用一个新的硬盘来更换坏掉的硬盘,总是需要给一个新的 devid.不能重用老的 devid. 之所以这样做的原因是可以让你从旧设备中给所有文件列表中的文件,重新复制到其它的Mogilefs 的硬盘中.不然容易引起文件不会复制到这个中和错误的更新,也不会重新复制的旧文件.
    添加设备
        添加设备的命令如下:
        mogadm device add mystorage 5 --status=alive
        ... or...
        mogadm device add mystorage 5 --status=down
    只读模式和耗尽(Drain) 模式
        如果你想要冻结设备上所有的文件,你要使用只读模式就行了。这将停掉 MogileFS 存放新文件到这个设备上,但它也将阻止删除文件.代替的删除的操作是会给这些内容放到队列中等待为您标记为'alive'着或'drain'。
         mogadm device mark mystorage 5 readonly
        mogadm device mark mystorage 5 drain
        耗尽(Drain) 模式, 在 2.40 和更高以上,告诉 MogileFS 不会有新的文件应写入设备. 但是在耗尽(Drain) 模式,文件可能被删除.所以如果你不希望写文件到这个设备上,可以设置为drain 的模式
        注:耗尽(Drain) 模式在 MogileFS 的早期版本,,将会从设备删除 FIDS.现在它已经被重新均衡的功能取代。
    重新复制文件
        如果有一个硬盘坏了,MogileFS 可以自动的让请求不在访问这个设备,但是不会自动的重新复制这个硬盘的文件,你必须通过 mogadm 来手工来标志成 'dead'. 只要你这样做, MogileFS 将开始删除设备上的文件,并试图在集群间重新复制它们到其它的设备上.

MogileFS的rebalance功能

    MogileFS的rebalance功能可以平衡各个storage节点磁盘的使用情况,将磁盘剩余空间很少的磁盘中的数据搬到磁盘剩余空间大的磁盘上,使磁盘的使用率基本达到平衡
    使用方法
        mogadm rebalance policy --options="from_hosts=2 to_percent_free=99"   #设置rebalance策略,表示从设备id为2,搬到剩余空间为99%的存储设备
        mogadm rebalance test #查看一下策略
            Tested rebalance policy...
            Policy: from_hosts=2 to_percent_free=99
            Source devices:
             - 2
            Destination devices:
             - 1
             - 3
        mogadm rebalance start #运行此策略
        mogadm rebalance stop #停止rebalance策略

Tengine反代MogileFS负载均衡:

   1.环境:

      mogilefsd+mogstored+mariadb garela三台centos7:

        192.168.20.11

        192.168.20.12

        192.168.20.13

     Tengine一台(或两台做keepalived)centos7:192.168.20.95

   

   2.三台配置mogilefsd+mogstored+mariadb garela:

     garela: 

     /etc/my.cnf.d/server.cnf

            [server]

            [mysqld]

            [galera]

            wsrep_on=ON

            wsrep_provider=/usr/lib64/galera/libgalera_smm.so

            wsrep_cluster_address="gcomm://192.168.20.12,192.168.20.11,192.168.20.13"

            binlog_format=row

            default_storage_engine=InnoDB

            innodb_autoinc_lock_mode=2

            wsrep_slave_threads=2

            innodb_flush_log_at_trx_commit=0

            [embedded]

            [mariadb]

            [mariadb-10.2]

        

     Mogilefsd:

        /etc/mogilefs/mogilefsd.conf


            daemonize = 1

            pidfile = /var/run/mogilefsd/mogilefsd.pid

            db_dsn = DBI:mysql:mogilefs:host=192.168.20.12

            db_user = mogilefs

            db_pass = PASSWD

            listen = 0.0.0.0:7001

            conf_port = 7001

            query_jobs = 5

            delete_jobs = 1

            relicate_jobs = 2

            reaper_jobs = 1

            
        Mogstored:

        /etc/mogilefs/mogstored.conf

            maxconns = 10000

            httplisten = 0.0.0.0:7500

            mgmtlisten = 0.0.0.0:7501

            docroot = /data/mogilefs/

        分别添加/data/mogilefs/dev目录,改属主属组


        perl安装启动:

            [root@node1 ~]#su mogilefs -c mogilefsd

            [root@node1 ~]#nohup mogstored &


    添加主机到trackers中,这样storage节点才能被tracker节点所管理,并将主机信息注册到数据库中

        #mogadm check

             #mogadm --trackers=192.168.20.12:7001 host add node1 --ip=192.168.20.11 --status=alive   

             #mogadm --trackers=192.168.20.12:7001 host add node2 --ip=192.168.20.12 --status=alive

             #mogadm --trackers=192.168.20.12:7001 host add node3 --ip=192.168.20.13 --status=alive

             #mogadm host list

             #mogadm device list

             #mogadm device add node1 dev1

             #mogadm device add node2 dev2

             #mogadm device add node3 dev3

    添加创建域和类:

             #mogadm  domain add images

             #mogadm class add images jpg --mindevcount=3

             #mogadm class list

    上传数据:

             #find /usr/share/ -iname "*.jpg" | xargs -i cp {} ./

             #mogupload --trackers=192.168.20.12:7001 --domain='images' --class='jpg' --key='default' --file='default.jpg'

    查看:

             #mogfileinfo --trackers=192.168.20.12:7001 --domain='images' --key=default

                      - file: default

                         class:                  jpg

                      devcount:                    1

                        domain:               images

                           fid:                   82

                           key:              default

                        length:               961243

                     - http://192.168.20.11:7500/dev1/0/000/000/0000000082.fid

       查看images域下所有key    

             #moglistkeys --trackers=192.168.20.12:7001 --domain=images

    可以创建一个配置文件指明trackers是谁就不用每次输入命令的时候指定了

             #vim /etc/mogilefs/mogilefs.conf

                trackers=192.168.20.12:7001

    删除

            #mogdelete --domain=images --key=default

           #mogupload  --domain='images' --class='jpg' --key='night' --file='night.jpg'


    3.下载编译安装配置Tengine及nginx_mogilefs_module:

      安装:

             #tar xf tengine-2.1.1.tar.gz

                #tar xf nginx_mogilefs_module-1.0.4.tar.gz

                #groupadd -r nginx

                #useradd -r -g nginx nginx

                #cd nginx_mogilefs_module-1.0.4

                #./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 --with-pcre --with-debug --add-module=../nginx_mogilefs_module-1.0.4

                #make && make install

       配置:

        /usr/lib/systemd/system/nginx.service

           [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/sbin/nginx -t

                ExecStart=/usr/sbin/nginx

                ExecReload=/bin/kill -s HUP $MAINPID

                KillMode=process

                KillSignal=SIGOUT

                TimeoutStopSec=5

                PrivateTmp=true

                

                [Install]

                WantedBy=multi-user.target


        grep -v -E '^$|^[[:space:]]*#' /etc/nginx/nginx.conf

                worker_processes  1;

                events {

                    worker_connections  1024;

                }

                http {

                    include       mime.types;

                    default_type  application/octet-stream;

                    sendfile        on;

                    keepalive_timeout  65;

                    upstream trackers {

                server 192.168.20.11:7001 weight=1;

                server 192.168.20.12:7001 weight=1;

                server 192.168.20.13:7001 weight=1;

                

                check interval=1000 rise=2 fall=5 timeout=1000;

                    }

                    server {

                        listen       80;

                        server_name  localhost;

                       location / {

                            root   html;

                            index  index.html index.htm;

                        }

                location /image/ {

                mogilefs_tracker trackers;

                mogilefs_domain images;

                mogilefs_methods GET;

                mogilefs_noverify on;

                mogilefs_pass {

                proxy_pass $mogilefs_path;

                proxy_hide_header Content-Type;

                proxy_buffering off;

                }

                }

                location /status {

                check_status;

                access_log off;

                allow 192.168.20.0/24;

                deny all;

                }

                        error_page   500 502 503 504  /50x.html;

                        location = /50x.html {

                            root   html;

                        }

                    }

                }



解决CentOS7下MogileFS的复制Bug问题:

    发现只有上传节点有文件,其他节点并没有同步:

解决方法如下:

    三个节点编译安装源码包:

    #yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes

    #wget http://pkgs.fedoraproject.org/repo/pkgs/perl-Sys-Syscall/Sys-Syscall-0.23.tar.gz/be6dc2d791684a6f8abb3dd39ff2d1de/Sys-Syscall-0.23.tar.gz

    #tar -zxvf Sys-Syscall-0.23.tar.gz

    #cd Sys-Syscall-0.23

    #perl Makefile.PL

    #make && make install

重启mogilefsd,mogstored服务后测试正常