分佈式存儲MogileFS介紹,Tengine反代MogileFS負載均衡

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 <storage_node_name> --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 <storage_node_name> ID
        檢查我們加入的"設備"信息,這樣就能見到上面這個設備了.還能顯示加入的大小.
            mogadm device list
        標記失效的設備,當硬盤壞了,設備有問題時,這時會自動在一個域內複製到最小設置的保存份數.恢復上面一樣在一次 add 設備就好了
            mogadm device mark <storage_node_name> <storage_node_name> ID dead    
    MogileFS 中域,類的管理
        當上面的準備好了,MogileFS 是運行中時,接下來我們要建一個我們自己的'名字空間'和加入文件到存儲當中.
        我們使用 mogadm 的工具來能創建一個"域"和"類".也可以使用這個來增加文件到"類"中.
        建"域"
            mogadm domain add <domain_name>
        檢查"域",顯示存在的域
            mogadm domain list
        在"域"中建"類",並加入最小保存份數
            mogadm class add <domain_name> <class_name> --mindevcount=3
    MogileFS 中文件管理
        我們可以簡單的使用 mog 開頭的系列 Linux 命令, 來進行管理, 當然也可以用 Client 的 API來管理. 新的 MogileFS 的工具, 拆分成多個了. 下面這些命令, 都需要在/etc/mogilefs/mogilefs.conf 中指定 trackers , 不然就需要在下面的命令都加上 –trackers來指定.        1. 上傳文件
            mogupload --domain=magedu --key=<key_name> --file=<file_path>        2. 查詢文件
            mogfileinfo --trackers=host --domain=<domain_name> --key=<key_name>        3.查詢一個叫 crossdomain 的 key .在指定的 domain 中.
            mogfileinfo --domain=magedu --key=magedu        4. 刪除指定文件
            mogdelete --domain=<domain_name> --key=<key_name>        5. 列出所有的文件 key
            這個可以列出指定 domain 下面的所有的 key , 也可以指定的一個前綴, 來找特定前綴的所有文件的 key.
            moglistkeys --domain=<domain_name> --key_prefix=<key_name>        6. 列出指定 fid 的文件
            這個 fromfid 是指 mogileFS 內部的文件 id , 這個是自增的, 你可以指定一個開始的位置, 指定顯示多少文件, 這個用於查詢指定時間段內上傳的文件時很有用. 比如我們在 8 點上傳了一個文件, 是 100 的 id, 我們可以查詢到從這個之後的所有的 id 的文件.
            moglistfids --fromfid=<file_id> --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服務後測試正常





        

        






    

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章