一、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建立通信,完成數據存取;
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,是最小複製單位、最小調度單元,是多個文件合起來組成的。
本次試驗架構:
配置服務順序:
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
參考架構可以如下:
二、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
(三)修改配置文件
[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 *:*