天天看點

分布式檔案系統MogileFS

一、分布式檔案系統介紹

    定義:分布式存儲系統是大量普通PC伺服器通過與Internet互聯,對外作為一個整體提供存儲服務。分布式檔案系統,顧名思義,就是分布式+檔案系統。它包含這兩個方面的内涵,從檔案系統的用戶端使用的角度來看,它就是一個标準的檔案系統,提過一系列的API,由此進行檔案或者目錄的建立、移動、删除,以及對檔案的讀寫等操作。從内部實作來看,分布式系統則不再和普通檔案系統一樣負責管理本地磁盤,它的檔案内容和目錄結構都不是存儲再本地磁盤上,而是通過網絡傳輸到遠端系統上。并且,同一個檔案存儲不隻是在一台機器上,而是在一組機器上分布式存儲,協同提供服務。   

    特性:

    1、可擴充:分布式存儲系統可以擴充到幾百台至幾千台的叢集規模,且随着叢集規模的增長,系統整體性能表現為線性增長;

    2、低成本:分布式存儲系統的自動容錯、自動負載均衡機制使其可以建構再普通PC機之上;另外,線性擴充能力也使得增長、減少機器非常友善,可以實作自動運維;

    3、高性能:無論針對整個叢集還是單台伺服器,都要求分布式系統具備高性能。

    4、易用性:分布式存儲系統需要能夠提供易用的對外接口;另外,也要求具備完善的監控、運維工具,并能友善的與其他系統內建,如從hadoop雲計算系統導入資料;

    挑戰:在于資料、狀态資訊的持久化,要求在自動遷移,自動容錯、并發讀寫的過程中保證資料的一緻性;

二、CAP理論

    來自Berkerly的Eric Brewer教授提出了一個著名的CAP理論:一緻性(Consistency),可用性(Availability)和分區容忍性(Tolerance of networkPartition)三者不能同時滿足;

    C:讀操作總是能夠讀取到之前完成的寫操作結果,滿足這個條件的系統成為強一緻系統,這裡的“之前”一般對同一個用戶端而言;

    A:讀寫操作再單台機器發生故障的情況下依然能夠正常執行,而不需要等待發生故障的機器重新開機或者其上的服務遷移到其他機器;

    P:機器故障、網絡故障、機房停電等異常情況下仍然能夠滿足一緻性可可用性;

分布式存儲系統要求能夠自動容錯,即分區可容忍性總是需要滿足的,是以,一緻性和寫操作的可用性就不能同時滿足了,需要再這兩者間權衡,是選擇不允許丢失資料,保持強一緻,還是允許少量資料丢失以獲得更好的可用性;

三、常見分布式檔案系統

    GFS(Google File System):Google公司為了滿足自己公司需求而開發的基于Linux的專有分布式檔案系統。由于其中繼資料時存儲再記憶體中,是以在存儲檔案數量上注定不可能達到海量存儲,主要是存儲大檔案使用。

    HDFS(Hadoop Distributen File System):hadoop的重要組成之一,幾乎完全山寨版的GFS。

    TFS:淘寶自主研發,将中繼資料存儲于關系型資料庫或其它高性能存儲中,進而能維護海量檔案中繼資料;主要用于存儲海量小檔案,維護難度大

    GlusterFS:去中心化的設計模式;擅長處理單個大檔案;

    Ceph:Linux核心級實作的檔案系統,目前已經直接被收錄進Linux核心;bug較多,穩定性不佳

    MooseFs:持FUSE,相對比較輕量級,對master伺服器有單點依賴,用perl編寫,性能相對較差,國人用的較多;

    MogileFS:中繼資料放在資料庫中,擅長處理海量小檔案,性能較好;

    FastDFS:輕量級分布式系統,擅長處理海量小檔案

四、MogileFS詳細介紹

    MogileFS是一個開源的分布式檔案存儲系統,由LiveJournal旗下的Danga Interactive公司開發。Danga團隊開發了包括 Memcached、MogileFS、Perlbal 等多個知名的開源項目。目前使用MogileFS 的公司非常多,如日本排名先前的幾個互聯公司及國内的yupoo(又拍)、digg、豆瓣、1号店、大衆點評、搜狗和安居客等,分别為所在的組織或公司管理着海量的圖檔。

    1、MogileFS由3個部分組成:

    (1)、server:主要包括mogilefsd和mogstored兩個應用程式。mogilefsd實作的是tracker,它通過資料庫來儲存中繼資料資訊,包括站點domain、class、host等;

    (2)、utils(工具集):主要是MogileFS的一些管理工具,例如modadm等。

    (3)、用戶端API:MogileFS的用戶端API很多,例如Perl、php、Java、python等,用這個子產品可以編寫用戶端程式,實作檔案的備份管理功能等。

    2、MogileFS特性:

     (1)、工作于應用層:http,nfs;

     (2)、無單點:三大元件(tracker,mogstore,database)皆可以實作高可用;

     (3)、自動完成檔案複制:複制的最小機關不是檔案,而是class;基于不同的class,檔案可以被自動的複制到多個有足夠存儲空間的存儲節點上;

     (4)、傳輸無需特殊協定:可以通過NFS或HTTP協定進行通信;

     (5)、名稱空間:檔案通過一個給定的key來确定,是一個全局的命名空間;沒有目錄,基于域實作檔案隔離;

     (6)、不共享任何資料:無需通過昂貴的SAN來共享磁盤,每個存儲節點隻需維護自己所屬的儲存設備(device)即可;

     兩個關鍵術語:

        domain:name space,命名空間

            一個MogileFS可以有多個Domain

            用來存放不同檔案(大小、類型)

            同一個Domain内,key必須唯一

            不同Domain内,key可以相同

         class:最小複制單元

            檔案屬性管理器

            定義檔案存儲再不同裝置上的份數

     理想架構

分布式檔案系統MogileFS
     實際架構
分布式檔案系統MogileFS

系統環境: Centos6.7   

     工作流程  

        1、用戶端向伺服器端發送請求

        2、nginx通過排程将請求轉達給其中一個mogilefs的tracker

        3、tracker接收到請求向後端資料庫擷取存儲位置并傳回給nginx

        4、nginx接到存儲位置再到mogilefs的存儲上擷取實際存儲資料并傳回給用戶端

五、MogileFS實作

1、node3上安裝mysql并配置其root使用者允許遠端連接配接
# tar xf mysql-5.6.22-linux-glibc2.5-x86_64.tar.gz -C /usr/local
# cd /usr/local
# ln -sv mysql-5.6.22-linux-glibc2.5-x86_64/ mysql
# groupadd -g 306 mysql
# useradd -g 306 -u 306 -s /sbin/nologin -M -r mysql
# mkdir /u01/mysql/{data,log} -pv
# chown -R mysql.mysql /u01/mysql/
# cd /usr/local/mysql
# chown root.mysql ./*
# scripts/mysql_install_db --user=mysql --datadir=/u01/mysql/data
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chmod +x /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
# echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf
# ldconfig
# ldconfig -p | grep mysql
# ln -sv /usr/local/mysql/include/ /usr/include/mysql
# echo "export PATH=$PATH:/usr/local/mysql/bin" > /etc/profile.d/mysql.sh
# . /etc/profile.d/mysql.sh
# vim /etc/my.cnf
[mysqld]
lower_case_table_names =1          #不區分大小寫
datadir = /u01/mysql/data          #資料目錄
port = 3306                        #端口
socket = /tmp/mysql.sock
pid-file = /tmp/mysql.pid

character_set_server = utf8         #server級别字元集
default_storage_engine  = InnoDB     #預設存儲

log_error  = /var/log/mysql/mysqld.log
log-bin  = /u01/mysql/log/mysql-bin    #log-bin檔案存放目錄
log-bin-index  = /u01/mysql/log/mysql-bin.index
expire_logs_days  = 30        
skip-name-resolve

# mkdir /var/log/mysql
# service mysqld start

# mysql
> GRANT ALL ON *.* TO 'root'@'192.168.%.%' IDENTIFIED BY 'mogilefs';  #授權
Query OK, 0 rows affected (0.00 sec)

> flush privileges;          #重讀授權
Query OK, 0 rows affected (0.01 sec)




2、安裝如下軟體包,雖然隻是配置tracker,但還是安裝了storage的包,是因為後面做高可用時用到
 MogileFS-Server-2.46-2.el6.noarch.rpm             #通行元件
 MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm   #traker
 MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm   #storage
 MogileFS-Utils-2.19-1.el6.noarch.rpm              #工具包
 Perlbal-1.78-1.el6.noarch.rpm
 Perlbal-doc-1.78-1.el6.noarch.rpm
 perl-MogileFS-Client-1.14-1.el6.noarch.rpm        #用戶端開發使用
 perl-Net-Netmask-1.9015-8.el6.noarch.rpm          #機架感覺能力
 perl-Perlbal-1.78-1.el6.noarch.rpm                #依賴包
 
# yum -y localinstall *.rpm  #安裝所有包
由于node3是做tracker的,用到的主要程式包是MogileFS-Server-mogilefsd,其他和配置tracker沒有太
大關系,MogileFS-Server-mogilefsd生成的主要檔案
# rpm -ql MogileFS-Server-mogilefsd
/etc/mogilefs/mogilefsd.conf   #主配置檔案
/etc/rc.d/init.d/mogilefsd     #啟動腳本
/usr/bin/mogdbsetup            #資料庫初始化工具
/usr/bin/mogilefsd             #mogilefsd主程序

3、初始化MogileFS資料庫:使用可以連接配接到mysql的使用者和密碼,建立一個MogileFS使用的資料庫和資料庫的管理使用者以及設定密碼
# mogdbsetup --dbhost=192.168.5.13 --dbrootuser=root --dbrootpass=mogilefs --dbname=mogilefs --dbuser=moguser --dbpass=mogpass

This will attempt to setup or upgrade your MogileFS database.
It won't destroy existing data.
Run with --help for more information.  Run with --yes to shut up these prompts.

Continue? [N/y]: y

Create/Upgrade database name 'mogilefs'? [Y/n]: y

Grant all privileges to user 'moguser', connecting from anywhere, to the mogilefs database 'mogilefs'? [Y/n]: y
Failed to grant privileges: Access denied for user 'root'@'192.168.%.%' to database 'mogilefs'  
# 注意有錯提示Failed to grant privileges: Access denied for user 'root'@'192.168.%.%' to database 'mogilefs'

# 去資料庫檢視,已經建立了,但沒有tables
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mogilefs           |
| mysql              |
| performance_schema |
| test          
mysql> use mogilefs;
Database changed
mysql> show tables;
Empty set (0.00 sec)

# 手動建立使用者moguser,并授權mogilefs的所有權限
mysql> grant all on mogilefs.* to moguser@'192.168.%.%' identified by 'mogpass';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

# 重新執行初始化資料庫指令,并檢視。
# mogdbsetup --dbhost=192.168.5.13 --dbrootuser=root --dbrootpass=mogilefs --dbname=mogilefs --dbuser=moguser --dbpass=mogpass

This will attempt to setup or upgrade your MogileFS database.
It won't destroy existing data.
Run with --help for more information.  Run with --yes to shut up these prompts.

Continue? [N/y]: y

# mysql -uroot -pmogilefs
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 5.6.22-log MySQL Community Server (GPL)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use mogilefs;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;     #可以正常看到已經有表了
+----------------------+
| Tables_in_mogilefs   |
+----------------------+
| checksum             |
| class                |
| device               |
| domain               |
| file                 |
| file_on              |
| file_on_corrupt      |
| file_to_delete       |
| file_to_delete2      |
| file_to_delete_later |
| file_to_queue        |
| file_to_replicate    |
| fsck_log             |
| host                 |
| server_settings      |
| tempfile             |
| unreachable_fids     |
+----------------------+
17 rows in set (0.00 sec)
# 修改mogilefsd.conf檔案設定連接配接mysql的使用者名和密碼,mogilefsd監聽的位址和端口,啟用的一些線程
# 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
# Database connection information
db_dsn = DBI:mysql:mogilefs:host=192.168.5.13     
#DBI:perl連接配接mysql的驅動,mysql資料庫類型,mogdb連接配接的資料庫,host(mysql伺服器位址)
db_user = moguser   #連接配接資料庫的使用者
db_pass = mogpass   #連接配接資料庫的密碼
# IP:PORT to listen on for mogilefs client requests
listen = 192.168.5.13:7001    #mogilefsd監聽的位址
# Optional, if you don't define the port above.
conf_port = 7001    #監聽的端口
# Number of query workers to start by default.
query_jobs = 10    #啟用的請求線程,為10表示隻能并發10個用戶端;注意用戶端不是使用者通路量,而是連接配接使用mogilefsd的伺服器
# 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

#設定完成啟動服務并驗證7001端口已經啟動
# service mogilefsd start
Starting mogilefsd                                         [  OK  ]
# netstat -tnlp |grep 7001
tcp        0      0 192.168.5.13:7001    0.0.0.0:*   LISTEN      3613/mogilefsd

4、在node1和node2上安裝配置storage
#安裝如下軟體包,配置storage主要用到的軟體包是MogileFS-Server-mogstored
#注意:這塊建議先安裝epel源,有可能有些依賴關系能解決
MogileFS-Server-2.46-2.el6.noarch.rpm             #通用元件
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm  #tracker
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  #storage
MogileFS-Utils-2.19-1.el6.noarch.rpm             #工具包
perl-MogileFS-Client-1.14-1.el6.noarch.rpm      #用戶端開發使用
perl-Net-Netmask-1.9015-8.el6.noarch.rpm        #機架感覺能力
perl-Perlbal-1.78-1.el6.noarch.rpm               #依賴包
#Mogstored依賴與perl-IO-AIO這個包,需要額外安裝,否則mogstored無法正常啟動
# yum -y install perl-IO-AIO     #這個必須裝,不然後面會出錯
# yum -y localinstall *.rpm

#MogileFS-Server-mogstored生成的檔案
# rpm -ql MogileFS-Server-mogstored
/etc/mogilefs/mogstored.conf  #主配置檔案
/etc/rc.d/init.d/mogstored    #腳本檔案
/usr/bin/mogautomount         #自動挂載的工具
/usr/bin/mogstored            #主程式

#建立一個目錄準備存儲檔案,并且設定屬主和屬組為mogilefs,否則tracker節點會無法讀取資料
分别在node1,和node2上執行
# mkdir /mogstore
# chown -R mogilefs.mogilefs /mogstore/

将存儲目錄挂載到單獨的分區
# vim /etc/fstab
/dev/sda5               /mogstore               ext4    defaults        0 0
# mount|grep mogstore
/dev/sda5 on /mogstore type ext4 (rw)

#在存儲目錄建立裝置編号目錄,注意此目錄各個節點不能重名
# mkdir /mogstore/dev1    #在node1上
# mkdir /mogstore/dev2    #在node2上

#修改配置檔案
# vim /etc/mogilefs/mogstored.conf
maxconns = 10000              #最大并發連接配接數
httplisten = 0.0.0.0:7500    #http協定監聽的端口
mgmtlisten = 0.0.0.0:7501    #管理監聽的端口
docroot = /mogstore           #檔案存儲的目錄

#設定完成啟動服務,并驗證端口是否正常啟動
# netstat -tnlp|egrep "7500|7501"
tcp        0      0 0.0.0.0:7500    0.0.0.0:*        LISTEN      3324/mogstored      
tcp        0      0 0.0.0.0:7501    0.0.0.0:*        LISTEN      3324/mogstored

5、指令詳解
檢視MogileFS-Utils生成的指令,隻列出常用的指令
# rpm -ql MogileFS-Utils
/usr/bin/mogadm     #MogileFS管理工具,可以實作将mogstored加入到mogilefsd
/usr/bin/mogdelete      #删除檔案
/usr/bin/mogfetch       #擷取檔案
/usr/bin/mogfiledebug   
/usr/bin/mogfileinfo    #檢視檔案
/usr/bin/moglistfids
/usr/bin/moglistkeys
/usr/bin/mogrename
/usr/bin/mogstats
/usr/bin/mogtool
/usr/bin/mogupload      #上傳檔案

Mogadm指令的常用功能:
mogadm check         #狀态監測
mogadm stats         #顯示MogileFS的狀态統計資訊
mogadm host ...      #管理主機
mogadm device ...    #管理裝置
mogadm domain ...    #管理域
mogadm class ...     #管理類
mogadm slave ...     #管理複制
mogadm fsck ...      #檔案系統檢查和修複
mogadm rebalance ... #重新均衡(MogileFS運作時間久了mogstored存儲的資料量有可能不一樣,重新均衡一下各個節點的資料就差不多了)
mogadm settings ...  #設定檔案複制數

說明:# mogadm -h (可以使用-h或者--help擷取幫助,不過我測試好像後面跟什麼都可以擷取幫助)
Usage:  (enter any command prefix, leaving off options, for further help)

  mogadm check                     Check the state of the MogileFS world.
  mogadm stats                     Show MogileFS system statistics.  (DEPRECATED: use mogstats instead)
  mogadm host ...
         host add ...              Add a host to MogileFS.
         host delete ...           Delete a host.
         host list                 List all hosts.
         host mark ...             Change the status of a host.  (equivalent to 'modify --status')
         host modify ...           Modify a host's properties.
  mogadm device ...
         device add ...            Add a device to a host.
         device list ...           List all devices, for each host.
         device mark ...           Mark a device as {alive,dead,down,drain,readonly}
         device modify ...         Modify a device's properties.
         device summary ...        List the summary of devices, for each host.
  mogadm domain ...
         domain add ...            Add a domain (namespace)
         domain delete ...         Delete a domain.
         domain list               List all hosts.
  mogadm class ...
         class add ...             Add a file class to a domain.
         class delete ...          Delete a file class from a domain.
         class list                List all classes, for each domain.
         class modify ...          Modify properties of a file class.
  mogadm slave ...
         slave add ...             Add a slave node for store usage
         slave delete ...          Delete a slave node for store usage
         slave list                List current store slave nodes.
         slave modify ...          Modify a slave node for store usage
  mogadm fsck ...
         fsck clearlog             Clear the fsck log
         fsck printlog             Display the fsck log
         fsck reset ...            Reset fsck position back to the beginning
         fsck start                Start (or resume) background fsck
         fsck status               Show fsck status
         fsck stop                 Stop (pause) background fsck
         fsck taillog              Tail the fsck log
  mogadm rebalance ...
         rebalance policy ...      Add or adjust the current policy
         rebalance reset           Reset an existing policy
         rebalance settings        Display rebalance settings
         rebalance start           Start a rebalance job
         rebalance status          Show status of current rebalance job
         rebalance stop            Stop a rebalance job
         rebalance test            Show what devices the current policy would match
  mogadm settings ...
         settings list             List all server settings
         settings set ...          Set server setting 'key' to 'value'.
         
6、配置分布式叢集(在Node3上)
# mogadm --trackers=192.168.5.13:7001 host add node1 --ip=192.168.5.11 --status=alive
# mogadm --trackers=192.168.5.13:7001 host add node2 --ip=192.168.5.12 --status=alive         
    add:表示添加主機
    node1:表示主機名,可以随便寫(自己知道就行)
    --ip:表示添加的主機位址
    --status=alive:表示添加之後的狀态為上線
    
#添加完成之後檢視主機清單
# mogadm --trackers=192.168.5.13:7001 host list
node1 [1]: alive
  IP:       192.168.5.11:7500

node2 [2]: alive
  IP:       192.168.5.12:7500
  
#添加裝置
節點雖然已經添加完成,但是還不能存儲資料,如果想存儲資料需要追蹤存儲節點上的裝置
# mogadm --trackers=192.168.5.13:7001 device add node1 1
# mogadm --trackers=192.168.5.13:7001 device add node2 2

    add:表示添加裝置
    node1:節點名稱,必須和添加主機時儲存一緻
    1和2:添加的dev裝置編号
    
#添加完成檢視device清單可以看到裝置
# mogadm --trackers=192.168.5.13:7001 device list
node1 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      0.043     18.517     18.560        100

node2 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      0.000      0.000      0.000        100
   
#補充:這裡多增加一個node2節點的裝置,添加為dev3,   
# mogadm --trackers=192.168.5.13:7001 device add node2 3
# mogadm --trackers=192.168.5.13:7001 device list
node1 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      0.043     18.517     18.560        100

node2 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      0.000      0.000      0.000        100
   dev3:   alive      0.000      0.000      0.000        100
   
#删除方法:這裡沒有deleted指令,需要使用mark将dev3标記為dead狀态就删除了
# mogadm --trackers=192.168.5.13:7001 device mark node2 3 dead
# mogadm --trackers=192.168.5.13:7001 device list
node1 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      0.043     18.517     18.560        100

node2 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      0.000      0.000      0.000        100
   
#定義名稱空間(domain):
# mogadm --trackers=192.168.5.13:7001 domain add p_w_picpaths
# mogadm --trackers=192.168.5.13:7001 domain add conffiles
# mogadm --trackers=192.168.5.13:7001 domain list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 conffiles            default                   2        MultipleHosts() NONE   

 p_w_picpaths               default                   2        MultipleHosts() NONE   
 
 #domain:dmoain的名字
 #class:domain建立完成之後會自動建立一個class,所有檔案都存放在class中
 #mindevcount:最小複制單元,為2表示上傳的檔案最少存儲兩個副本
 #replpolioy:複制政策,MultipheHosts()表示多主機實作複制,這裡不用管為預設即可
 #hashtype:class在命名時是使用哈希進行計算的,這裡表示雜湊演算法,NONE表示沒有使用雜湊演算法
 
#定義class:
#由于建立domain會自動建立class,是以會出現class
# mogadm --trackers=192.168.5.13:7001 class list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 conffiles            default                   2        MultipleHosts() NONE   

 p_w_picpaths               default                   2        MultipleHosts() NONE   
 
#新添加一個class
# mogadm --trackers=192.168.5.13:7001 class add p_w_picpaths bjwf1 --mindevcount=2
# mogadm --trackers=192.168.5.13:7001 class list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 conffiles            default                   2        MultipleHosts() NONE   

 p_w_picpaths               bjwf1                     2        MultipleHosts() NONE   
 p_w_picpaths               default                   2        MultipleHosts() NONE   
 
#驗證分布式系統:分布式檔案系統已經搭建好,可以使用mogupload指令上傳測試
# mogupload --trackers=192.168.5.13:7001 --domain=p_w_picpaths --key='/1.jpg' 
  --file='/u01/p_w_picpaths/138-140911113024.jpg' 

   #--domain=p_w_picpaths:表示存儲到p_w_picpaths這個domain中
   #--key='/1.jpg':通路檔案的URL位址
   #--fill=:本地上傳檔案位址 

#檢視上傳的檔案資訊,在node1有了檔案,node2上沒有,出問題了
# mogfileinfo --trackers=192.168.5.13:7001 --domain=p_w_picpaths --key='/1.jpg'
- file: /1.jpg
     class:              default
  devcount:                    1
    domain:               p_w_picpaths
       fid:                    4
       key:               /1.jpg
    length:               176531
 - http://192.168.5.11:7500/dev1/0/000/000/0000000004.fid
 
#經過排查發現node2上/mogstore上的屬組和屬主是root,沒有改成mogilefs
# chown -R mogilefs.mogilefs /mogilefs   #在node2上修改檔案

#重新開機node3上的mogilefsd,和node2上的mogstored服務,再次上傳
# mogupload --tracker=192.168.5.13:7001 --domain=p_w_picpaths --key='/2.jpg' --file='/u01/p_w_picpaths/0958.png' 
# mogfileinfo --trackers=192.168.5.13:7001 --domain=p_w_picpaths --key='/2.jpg'
- file: /2.jpg    #再次檢視,可看到兩個節點上都已經有了檔案
     class:              default
  devcount:                    2
    domain:               p_w_picpaths
       fid:                    7
       key:               /2.jpg
    length:               363755
 - http://192.168.5.11:7500/dev1/0/000/000/0000000007.fid
 - http://192.168.5.12:7500/dev2/0/000/000/0000000007.fid      

通路上面的兩個URL,可以看到

分布式檔案系統MogileFS
分布式檔案系統MogileFS

剛剛上傳的是圖檔,這次在上傳一個文本檔案試試

# mogupload --trackers=192.168.5.13:7001 --domain=conffiles --key='/configures/fstab' --file='/etc/fstab' 
# mogfileinfo --trackers=192.168.5.13:7001 --domain=conffiles --key='/configures/fstab'
- file: /configures/fstab
     class:              default
  devcount:                    2
    domain:            conffiles
       fid:                    8
       key:    /configures/fstab
    length:                  805
 - http://192.168.5.12:7500/dev2/0/000/000/0000000008.fid
 - http://192.168.5.11:7500/dev1/0/000/000/0000000008.fid      

通路上面的兩個URL,顯示

分布式檔案系統MogileFS
分布式檔案系統MogileFS

不光可以上傳檔案,還可以下載下傳檔案,使用mogfetch指定那個domain是那個,key路徑,使用file在指明下載下傳之後存儲到本地的那裡即可

# mogfetch --trackers=192.168.5.13:7001 --domain=conffiles --key='/configures/fstab' --file='/root/fstab'

# ll /root/fstab

-rw-r--r--. 1 root root 805 Feb  5 14:47 /root/fstab

六、MogileFS高可用

在node{1.2.3}這三個節點上都安裝啟動mogilefsd和mogstored,使用戶端無論通路哪一個節點都可以擷取到資料,而且replpolicy設定最少兩份,就算是一台節點故障下線其他節點仍然可以繼續提供服務。

1、在node3上安裝mogstored的依賴包。

yum install perl-IO-AIO      

2、建立存儲目錄并挂載

# mkdir /mogstore/dev3
# chown -R mogilefs.mogilefs /mogstore
# vim /etc/fstab
/dev/sda5        /mogstore        ext4    defaults      0 0
# mount -a
# mount |grep mogstore
/dev/sda5 on /mogstore type ext4 (rw      

3、修改配置檔案并啟動服務

# vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogstore
# service mogstored start
Starting mogstored                       [  OK  ]
# netstat -tnlp |egrep "7500|7501"
tcp    0      0 0.0.0.0:7500     0.0.0.0:*                   LISTEN      2927/mogstored      
tcp    0      0 0.0.0.0:7501     0.0.0.0:*                 LISTEN      2927/mogstored      

4、配置完成後使用mogadm指令将自己也添加到叢集中并将node3的裝置也添加到叢集中

# mogadm --trackers=192.168.5.13:7001 host add node3 --ip=1
92.168.5.13 --status=alive
# mogadm --trackers=192.168.5.13:7001 host list
node1 [1]: alive
  IP:       192.168.5.11:7500

node2 [2]: alive
  IP:       192.168.5.12:7500

node3 [3]: alive
  IP:       192.168.5.13:7500
# mkdir /mogstore/dev4
# chown -R mogilefs.mogilefs /mogstore   #挂載原因
# mogadm --trackers=192.168.5.13:7001 device add node3 4  
#以前添加過3,沒有删除,隻是标記為沒有的,但是這塊顯示已經有了,是以改為4,
 暫時沒找到方法把以前的幹掉
# mogadm  --trackers=192.168.5.13:7001 device list
node1 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      0.043     18.517     18.560        100

node2 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      0.043     27.984     28.027        100

node3 [3]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev4:   alive      0.042     18.518     18.560        100      

5、将node1和node2配置成mogilefsd并啟動

這裡可以直接将node3的配置檔案拷貝過來,修改配置檔案的監聽位址即可

# scp /etc/mogilefs/mogilefsd.conf node1:/etc/mogilefs/ 
# scp /etc/mogilefs/mogilefsd.conf node2:/etc/mogilefs/
# vim /etc/mogilefs/mogilefsd.conf #node1上
listen = 192.168.5.11:7001
# vim /etc/mogilefs/mogilefsd.conf #node2上
listen = 192.168.5.12:7001

# service mogilefsd start     #node1
Starting mogilefsd                 [  OK  ]
# ss -tnl|grep 7001
LISTEN     0      128    192.168.5.11:7001     *:*

# service mogilefsd start     #node2
Starting mogilefsd                 [  OK  ]
# ss -tnl|grep 7001
LISTEN     0      128    192.168.5.12:7001     *:*      

6、驗證MogileFS的高可用

在三個節點各自配置好了tracker和storage之後高可用的MogileFS就配置完成了。 

驗證方法如下:無論使用mogadm連接配接那一個節點,都可以看到節點中包含了三個主機

# mogadm --trackers=192.168.5.11:7001 host list
node1 [1]: alive
  IP:       192.168.5.11:7500

node2 [2]: alive
  IP:       192.168.5.12:7500

node3 [3]: alive
  IP:       192.168.5.13:7500

# mogadm --trackers=192.168.5.12:7001 host list
node1 [1]: alive
  IP:       192.168.5.11:7500

node2 [2]: alive
  IP:       192.168.5.12:7500

node3 [3]: alive
  IP:       192.168.5.13:7500

# mogadm --trackers=192.168.5.13:7001 host list
node1 [1]: alive
  IP:       192.168.5.11:7500

node2 [2]: alive
  IP:       192.168.5.12:7500

node3 [3]: alive
  IP:       192.168.5.13:7500      

上傳檔案驗證,由于隻是設定兩個複制份數,是以上傳的檔案會随機出現在兩個節點中。

# mogupload --trackers=192.168.5.11:7001 --domain=conffiles --key='/rpcbind' --file='/etc/rc.d/init.d/rpcbind' #這裡可以寫三個IP位址,也可以寫一個,IP中間用,分隔
# mogfileinfo --trackers=192.168.5.11:7001 --domain=conffiles --key='/rpcbind' 
- file: /rpcbind        #這裡可以寫三個IP位址,也可以寫一個,IP中間用,分隔
     class:              default
  devcount:                    2
    domain:            conffiles
       fid:                   13
       key:             /rpcbind
    length:                 2073
 - http://192.168.5.11:7500/dev1/0/000/000/0000000013.fid
 - http://192.168.5.13:7500/dev4/0/000/000/0000000013.fid      

七、Nginx反向代理MogileFS

Nginx預設不支援MogileFS的配置,需要在編譯nginx時指定nginx_mogilefs_module子產品才可以代理MogileFS

nginx的mogilefs子產品官方配置位址

http:

//www

.grid.net.ru

/nginx/mogilefs

.en.html

繼續閱讀