分布式文件系統Mogilefs介紹與安裝

一、分布式文件系統簡介:


什么是分布式存儲: 

     分布式存儲系統,是將數據分散存儲在多臺獨立的設備上。傳統的網絡存儲系統采用集中的存儲服務器存放所有數據,存儲服務器成為系統性能的瓶頸,也是可靠性和安全性的焦點,不能滿足大規模存儲應用的需要。分布式網絡存儲系統采用可擴展的系統結構,利用多臺存儲服務器分擔存儲負荷,利用位置服務器定位存儲信息,它不但提高了系統的可靠性、可用性和存取效率,還易于擴展。

分布式文件系統設計目標  : 

? 訪問透明
? 位置透明   
? 并發透明
? 失效透明
? 硬件透明
? 可擴展性
? 復制透明
? 遷移透明

CAP理論: 

C:Consistency(一致性)  任何一個讀操作總是能夠讀取之前完成的寫操作。

A:Availability(可用性) 每一次操作總是能夠在確定的時間返回。

P: Partition Tolerance ( 分區容錯性 )   在出現網絡分區的情況下,仍然能夠滿足一致性和可用性。

有科學家都在致力于 CAP  三元素并存的時候,Eric.Brewer教授指出 CAP  永遠無法兼顧,只能根據具體應用來權衡和取舍,并且至多兩個元素可以共存,后來由兩位麻省理工學院的科學家證明此觀點是具有前瞻性的,由此形成Brewer的 CAP定理 。 

    正所 謂魚和熊掌不可兼得  ,關注一致性就需要處理因系統不可用而帶來寫操作失敗的情況,反之關注可用性就無法保證每次都能讀取到最新的寫入操作。傳統 關系型數據庫  側重于 CA  ,而 非關系型鍵值數據庫  則側重于 AP  。 

強一致性(ACID)  :   在單機環境中,強一致性可以由數據庫的事務來保證;在分布式環境中,強一致性很難做到,即便是做到也會因為分布式事物所帶來的性能低下,不適合在互聯網的環境中應用。   

       弱一致性(包括最終一致性)  :  系統不能保證后續訪問返回最新的值,在訪問到最新值之前這段時間稱之為 不一致窗口   。  

       最終一致性  :是弱一致性的一種特例,存儲系統保證如果對象有多次更新,在渡過 不一致窗口   之后必將放回最后更新的值。  

       服務器的一致性  :  N  代表節點的個數;  W  代表更新的時候需要確認已經被更新的節點個數; R  代表讀取數據需要的節點數量。

W + R > N  —->  強一致性(通常N=3,W=R=2)

W=N,R=1   —->  最佳讀

W=1,R=N   —->  最佳寫

W + R <= N —->  弱一致性

 

分布式存儲或分布式文件系統
 集中式:
  共享存儲:
   NAS
   SAN
 分布式存儲:
  專用的元數據節點:集中元數據存儲,數據節點至負責存儲數據
  無專用元數據幾點:所有數據均完整存儲元數據,存儲了部分數據
 分布式:
  文件系統:有文件系統接口:一般掛載使用
  存儲:無文件系統接口,通過API訪問

 

常見的分布式文件系統:
  GFS:Google File System GFS擅長處理單個大文件 。
  HDFS:Hadoop Distributed File System  根據GFS思想開發的,擅長處理單個大文件 ,使用場景,數據不太多的大文件。
  TFS:Taobao File System 淘寶開源的文件系統,擅長處理海量小文件,適用于大規模場景。

           將元數據存儲于關系型數據庫或其他高性能存儲中,從而能維護海量文件元數據。
 GlusterFS:去中心化設計:擅長處理單個大文件
 ceph:整合到linux內核實現的文件系統,已經被收錄在內核,是一個 Linux PB級別的分布式文件系統。

MogilesFS:MogileFS是一個開源的分布式文件系統,用于組建分布式文件集群

 

二、MogilesFS介紹:

 

1.MogilesFS簡介:  

    MogileFS是一個開源的分布式文件系統,用于組建分布式文件集群,由LiveJournal旗下DangaInteractive公司開發,Danga團隊開發了包括 Memcached、MogileFS、Perlbal等不錯的開源項目:(注:Perlbal是一個強大的Perl寫的反向代理服務器)。MogileFS是一個開源的分布式文件系統。

目前使用 MogileFS 的公司非常多,比如國外的一些公司,日本前幾名的公司基本都在使用這個.國內所知道的使用 MogileFS 的公司有圖片托管網站 yupoo又拍,digg, 土豆, 豆瓣,1 號店, 大眾點評,搜狗,安居客等等網站.基本很多網站容量,圖片都超過 30T 以上。

 

2.MogileFS特性:

1) 應用層提供服務,不需要使用核心組件

2)無單點失敗,主要有三個組件組成,分為tracker(跟蹤節點)、mogstore(存儲節點)、database(數據庫節點)

3)自動復制文件,復制文件的最小單位不是文件,而是class

4)傳輸中立,無特殊協議,可以通過NFS或HTTP實現通信

5)簡單的命名空間:沒有目錄,直接存在與存儲空間上,通過域來實現

6)不用共享任何數據

 

3.MogileFS的核心

1)Tracker–跟蹤器,調度器

MogileFS的核心,是一個調度器,mogilefsd進程就是trackers進程程序,trackers的主要職責有:刪除數據、復制數據、監控、查詢等等.這個是基于事件的( event-based ) 父進程/消息總線來管理所有來之于客戶端應用的交互(requesting operations to be performed), 包括將請求負載平衡到多個"query workers"中,然后讓 mogilefs的子進程去處理.

mogadm,mogtool的所有操作都要跟trackers打交道,Client的一些操作也需要定義好trackers,因此最好同時運行多個trackers來做負載均衡.trackers也可以只運行在一臺機器上,使用負載均衡時可以使用搞一些簡單的負載均衡解決方案,如haproxy,lvs,nginx等,

tarcker的配置文件為/etc/mogilefs/mogilefsd.conf,監聽在TCP的7001端口

2)Database–數據庫部分

主要用來存儲mogilefs的元數據,所有的元數據都存儲在數據庫中,因此,這個數據相當重要,如果數據庫掛掉,所有的數據都不能用于訪問,因此,建議應該對數據庫做高可用

3)mogstored–存儲節點

數據存儲的位置,通常是一個HTTP(webDAV)服務器,用來做數據的創建、刪除、獲取,任何 WebDAV 服務器都可以, 不過推薦使用 mogstored . mogilefsd可以配置到兩個機器上使用不同端口… mogstored 來進行所有的 DAV 操作和流量,IO監測, 并且你自己選擇的HTTP服務器(默認為 perlbal)用來做 GET 操作給客戶端提供文件.

典型的應用是一個掛載點有一個大容量的SATA磁盤. 只要配置完配置文件后mogstored程序的啟動將會使本機成為一個存儲節點.當然還需要mogadm這個工具增加這臺機器到Cluster中.

配置文件為/etc/mogilefs/mogstored.conf,監聽在TCP的7500端口

 

4.基本工作流程:

    架構.png

應用程序請求打開一個文件 (通過RPC 通知到 tracker, 找到一個可用的機器). 做一個 “create_open” 請求.

tracker 做一些負載均衡(load balancing)處理,決定應該去哪兒,然后給應用程序一些可能用的位置。

應用程序寫到其中的一個位置去 (如果寫失敗,他會重新嘗試并寫到另外一個位置去).

應用程序 (client) 通過”create_close” 告訴tracker文件寫到哪里去了.

tracker 將該名稱和域命的名空間關聯 (通過數據庫來做的)

tracker, 在后臺, 開始復制文件,知道他滿足該文件類別設定的復制規則

然后,應用程序通過 “get_paths” 請求 domain+key (key == “filename”) 文件, tracker基于每一位置的I/O繁忙情況回復(在內部經過 database/memcache/etc 等的一些抉擇處理), 該文件可用的完整 URLs地址列表.

應用程序然后按順序嘗試這些URL地址. (tracker’持續監測主機和設備的狀態,因此不會返回死連接,默認情況下他對返回列表中的第一個元素做雙重檢查,除非你不要他這么做..)

 

5.MogileFS的組成:
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安裝配置:

1、準備環境:

    node1 192.168.139.203 centos7    traceker+mogstored+database節點

    node2 192.168.139.200 centos7    traceker+mogstored節點

    node3 192.168.139.204 centos7    traceker+mogstored節點

   

    安裝包:需要在三個節點上安裝如下安裝包和安裝epel源解決依賴 yum install -y epel-* yum install *.rpm

    安裝包.png

2、配置database:

    1)、node3安裝database并創建數據、授權這里不在講解。

    2)、導入數據庫:    

        mogdbsetup –dbhost=192.168.139.204 –dbrootpass='123456' –dbuser='mog' –dbpass='4263.212'

    3)、node3配置tracker,node1、node2配置同node3

            mogilefs——conf.png

    4)、啟動tracker

        先在創建/var/run/mogilefsd文件  mkdir /var/run/mogilefsd chown -R mogilefs.mogilefs /var/run/mogilefsd

        /etc/init.d/mogilesd start

        mogilefs-start.png

    5)、修改mogstored服務配置文件:

        mogstored-conf.png

        分別在node1、node2、node3、上創建/data/mogilefs/dev1、/data/mogilefs/dev2、/data/mogilefs/dev3:

        mogstored-dev1.png

        提供mogstored服務腳本和啟動服務:(默認腳本是支持centos6需要更改支持centos7)

        start-mogstored.png

        啟動mogstored服務:/etc/init.d/mogstored start

        mogstored-startdf.png


3、使用mogadm命令配置mogilefs:

    mogadm.png

1)、添加存儲主機:

        mogadm –trackers=192.168.139.203:7001 host add 192.168.1.203 -ip=192.168.139.203 –status=alive

        mogadm –trackers=192.168.139.200:7001 host add 192.168.1.200 -ip=192.168.139.200 –status=alive

        mogadm –trackers=192.168.139.204:7001 host add 192.168.1.204 -ip=192.168.139.204 –status=alive

        host.png

2)、添加存儲設備:

        mogadm –trackers=192.168.139.203:7001 device add 192.168.139.203 1
        mogadm –trackers=192.168.139.200:7001 device add 192.168.139.200 2
        mogadm –trackers=192.168.139.204:7001 device add 192.168.139.204 3

        device.png

3)、添加域

         mogadm domain add files mogadm domain add images

4)、添加class類

        mogadm class add images png mogadm class add images jpeg

        mogadm class add files text mogadm class add files html

        fdfd.png

5)、上傳文件測試:

        mogupload –trackers=192.168.139.204:7001 –domain=files –key='test' –file=/etc/fstab –class=text

        file.png

        file2.png

6)、mogilefs狀態查詢:

        mogstats –db_dsn="DBI:mysql:mogilefs:host=192.168.139.204" –db_user="mog" –db_pass="123456"

7)、刪除domain流程:刪除文件–class-domain

        moglistkeys –trackers=192.168.139.204:7001 –domain=images  列出images域下所有key

        mogdelete –trackers=192.168.139.204:7001 –domain=images –key=linux.jpg

        mogadm class delete images jpeg

        domain delete images

 

4、Nginx做MogileFS的前端客戶端

 

    1)、編譯安裝nginx和nginx的mogilefs模塊

   tar xf  nginx-1.6.1.tar.gz tar xf nginx_mogilefs_module-1.0.2.tar.gz

        groupadd -r nginx  useradd -r -g nginx nginx

        ./configure –prefix=/usr/local/nginx –sbin-path=/usr/local/nginx/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 –add-module=/usr/local/src/nginx_mogilefs_module-1.0.2

    2)、提供配置腳本:    

    #!/bin/sh
    #
    # nginx – this script starts and stops the nginx daemon
    #
    # chkconfig:   – 85 15
    # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
    #               proxy and IMAP/POP3 proxy server
    # processname: nginx
    # config:      /etc/nginx/nginx.conf
    # config:      /etc/sysconfig/nginx
    pidfile=/var/run/nginx/nginx.pid

    # Source function library.
    . /etc/rc.d/init.d/functions

    # Source networking configuration.
    . /etc/sysconfig/network

    # Check that networking is up.
    [ "$NETWORKING" = "no" ] && exit 0

    nginx="/usr/local/nginx/sbin/nginx"
    prog=$(basename $nginx)

    NGINX_CONF_FILE="/etc/nginx/nginx.conf"

    [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

    lockfile=/var/lock/subsys/nginx

    make_dirs() {
       # make required directories
       user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*–user=\([^ ]*\).*/\1/g' -`
       options=`$nginx -V 2>&1 | grep 'configure arguments:'`
       for opt in $options; do
           if [ `echo $opt | grep '.*-temp-path'` ]; then
               value=`echo $opt | cut -d "=" -f 2`
               if [ ! -d "$value" ]; then
                   # echo "creating" $value
                   mkdir -p $value && chown -R $user $value
                   fi
           fi
       done
    }

    start() {
        [ -x $nginx ] || exit 5
        [ -f $NGINX_CONF_FILE ] || exit 6
        make_dirs
        echo -n $"Starting $prog: "
        daemon $nginx -c $NGINX_CONF_FILE
        retval=$?
        echo
        [ $retval -eq 0 ] && touch $lockfile
        return $retval
    }

    stop() {
    "/etc/init.d/nginx" 126L, 2529C                                                                                                                                                
        stop
        sleep 1
        start
    }

    reload() {
        configtest || return $?
        echo -n $"Reloading $prog: "
        killproc $nginx -HUP
        RETVAL=$?
        echo
        }

    force_reload() {
        restart
    }

    configtest() {
      $nginx -t -c $NGINX_CONF_FILE
    }

    rh_status() {
        status $prog
    }

    rh_status_q() {
        rh_status >/dev/null 2>&1
    }

    case "$1" in
        start)
            rh_status_q && exit 0
            $1
            ;;
        stop)
            rh_status_q || exit 0
            $1
            ;;
        restart|configtest)
            $1
            ;;
        reload)
            rh_status_q || exit 7
            $1
            ;;
        force-reload)
            force_reload
            ;;
        status)
            rh_status
            ;;
        condrestart|try-restart)
            rh_status_q || exit 0
                ;;
        *)
            echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
            exit 2
    esac

3)、修改nginx配置文件:

        nginx-conf.jpg

4)、mogilefs上傳文件:

        mogupload –trackers=192.168.139.204:7001 –domain=imgs  –key=test.html  –file='/etc/redhat-release'

5)、客戶端瀏覽器測試:

        html.jpg

 
實驗成功! 

接下來補充一下mogadm命令的額外指令。

mogadm slave //由于文件元數據信息是保存在MySQL中的,每次請求文件需要讀取MySQL一旦請求量太大,MySQL必定會成為性能瓶頸,這時我們要給MySQL做主從,這個指令就是用來添加從節點的,可以實現tracker與主從架構的MySQL交互時,實現讀寫分離。

mogadm fsck  //文件系統檢測,一般不要使用,除非集群意外斷電,在上線時執行。

mogadm rebalance  // 重新平衡,當數據出現熱區時使用,在執行之前需要定義平衡策略。

mogadm rebalance start // 啟動平衡策略。

mogadm rebalance policy  //定義平衡策略。

mogadm rebalance test  //用于測試是否出現數據不平衡的問題。

mogadm settings  //定義mogilefs工作屬性。

mogadm class modify <domain> <class> –mindevcount= //定義文件最小的副本份數

再總結兩個技巧.

    技巧一、 MogileFS  中怎么刪除主機  

    在機器壞了的時候 , 就會給這些標壞掉了 , 但還是不能刪除 . 下面是我建議的方式 ,當你給所有的硬盤設備標成不可用后 , 你然后在  fsck , 這樣會同 步文件到其它的機器同樣的份數 . 接著為了確認進入  MySQL  中查一下。  

         select count (*) from file_on where devid=11;

    看看是不是去掉的硬盤設備,真的沒有文件的記錄在上面了. 接著我們就可以安全的刪除這個設備了.  

        delete from device where devid=11;

    當對那個主機上的硬盤操作完時,你就可以刪除你的主機了.  

技巧二、 MogileFS  復制不正常 , 發現文件少于指定的份數解決方法  

    在安裝最新的 MogileFS 時,會發現測試的時候,怎么樣復制文件的過程都不正常.使用 telnet 到 7001 中使用 !watch 來查看時會不斷的報下面的錯(詳細

    使用見 MogileFS 高級排錯).

!watch
Added you to watcher list.
.
:: Child 10106 (replicate) died: 256 (UNEXPECTED)
:: Job replicate has only 9, wants 10, making 1.
:: Child 10091 (replicate) died: 256 (UNEXPECTED)
:: Job replicate has only 9, wants 10, making 1.
:: Child 10121 (replicate) died: 256 (UNEXPECTED)
:: Job replicate has only 9, wants 10, making 1.
:: Child 10134 (replicate) died: 256 (UNEXPECTED)
:: Job replicate has only 9, wants 10, making 1.
:: Child 10120 (replicate) died: 256 (UNEXPECTED)
:: Job replicate has only 9, wants 10, making 1.

    使用 MogileFS 的 DEBUG 模式跟這個問題,是由于 Sys::Syscall 這個模塊升級成 0.25 的新版本引起的.

    我們可以使用下面的命令來檢查當前的版本

    perl -MSys::Syscall -e 'print $Sys::Syscall::VERSION'

    如果發現是顯示上面的 0.25 就一定會出問題.建議退回到 0.23 就不會在出問題了.所以建議大家在安裝完 MogileFS 后,先退回這個模塊到 0.23.

    cpan http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz

                                                        

                                                                                                                                                感謝馬哥,每天進步一點點! 

 

原創文章,作者:n18-jude,如若轉載,請注明出處:http://www.www58058.com/15506

(0)
n18-juden18-jude
上一篇 2016-05-03
下一篇 2016-05-04

相關推薦

  • 第五周作業

    查看鏈接:http://note.youdao.com/noteshare?id=1ed7b36aa41cbdc1154e3e5b54e43fce

    Linux干貨 2016-09-19
  • 馬哥第一天

    來這兒的第一天

    2018-03-26
  • 壓縮與歸檔

    一、壓縮     壓縮:根據一定算法將數據以更加節省空間的形式存放。下面來看一下Linux常見的壓縮工具:     1、gzip/gunzip         后綴名:.gz   …

    Linux干貨 2015-05-04
  • 正則表達式

    Regual Expression 由一類特殊字符及文本字符所編寫的模式,其中有些字符不表示字面意義,而是用于控制或通配的功能 分類 REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能 程序支持:grep, vim, less,nginx等 分兩類: 基本正則表達式:BRE 擴展正則表達式:E…

    Linux干貨 2016-08-07
  • samba

    FTP,SAMBA,NFS之間的區別 FTP        Windows/linux/unix/macOS等        發布網站,文件共享              Tcp/21 Samba  …

    Linux干貨 2016-11-01
欧美性久久久久