MogileFS分佈式文件系統

 

         分佈式存儲:html

                   多個節點共同提供存儲空間,而後經過一箇中間層抽象出一個接口,提供給其餘程序調用,存儲自己對於上層應用是透明的;前端

         存儲方式:node

                   單獨使用一個節點存儲文件的元數據:集中元數據存儲;mysql

                            存儲節點專門存儲數據,元數據節點專門存儲元數據;linux

                   每一個存儲節點都存儲文件的元數據;nginx

                            存儲節點不光存儲數據,而且還存有全局的元數據;git

         分佈式文件系統與分佈式存儲的區別:程序員

                   分佈式文件系統提供文件系統接口,而分佈式存儲沒有文件系統接口,經過API訪問其中的數據;github

                   常見的分佈式文件系統;sql

                            GFS:Google File System,並行存儲海量文件;

                            HDFS:儲存大量較大的單個文件;

                            TFS:存儲海量小文件;

                                     將元數據存儲於關係型數據庫或其餘高性能存儲中,從而能維護海量文件元數據;

                            GlusterFS:

                                     去中心化設計;

                            cehp:整合到linux內核中的分佈式文件系統;

                            MogileFS:存儲海量小文件;

 

                  MogileFS文件系統:使用的是HTTP協議進行數據傳輸,因此很是適用於WEB;

                            角色:

                                     Tracker:元數據節點;

                                               負責向Database中存儲元數據或從Database中檢索元數據;而且能夠設置多個Tracker節點,進行高可用;

                                     Database:存儲元數據節點的關係型數據庫;

                                               可使用mysql數據庫,而且能夠作主從複製,對數據進行高可用;

                                     Storage Node:存儲節點;

                                               用於存儲真正的數據;

                                     Client Library:客戶端接口;

                                               經過調用API與其餘角色進行通訊;

 

                            基本元素:

                                     Domain:域

                                               一個MogileFS能夠有多個域,每一個域能夠用來存放不一樣類型的文件,位於同一個域中的Key(文件名)必須惟一,位於不一樣的域則Key能夠相同;

                                                        因此這就產生了一個問題:

                                                                 像淘寶這樣的平臺,它會爲每一個店鋪提供上傳本身商品圖片的業務,可是每一個店鋪都是獨立的,他們上傳圖片的時候又不會對比本身所傳圖片的命名名稱是否與其餘人的相同,這就與domain的機制相沖突了;固然咱們也能夠爲每一個店鋪提供一個domain,可是這樣對於管理員來講管理起來就太麻煩了不是嗎?因此咱們一般都是將店鋪上傳的圖片通過系統自動隨機改爲另一個名稱而後存儲到MogileFS中,而後像PHP頁面等程序員使用的時候直接引用便可;

                                     Class:類

                                               管理文件屬性,定義文件存儲在不一樣設備上的份數,是最小的複製單元,即用於將多個小文件合併成一個單獨被冗餘的複製單元;

                                    

                            示例:

                                     1.Nginx+MogileFS

                                               拓撲結構:

                                                        一共四個節點:

                                                                 192.168.80.145 centos7

                                                                 192.168.80.131 clone1

                                                                 192.168.80.134 clone2

                                                                           此三個節點運行Mysql(galera cluster)、Storage Node、Tracker;

                                                                 192.168.80.136 node2

                                                                           此節點做爲負載均衡器,運行Nginx;

                                              執行過程:

                                                        前端負載均衡器Nginx接收客戶端請求之後,Nginx本身扮演成MogileFS的客戶端,向Tracker請求元數據,當接收請求之後再跟進其響應的結果去Storage Node請求真正的數據,最後將接收到的數據響應返回給客戶端;

                                               配置過程:

                                                        a.處理依賴關係

                                                                 ~]# yum install perl-Sys-Syslog perl-Net-Netmask perl-IO-AIO

                                                        b.安裝MogileFS

                                                                 ~]# yum install MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm

                                                        c.添加相關的Mysql受權用戶

                                                                 添加一個遠程鏈接用戶(能夠不添加):

                                                                          MariaDB [(none)]>  grant all on *.* to 'root'@'192.168.80.%' identified by 'admin';

                                                                 建立一個MogileFS專用的數據庫

                                                                           MariaDB [(none)]> create database mogilefs;

                                                                 受權一個能夠徹底控制MogileFS專用數據庫的用戶

                                                                           MariaDB [(none)]> grant all on mogilefs.* to 'moguser'@'192.168.80.%' identified by 'mogpass';

                                                                          MariaDB [(none)]> flush privileges;

                                                        d.數據庫初始化

                                                                 ~]# mogdbsetup --dbhost=192.168.80.145 --dbrootpass='admin' --dbuser='moguser' --dbpass='mogpass'

                                                                 使用mogdbsetup -h查看幫助信息

                                                        e.編輯Tracker的配置文件

                                                                 ~]# vim /etc/mogilefs/mogilefsd.conf

                    daemonize = 1  以守護進程的方式運行

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

                    db_dsn = DBI:mysql:mogilefs:host=192.168.80.145  鏈接數據庫的數據源的方式:鏈接方式:數據庫類型:數據庫名稱:主機

                    db_user = moguser

                    db_pass = mogpass

                    listen = 0.0.0.0:7001

                    conf_port = 7001  管理端口

                    query_jobs = 10   查詢(用於查詢文件)線程的數量

                    delete_jobs = 1    刪除(用於刪除文件)線程的數量

                    replicate_jobs = 5  複製線程數量

                    reaper_jobs = 1   

                                                        f.啓動mogilefsd服務

                                                                 ~]# service mogilefsd start

                                                        g.編輯Storage Node的配置文件

                                                                 ~]# mkdir /data/mofilefs/dev1 -pv   路徑中」dev1」是固定格式

                                                                 ~]# chown -R mogilefs.mogilefs /data/mofilefs/

                                                                 ~]# vim /etc/mogilefs/mogstored.conf

                                                                           maxconns = 10000

                                                                           httplisten = 0.0.0.0:7500

                                                                           mgmtlisten = 0.0.0.0:7501

                                                                           docroot = /data/mogilefs/

                                                        h.若是是在centos7中則須要修改一下Storage Node的服務腳本;

                                                                 ~]# cat /etc/init.d/mogstored   (考眼力,找不一樣

                    lockfile=${LOCKFILE-/var/lock/subsys/mogstored}

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

                    RETVAL=0

                    start() {

                           [ $RETVAL = 0 ] && success && touch ${lockfile} && echo $(pidof mogstored) > ${pidfile}|| failure

                    }

                    stop() {

                            [ $RETVAL = 0 ] && success && rm -f ${lockfile} ${pidfile} || failure

                    }

                                                                 ~]# systemctl daemon-reload

                                                        i.啓動mogstored服務

                                                                 ~]# service mogstored start

                                                        j.MogileFS關機工具:mogadm

                                                                 mogadm host:管理節點

                                                                           mogadm host list

                                                                 mogadm device:管理設備

                                                                           mogadm device list

                                                                 mogadm domain:管理域

                                                                 mogadm class:管理類

                                                                 mogadm slave:管理從節點

                                                                 mogadm fsck:管理文件系統的檢測

                                                                 mogadm rebalance:管理存儲均衡

                                                                 mogadm setting:設置集羣屬性

                                                                           查看幫助:mogadm -h或者mogadm host add 而後直接鍵入回車會有更詳細的提示信息;

                                                        k.添加Storage Node節點到集羣中

                                                                 ~]# mogadm --tracker=192.168.80.145:7001 host add 192.168.80.145(主機名) --ip=192.168.80.145(節點地址) --status=alive(節點狀態)

                                                                 ~]# mogadm --tracker=192.168.80.145:7001 host add 192.168.80.131(主機名) --ip=192.168.80.131(節點地址) --status=alive(節點狀態)

                                                                 ~]# mogadm --tracker=192.168.80.145:7001 host add 192.168.80.134(主機名) --ip=192.168.80.134(節點地址) --status=alive(節點狀態)

                                                                 ~]# mogadm device add 192.168.80.145 1    添加設備

                                                               ~]# mogadm device add 192.168.80.131 2

                                                               ~]# mogadm device add 192.168.80.134 3

                                                                 ~]# mogadm device list

                                                                 ~]# mogadm check

                                                                 ~]# mogadm domain add images       添加域

                                                                 ~]# mogadm domain list

 

                                                                 ~]# mogadm class add images jpeg

                                                                 ~]# mogadm class add images png

                                                                 ~]# mogadm class list

 

                                                                          mindevcount:最少設備數量,也就是將相同的數據存儲到幾個設備上;

                                                                           replpolicy:複製策略,相似上面的選項

                                                                                    以上選項能夠經過mogadm class 設置;

                                                                           參看幫助:man mogadm

                                                        l.上傳文件到MogileFS中:mogupload

                                                                 Usage: /usr/bin/mogupload --trackers=host --domain=foo --key='/hello.jpg' --file='./hello.jpg'

                                                                           key:爲訪問路徑

                                                                           file:要上傳的文件

                                                                 ~]# mogupload --domain=images --key='book.png' --file='/root/book.png' --class=png --trackers=192.168.80.145:7001

                                                                 ~]# mogstats --db_dsn="DBI:mysql:mogilefs:host=192.168.80.145" --db_user="moguser" --db_pass="mogpass" --verbose --stats="devices,files"

Fetching statistics... (devices,files)

                                                        m.查看文件狀態

                                                                 ~]#mogfileinfo --trackers=192.168.80.136:7001 --key='book.png' --domain=images

                                                                 ~]# mogadm check

 

                                                        Note:此處有錯(devcount:1),見文末;

                                                        n.查看文件

                                                                 在瀏覽器鍵入上面http地址便可查看圖片;

 

                                                        o.使用Nginx做爲MogileFS的前端代理

                                                                 Mogilefs支持使用Nginx做爲其前端的反向代理,Ngin能夠將客來自戶端的請求轉發給MogileFS,而且還能將MogileFS返回的數據(經過本身的響應路徑格式)響應給客戶端(咱們也發現了若是使用MogileFS本身的路徑放文件是及其不方便的,文件名也是比較難識別);Nginx要做爲MogileFS的反向代理使用還要額外加載一個模塊:nginx-mogilefs-module(下載地址:https://github.com/vkholodkov/nginx-mogilefs-module

                                                                 編譯安裝tengine做爲反向代理:

                                                                           在編譯以前能夠將tengine解壓路徑中的objs/Makefile文件中的CFLAGS =  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g行後面的」-Werror -g」去掉,不然會報告一個這樣的錯誤:(也能夠不設置直接編譯,若是報錯就改,不報就不改)

 

                                                                           ~]#unzip nginx-mogilefs-module-master.zip

                                                                           ~]#tar xf tengine-2.0.1.tar.gz

                                                                        ~]#cd tengine-2.0.1/

                                                                           ~]#./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-master

                                                                           ~]#make

                                                                           ~]#make install

                                                                           添加一個nginx啓動Unit

                                                                           ~]#vim /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=SIGQUIT

                                                                                    TimeoutStopSec=5

                                                                                    PrivateTmp=true

                                                                                   

                                                                                    [Install]

                                                                                    WantedBy=multi-user.target

                                                                 啓動nginx服務

                                                                           ~]#systemctl start nginx.service

                                                                 配置nginx做爲MogileFS的反向代理

                                                                           Tracker主機能夠配置多個,用於進行負載均衡

                                                                           ~]#vim /etc/nginx/nginx.conf

                                                                                    location /images/{

                                                                                             此處的路徑」/images/」會根據domain中的key的不一樣而不一樣,若是資源的key名稱開頭爲」/」則此處應該爲」/images」,若是沒有」/」則爲」/images/」;

                                                                                             mogilefs_tracker trackers;

                                                                                                      指定tracker地址;

                                                                                             mogilefs_domain images;

                                                                                                       指定域地址,每一個location中只能設置一個;

                                                                                             mogilefs_methods GET;

                                                                                                       支持的請求方法;

                                                                                             mogilefs_noverify on;

                                                                                                       是否作校驗;

                                                                                            

                                                                                             mogilefs_pass {

                                                                                                       proxy_pass $mogilefs_path;

                                                                                                                自帶變量,讓Nginx自動構建請求報文,發送給Tracker主機;

                                                                                                       proxy_hide_header Content-Type;

                                                                                                       proxy_buffering off;

                                                                                             }

                                                                                    }

                                                                                    location /status {

                                                                        check_status;

                                                                        access_log off;

                                                                                             allow 192.168.80.0/24;

                                                                        deny all;

                                                                                    }

                                                                                   

                                                                         upstream  trackers {

                                                                        server 192.158.80.136:7001 weight=1;

                                                                        server 192.168.80.147:7001 weight=1;

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

                                                                                             #check interval=1000 rise=2 fall=5 timeout=1000 mode=http;

                                                                                             #check_keepalive_requests 100;

                                                                                             #check_http_send= 「GET / HTTP/1.0\r\n\r\n」;

                                                                                             #check_http_expect_alive http_2xx http_3xx;

                                                                                                       此check關鍵字只在tengine中可使用;

                                                                         }

                                                                 重啓Nginx服務

                                                                           systemctl restart nginx.service

                                                                 測試訪問資源

                                                                           http://192.168.80.147/images/book6.png

                                                                           http://192.168.80.147/status

 

 

 

 

         Note示例中的拓撲結構跟示例的例子有些出入,由於在作的過程當中,clone1和clone2這個兩個節點爲centos6,由於監聽mogstored服務所須要的接口,因此沒有搭建成功,只是做爲mysql galers cluster使用了,而且centos7也沒有搭建成功,因此也是做爲mysql使用了,最後將MogileFS搭建在了node2中,而後還另加了一個節點node3(192.168.80.147)也用於搭建MogileFS;其實就是換了主機,其餘的沒有變化,不影響實驗;

出現的問題:

         1.此文章中使用的服務啓動腳本,有時候在centos7中雖然作了上述的修改可是,仍然沒法啓動服務,可是我換了一個centos7就能夠了,目前尚未找到服務,其報錯爲:mogstored.pid參數錯誤;

         2.報錯:PID file /var/run/mogilefsd/mogilefsd.pid not readable (yet?) after start.

                   解決方法:建立/var/run/mogilefsd/目錄,而且更改屬主屬組爲mogilefs便可;

         3.本文使用的rpm安裝包在centos6中安裝之後能夠啓動服務,都顯示成功,可是mogstored服務的接口並無處於監聽狀態,因此沒法做爲Storage Node提供存儲空間;(這就是上面換主機的緣由)

                   致使的錯誤爲:使用mogadm check之後顯示請求遠端節點失敗

 

         4.當上傳文件之後,原本設置的是文件會冗餘一份,可是經過mogfileinfo查看卻只有一份,也就是devcount: 1 ,這是由於perl-Sys-Syscall模塊版本(0.25)過新致使的,將其降級成0.23版本便可;

                   修改步驟:

                            下載0.23的版本:https://metacpan.org/release/BRADFITZ/Sys-Syscall-0.23

                            解壓之後使用Sys-Syscall-0.23/lib/Sys/Syscall.pm覆蓋現有系統中的0.25版本的同名文件(能夠經過rpm -ql perl-Sys-Syscall來查看現有系統的0.25版本的文件都安裝在哪了);先關閉服務,而後再覆蓋;

借鑑文章:http://www.bubuko.com/infodetail-2225032.html

 

    注:根據馬哥視頻作的學習筆記,若有錯誤,歡迎指正;侵刪

相關文章
相關標籤/搜索