分佈式文件存儲系統 mogilefs 的使用(1)


一、mogilefs簡介
       mogilefs是一種分佈式存儲(不可掛載,通過API調用或專門客戶端)的解決方案,可存儲海量圖片、靜態文件。
       mogilefs的相關程序是用perl語言編寫,元數據存儲在關係型數據庫中(國內有人用C語言將mogilefs重寫的程序叫做FastDFS,後者的元數據是存儲在內存中的)


mogilefs的基本組成結構:
     (1) tracker:追蹤器,從database中追蹤用戶請求數據的元數據
            與客戶端通過http協議通信,RESTful風格。
            提供mogilefsd(守護進程),主要職責包括:
                 ① replication:節點間文件的複製
                 ② deletion:刪除文件
                 ③ queryworker:響應客戶請求的文件元數據訪問請求
                 ④ reaper:在存儲失敗後將文件複製請求重新放置於隊列中
                 ⑤ monitor:監測主機和設備的健康狀態
  
      (2) database:
              存儲mogilefs的元數據(存儲數據的內容、大小、存儲的節點等非數據內容信息),一般使用MySQL;建議使用冗餘方案以保證其可用性(如MMM,MHA)
             mogilefs專門提供了數據結構管理工具mogdbsetup(功用:初始化MySQL、管理元數據)
 
       (3) storage:存儲數據,數據副本冗餘量默認是2個(可修改)
              mogstored(進程名),一個準備停當的mogstored節點可通過mogadm命令添加至現在的集羣中;
              存儲節點需要定義“設備(dev)”用作存儲空間:每個“設備”在當前集羣都需要通過一個唯一的DevID來標識;
        (4)client:
              客戶端用於與mogilefs建立通信,完成數據存取;

            wKiom1WOxgGivK2ZAAGTlCiFZ60793.jpg   


mogilefs特性:
         (1)工作於應用層:無需特殊核心組件;
         (2)無單點;
         (3)自動完成文件複製;
           (由tracker指揮storage自動完成)
         (4)傳輸無需特殊協議(使用http或nfs);
         (5)使用簡單名稱空間機制來完成複製;
         (6)不在任何節點之間共享任何數據;
         (7)non-RAID
         (8)不能追加寫、隨機寫
         (9)Tracker Client傳輸(Mogilefsd),管理數據複製、刪除、查詢、修復以及監控
         (10)數據通過HTTP/WebDAV服務上傳到Storage node(mogstored)
         (11)MySQL存儲MofileFS元數據(命名空間、位置)

mogilefs所存儲數據的存儲結構:
         ① domain: name space,命名空間 ,key的名字空間
          一個mogilefs可以有多個domain,是一種路徑映射,類似於目錄,同一個domain內key(文件名)唯一,不同domain內的key可以相同
          實際應用中可以將不同的類別文件存儲在不同的domain中
         ② class: 最小複製單元


    定位文件: 先定位 domain,再定位 fid
    一個domain內 可以有多個class,是最小複製單位、最小調度單元,是多個文件合起來組成的。


本次試驗架構:


             wKioL1WOyCuAgZjSAAE9C3yQUh0121.jpg


配置服務順序:
 node1上安裝mariadb-5.5.43-linux-x86_64-->在node1、node2、node3上安裝tracker --> 在node1、node2、node3上安裝mogstored --> 在node2上安裝nginx做反向代理


本次試驗只是做mogilefs的練習,未對元數據的存儲做高可用。


對mariadb做高可用參考:
http://ctrry.blog.51cto.com/9990018/1658665
參考架構可以如下:


            wKiom1WOxn_xcK2EAAGi-2qJI2o570.jpg


二、mariadb數據庫及分區及mogstored專用數據存儲分區的準備


(一)準備磁盤分區:


在node1、node2、node3上執行下面創建新分區的步驟:

# fdisk /dev/sda
 ……
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        7859    62914560   8e  Linux LVM
/dev/sda4            7859       14386    52435161    5  Extended
/dev/sda5            7859        9164    10489414+  8e  Linux LVM          10G
/dev/sda6            9165       10470    10490413+  8e  Linux LVM         10G
# partx -a /dev/sda
# partx -a /dev/sda


# bash mogilefs.sh
 

 #!/bin/bash
 #
 pvcreate /dev/sda5
 vgcreate myvg5 /dev/sda5
 lvcreate -L 10G -n maria myvg5
 mke2fs -t ext4 -L MARIA /dev/myvg5/maria
 mkdir -p /mydata
 mkdir -p /mogstore
 
 pvcreate /dev/sda6
 vgcreate myvg6 /dev/sda6
 lvcreate -L 10G -n mogstore myvg6
 mke2fs -t ext4 -L MOGSTORE /dev/myvg6/mogstore
 
 echo "LABEL=MARIA             /mydata                 ext4    defaults        0 0" >> /etc/fstab
 echo "LABEL=MOGSTORE          /mogstore                  ext4    defaults        0 0" >> /etc/fstab
 
 mount -a
 mount


 
不安裝mariadb的節點上可以將少創建一個分區


(二)在node1上安裝mariadb

 # lftp 172.16.0.1/pub/Sources/sources/mariadb
 lftp 172.16.0.1:/pub/Sources/sources/mariadb> get mariadb-5.5.43-linux-x86_64.tar.gz

# bash -x mariainstall.sh
腳本內容如下:
 

 #!/bin/bash
 #
 groupadd -r -g 306 mysql
 useradd -r -g mysql -u 306 mysql
 
 tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local
 cd /usr/local
 ln -s /usr/local/mariadb-5.5.43-linux-x86_64 mysql
 chown -R root:mysql /usr/local/mysql/*
 
 cd mysql
 mkdir /mydata/data
 ./scripts/mysql_install_db --datadir=/mydata/data  --skip-name-resolve --basedir=/usr/local/mysql --user=mysql
 chown -R mysql:mysql /mydata
 
 cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
 
 mkdir /etc/mysql
 cp ./support-files/my-large.cnf /etc/mysql/my.cnf
 
 echo "export PATH=/usr/local/mysql/bin:$PATH" > /etc/profile.d/mysqld.sh
 . /etc/profile.d/mysqld.sh
 
 ln -s /usr/local/mysql/include/ /usr/include/mysql
 
 vim /etc/mysql/my.cnf


  添加或修改下面4項:
  

thread_concurrency = 2
  datadir = /mydata/data
  skip_name_resolve = on
  innodb_file_per_table = on


  
# service mysqld start
# /usr/local/mysql/bin/mysql_secure_installation
根據提示操作,第一次是需要輸入登錄密碼,但第一次是沒有設置得,直接回車就OK了。


三、安裝tracker和mogstored

安裝mogilefs有兩種方式:
一是自己尋找到mogilefs相應的rpm包安裝;
二是連到perl.can網,直接通過“cpan> install module::name”形式自動編譯安裝。
此次採用rpm包安裝。

在教室環境中,下載位置爲:
# lftp 172.16.0.1:/pub/Sources/6.x86_64/mogilefs>
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 提供mogstored
MogileFS-Utils-2.19-1.el6.noarch.rpm
perl-MogileFS-Client-1.14-1.el6.noarch.rpm  客戶端調用API做開發時才需要的組件,被其他組件依賴
perl-Net-Netmask-1.9015-8.el6.noarch.rpm  實現機架感知能力組件
perl-Perlbal-1.78-1.el6.noarch.rpm  被依賴組件

下載後下面的程序包並全部安裝:

[root@node1 mogilefs]# lsMogileFS-Server-2.46-2.el6.noarch.rpm  perl-MogileFS-Client-1.14-1.el6.noarch.rpm  MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm  perl-Net-Netmask-1.9015-8.el6.noarch.rpm  MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  perl-Perlbal-1.78-1.el6.noarch.rpm  MogileFS-Utils-2.19-1.el6.noarch.rpm
[root@node1 mogilefs]# yum localinstall -y --nogpgcheck *.rpm
……
Installed:  MogileFS-Server.noarch 0:2.46-2.el6   MogileFS-Server-mogilefsd.noarch 0:2.46-2.el6      MogileFS-Server-mogstored.noarch 0:2.46-2.el6   MogileFS-Utils.noarch 0:2.19-1.el6      perl-MogileFS-Client.noarch 0:1.14-1.el6     perl-Net-Netmask.noarch 0:1.9015-8.el6    perl-Perlbal.noarch 0:1.78-1.el6                        
Dependency Installed:  perl-BSD-Resource.x86_64 0:1.29.03-3.el6      perl-DBD-MySQL.x86_64 0:4.013-3.el6      perl-Danga-Socket.noarch 0:1.61-5.el6     perl-IO-stringy.noarch 0:2.110-10.1.el6      perl-Sys-Syscall.noarch 0:0.23-1.el6                    
Complete!

在mogstored的節點上都需要安裝上perl-IO-AIO程序包,這是被隱式依賴的包:
[root@node1 mogilefs]# yum install -y perl-IO-AIO

……
Installed:  perl-IO-AIO.x86_64 0:3.71-2.el6                                                                                      
Dependency Installed:  perl-common-sense.noarch 0:3.5-1.el6                                                                                 
Complete!

在node2和node3上也做 同樣安裝。
生成文件說明:
[root@node1 mogilefs]# rpm -ql MogileFS-Server

(contains no files)


[root@node1 mogilefs]# rpm -ql MogileFS-Server-mogilefsd

/etc/mogilefs/mogilefsd.conf  #tracker的配置文件
/etc/rc.d/init.d/mogilefsd #tracker服務腳本
/usr/bin/mogdbsetup # 初始化mariadb數據庫的程序文件
/usr/bin/mogilefsd  #主程序文件
/usr/share/man/man1/mogilefsd.1.gz  #各種幫助文檔文件
/usr/share/man/man3/MogileFS::Checksum.3pm.gz
……
/usr/share/perl5/vendor_perl/MogileFS/Checksum.pm  #各種相關的庫文件
/usr/share/perl5/vendor_perl/MogileFS/Class.pm
……
/usr/share/perl5/vendor_perl/MogileFS/makedocs.pl
/var/run/mogilefsd   #運行時臨時文件存放位置,如pid文件


[root@node1 mogilefs]# rpm -ql MogileFS-Utils

/usr/bin/mogadm # 對mogilefs做全面管理的程序,如健康檢測、查看狀態、主機管理、設備管理、domain管理、class管理、從節點管理、文件系統管理、數據均衡管理、設置mogilefs工作特性
/usr/bin/mogdelete #刪除文件工具
/usr/bin/mogfetch #下載文件工具
/usr/bin/mogfiledebug
/usr/bin/mogfileinfo
/usr/bin/moglistfids # 列出所有fid文件工具
/usr/bin/moglistkeys
/usr/bin/mogrename #重命名工具
/usr/bin/mogstats # 
/usr/bin/mogtool
/usr/bin/mogupload #上傳文件工具
/usr/share/man/man1/mogadm.1.gz # 各種幫助文檔
……
/usr/share/man/man3/MogileFS::Utils.3pm.gz
/usr/share/perl5/MogileFS/Utils.pm # 所用到的模塊文件

[root@node1 mogilefs]# rpm -ql MogileFS-Server-mogstored

/etc/mogilefs/mogstored.conf #配置文件
/etc/rc.d/init.d/mogstored  # 服務腳本
/usr/bin/mogautomount # 自動掛載程序
/usr/bin/mogstored #守護進程程序
/usr/share/man/man1/mogautomount.1.gz
/usr/share/man/man1/mogstored.1.gz
/usr/share/perl5/vendor_perl/Mogstored/ChildProcess #大量模塊文件
/usr/share/perl5/vendor_perl/Mogstored/ChildProcess.pm
……
/usr/share/perl5/vendor_perl/Mogstored/TaskQueue.pm


[root@node1 mogilefs]# rpm -ql perl-MogileFS-Client

/usr/share/man #幫助文檔
/usr/share/man/man3
/usr/share/man/man3/MogileFS::Client.3pm.gz
/usr/share/perl5/MogileFS/Admin.pm #提供所需的庫文檔
/usr/share/perl5/MogileFS/Backend.pm
/usr/share/perl5/MogileFS/Client.pm
/usr/share/perl5/MogileFS/ClientHTTPFile.pm
/usr/share/perl5/MogileFS/NewHTTPFile.pm

[root@node1 mogilefs]# rpm -ql perl-Perlbal

/usr/share/man/man3 # 提供大量幫助文檔
……
/usr/share/man/man3/Perlbal::Util.3pm.gz
/usr/share/perl5/Perlbal.pm  # 提供大量模塊文件
/usr/share/perl5/Perlbal/AIO.pm
……
/usr/share/perl5/Perlbal/ManageCommand.pm
/usr/share/perl5/Perlbal/Manual
/usr/share/perl5/Perlbal/Manual.pod
/usr/share/perl5/Perlbal/Manual/Configuration.pod
……
/usr/share/perl5/Perlbal/Manual/WebServer.pod
/usr/share/perl5/Perlbal/Plugin
/usr/share/perl5/Perlbal/Plugin/AccessControl.pm
……
/usr/share/perl5/Perlbal/Plugin/XFFExtras.pm
/usr/share/perl5/Perlbal/Pool.pm
/usr/share/perl5/Perlbal/ReproxyManager.pm
/usr/share/perl5/Perlbal/Service.pm
/usr/share/perl5/Perlbal/Socket.pm
/usr/share/perl5/Perlbal/SocketSSL.pm
/usr/share/perl5/Perlbal/TCPListener.pm
/usr/share/perl5/Perlbal/Test
/usr/share/perl5/Perlbal/Test.pm
/usr/share/perl5/Perlbal/Test/WebClient.pm
/usr/share/perl5/Perlbal/Test/WebServer.pm
/usr/share/perl5/Perlbal/UploadListener.pm
/usr/share/perl5/Perlbal/Util.pm

四、tracker配置


tracker配置之前需要先配置好mariadb的對用戶的授權,然後對數據庫做初始化。
(一)數據庫授權

[root@node1 ~]# mysql -uroot -h127.0.0.1 -p

Enter password: 

MariaDB [(none)]> grant all on *.* to 'root'@'172.16.20.%' identified by '123' with grant option;
Query OK, 0 rows affected (0.42 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.07 sec)

MariaDB [(none)]> \q

(二)初始化數據庫
    

     查看幫助說明
[root@node1 ~]# mogdbsetup --help


根據自己需要選擇參數,初始化數據庫:
[root@node1 ~]# mogdbsetup --dbhost=172.16.20.50 --dbrootuser=root --dbrootpass=123 --dbname=mogdb --dbuser=moguser --dbpass=mogpass --yes
其中dbhost是遠程主機的IP地址(需要遠程主機設定了skip-name-resolve),dbroot和dbrootpass是遠程主機的授權的允許遠程登錄數據庫的賬號和密碼(上面剛授權的),dbname、dbuserdbpass是我們這次初始化需要創建的存儲元數據的新數據庫名稱、使用用戶、使用密碼。


查看初始化創建的數據庫:

# mysql -umoguser -h172.16.20.50 -p


            wKiom1WOxqWA3aBCAAJ_IfLAfwM530.jpg


(三)修改配置文件


[root@node1 ~]# cp /etc/mogilefs/mogilefsd.conf{,.bak}
[root@node1 ~]# vim /etc/mogilefs/mogilefsd.conf
 

# Enable daemon mode to work in background and use syslog採用守護進程模式運行於後臺並使用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:數據庫類型:元數據數據庫名:所在主機IP
 db_dsn = DBI:mysql:mogdb:host=172.16.20.50
 db_user = moguser
 db_pass = mogpass
 # IP:PORT to listen on for mogilefs client requests
 listen = 172.16.20.50:7001
 # Optional, if you don't define the port above.
 conf_port = 7001
 # 默認啓動時的查詢線程數,根據需要修改
 query_jobs = 10
 # 默認啓動時的刪除線程數,根據需要修改
 delete_jobs = 2
 # 默認啓動時的複製線程數,根據需要修改
 replicate_jobs = 5
 # 默認啓動時的reaper線程數,這個數值是不需要修改的
 # (you don't usually need to increase this)
 reaper_jobs = 1
 ……
 # Allow replication to use the secondary node get port,
 # if you have apache or similar configured for GET's
 #repl_use_get_port = 1  這個是有主從複製時需要設置的參數


      啓動服務:
 [root@node1 ~]# service mogilefsd start
 Starting mogilefsd                                         [  OK  ]
 [root@node1 ~]# ss -tnl | grep 7001
 LISTEN     0      128            172.16.20.50:7001                     *:*   

五、mogstored的配置


(一)三個mogstored節點提供dev目錄


[root@node1 mogilefs]# mkdir /mogstore/dev1
[root@node2 mogilefs]# mkdir /mogstore/dev2
[root@node3 mogilefs]# mkdir /mogstore/dev3


(二)三個節點上都修改mogstored的配置文件:


        只需要修改最後一行的文件存儲位置爲新建分區即可
# 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  ]


# ss -tnl | grep "750"

LISTEN     0      128                       *:7500                     *:*     
LISTEN     0      128                       *:7501                     *:*





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