一、分佈式文件系統介紹html
二、CAP理論node
三、常見分佈式文件系統介紹mysql
四、MogileFS詳細介紹nginx
四、1MogileFS組成算法
四、2MogileFS特性
sql
五、MogileFS實現數據庫
五、1 node1配置Mariadb(過程略)vim
五、2 node1配置tracker
後端
五、3 node2配置storage
centos
五、4 node3配置storage
五、5 配置分佈式集羣
五、五、1 添加主機
五、五、2 添加設備
五、五、3 定義domain和class
五、6 驗證分佈式集羣
六、MogileFS高可用
六、1 node1配置storage
六、2 node2配置tracker
六、3 node3配置tracker
六、4 驗證MogileFS高可用
七、nginx反向代理MogileFS
七、1 安裝nginx
七、2 設置反向代理
七、3 設置負載均衡
定義:分佈式存儲系統是大量普通PC服務器經過Internet互聯,對外做爲一個總體提供存儲服務
特性:
· 可擴展:分佈式存儲系統能夠擴展到幾百臺至幾千臺的集羣規模,且隨着集羣規模的增加,系統總體性能表現爲線性增加;
· 低成本:分佈式存儲系統的自動容錯、自動負載均衡機制使其能夠構建在普通PC機之上;另外,線性擴展能力也使得增長、減小機器很是方便,能夠實現自動運維;
· 高性能:不管是針對整個集羣仍是單臺服務器,都要求分佈式系統具有高性能;
· 易用:分佈式存儲系統須要可以提供易用的對外接口;另外,也要求具有完善的監控、運維工具,並能方便的與其餘系統集成,如從Hadoop雲計算系統導入數據;
挑戰:在於數據、狀態信息的持久化,要求在自動遷移、自動容錯、併發讀寫的過程當中保證數據的一致性;
二、CAP理論
來自Berkerly的Eric Brewer教授提出了一個著名的CAP理論:一致性(Consistency),可用性(Availability)和分區容忍性(Tolerance of networkPartition)三者不能同時知足:
· C:讀操做老是能讀取到以前完成的寫操做結果,知足這個條件的系統成爲強一致系統,這裏的「以前」通常對同一個客戶端而言;
· A:讀寫操做在單臺機器發生故障的狀況下依然可以正常執行,而不須要等待發生故障的機器重啓或者其上的服務遷移到其餘機器;
· P:機器故障、網絡故障、機房停電等異常狀況下仍然可以知足一致性和可用性;
分佈式存儲系統要求可以自動容錯,即分區可容忍性老是須要知足的,所以,一致性和寫操做的可用性就不能同時知足了,須要在這兩者間權衡,是選擇不容許丟失數據,保持強一致,仍是容許少許數據丟失以得到更好的可用性;
GFS(Google File System):Google公司爲了知足本公司需求而開發的基於Linux的專有分佈式文件系統。因爲其元數據是存儲在內存中,因此在存儲文件數量上註定不可能達到海量存儲,主要是存儲大文件使用。
HDFS (Hadoop Distributed File System):Hadoop的重要組成之一,幾乎徹底山寨GFS
TFS:淘寶自主研發,將元數據存儲於關係型數據庫或其它高性能存儲中,從而能維護海量文件元數據;主要用於存儲海量小文件,維護難度大
GlusterFS:去中心化的設計模式;擅長處理單個大文件
Ceph:Linux內核級實現的文件系統,而已經被直接收錄進Linux內核;bug較多,穩定性不佳
MooseFS:持FUSE,相對比較輕量級,對master服務器有單點依賴,用perl編寫,性能相對較差,國內用的人比較多
MogileFS:元數據放在數據庫中,擅長處理海量小文件,性能較好
FastDFS:輕量級分佈式系統,擅長處理海量小文件
備註:此處介紹不是很詳細,若是須要詳細瞭解,能夠參考百度百科四、MogileFS詳細介紹
MogileFS組成的三個組件:
tracker:追蹤元數據 元數據訪問路由器
database:存儲元數據
storage:存儲數據
traker:
mogilefsd(守護進程),它的主要職責包括:
replication:節點間文件的複製;
deletion:刪除文件
queryworker:響應客戶請求的文件元數據訪問請求
reaper:在存儲失敗後將文件複製請求從新放置於隊列中
monitor:監測主機和設備的健康狀態
database:
存儲mogilefs的元數據,通常使用MySQL; 建議使用冗餘方案以保證其可用性;(MMM, MHA)
mogilefs專門提供了數據結構管理工具mogdbsetup;
storage:
mogstored(進程名),一個準備停當的mogstored節點可經過mogadm命令添加至如今的集羣中;
存儲節點需定義「設備(dev)」用做存儲空間;每一個「設備」在當前集羣都須要經過一個唯一的DevID來標識;
client:
客戶端用於與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:最小複製單元
文件屬性管理器
定義文件存儲在不一樣設備上的份數
IP地址配置狀況:
Node1:IP172.16.4.100
Node2:IP172.16.4.101
Node3:IP172.16.4.102
系統環境:
[root@node1 ~]# cat/etc/redhat-release CentOS release 6.6 (Final) [root@node2 ~]# uname -r 2.6.32-504.el6.x86_64 [root@node2 ~]# uname -m x86_64
Mariadb配置root用戶容許遠程鏈接
MariaDB [(none)]> GRANT ALL ON *.* TO'root'@'172.16.%.%' IDENTIFIED BY 'mogilefs' WITH GRANT OPTION; MariaDB [(none)]> FLUSH PRIVILEGES;
安裝以下軟件包,雖然只是配置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 #工具包 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 #依賴包
安裝命令以下
[root@node1 ~]# yum --nogpgcheck localinstall *.rpm
因爲node1是作tracker的,用到的主要程序包是MogileFS-Server-mogilefsd,其餘和配置tracker沒有太大關係,MogileFS-Server-mogilefsd生成的主要文件
[root@node1 ~]# rpm -ql MogileFS-Server-mogilefsd /etc/mogilefs/mogilefsd.conf #主配置文件 /etc/rc.d/init.d/mogilefsd #啓動腳本 /usr/bin/mogdbsetup #數據庫初始化工具 /usr/bin/mogilefsd #mogilefsd主進程
初始化MogileFS數據庫:使用能夠鏈接到Mariadb的用戶和密碼,建立一個MogileFS使用的數據庫和數據庫的管理用戶以及設置密碼
[root@node1~]# mogdbsetup --dbhost=172.16.4.100 --dbrootuser=root --dbrootpass=mogilefs --dbname=mogdb --dbuser=moguser--dbpass=mogpass This will attempt to setup or upgrade your MogileFSdatabase. 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 'mogdb'? [Y/n]: y Grant all privileges to user 'moguser', connectingfrom anywhere, to the mogilefs database 'mogdb'? [Y/n]: y
補充:可使用 --yes選項回答各類詢問爲yes。
驗證初始化Mariadb:登陸數據庫查看mogdb數據庫自動建立,並且庫中自動建立了一些表
MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mogdb | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.01 sec) MariaDB [(none)]> use mogdb; Database changed MariaDB [mogdb]> show tables; +----------------------+ | Tables_in_mogdb | +----------------------+ | 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 | +----------------------+
修改mogilefsd.conf文件設置鏈接Mariadb的用戶名和密碼,mogilefsd監聽的地址和端口,啓用的一些線程
[root@node1 ~]# vim /etc/mogilefs/mogilefsd.conf db_dsn = DBI:mysql:mogdb:host=172.16.4.100 #DBI:perl鏈接mysql的驅動,mysql數據庫類型,mogdb鏈接的數據庫,host不解釋 db_user = moguser #鏈接數據庫的用戶 db_pass = mogpass #鏈接數據庫的密碼 listen = 172.16.4.100:7001 #mogilefsd監聽的地址 conf_port = 7001 #監聽的端口 query_jobs = 10 #啓用的請求線程,爲10表示只能併發10個客戶端;注意客戶端不是用戶訪問量,而是鏈接使用mogilefsd的服務器 delete_jobs = 1 #用於刪除的線程 replicate_jobs = 5 #用於做複製的線程數量 reaper_jobs = 1 #在存儲失敗後將文件複製請求從新放置於隊列中的線程
設置完成啓動服務並驗證7001端口已經啓動
[root@node1 ~]# service mogilefsd start [root@node1 ~]# netstat -lntp | grep 7001 tcp 0 0 172.16.4.100:7001 0.0.0.0:* LISTEN 39558/mogilefsd
安裝以下軟件包,配置storage主要用到的軟件包是MogileFS-Server-mogstored
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 #依賴包
安裝命令以下
[root@node2 ~]# yum --nogpgcheck localinstall *.rpm
Mogstored依賴與perl-IO-AIO這個包,須要額外安裝,不然mogstored沒法正常啓動
[root@node2 ~]# yum -y install perl-IO-AIO
MogileFS-Server-mogstored生成的文件
[root@node2 ~]# rpm -ql MogileFS-Server-mogstored /etc/mogilefs/mogstored.conf #主配置文件 /etc/rc.d/init.d/mogstored #腳本文件 /usr/bin/mogautomount #自動掛載的工具 /usr/bin/mogstored #主程序
建立一個目錄準備存儲文件,而且設置屬主和屬組爲mogilefs,不然tracker節點會沒法讀取數據
[root@node2 ~]# mkdir /mogstore [root@node2 ~]# chown -R mogilefs.mogilefs/mogstore/
將存儲目錄掛載到單獨的分區
[root@node2 ~]# vim /etc/fstab /dev/sda4 /mogstore ext4 defaults 0 0 [root@node2 ~]# mount -a [root@node2 ~]# mount /dev/sda4 on /mogstore type ext4 (rw)
在存儲目錄建立設備編號目錄,注意此目錄各個節點不能重名
[root@node2 ~]# mkdir /mogstore/dev2
修改配置文件
[root@node2 ~]# vim /etc/mogilefs/mogstored.conf maxconns = 10000 #最大併發鏈接數 httplisten = 0.0.0.0:7500 #http協議監聽的端口 mgmtlisten = 0.0.0.0:7501 #管理監聽的端口 docroot = /mogstore #文件存儲的目錄
設置完成啓動服務,並驗證端口是否正常啓動
[root@node2 ~]# service mogstored start [root@node2 ~]# netstat -lntp | egrep"7500|7501" tcp 0 0 0.0.0.0:7500 0.0.0.0:* LISTEN 37119/mogstored tcp 0 0 0.0.0.0:7501 0.0.0.0:* LISTEN 37119/mogstored
安裝以下軟件包
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 #依賴包
安裝命令以下
[root@node3 ~]# yum --nogpgcheck localinstall *.rpm
Mogstored依賴與perl-IO-AIO這個包,因此須要額外安裝
[root@node3 ~]# yum -y install perl-IO-AIO
建立一個目錄準備存儲文件,並設置屬主和屬組爲mogilefs
[root@node3 ~]# mkdir /mogstore [root@node3 ~]# chown -R mogilefs.mogilefs/mogstore/
將存儲目錄掛載到單獨的分區
[root@node3 ~]# vim /etc/fstab /dev/sda4 /mogstore ext4 defaults 0 0 [root@node3 ~]# mount -a [root@node3 ~]# mount /dev/sda4 on /mogstore type ext4 (rw)
在存儲目錄建立設備編號目錄,注意此目錄各個節點不能重名
[root@node3 ~]# mkdir /mogstore/dev3
修改配置文件
[root@node3 ~]# vim /etc/mogilefs/mogstored.conf maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /mogstore
設置完成啓動服務,並驗證端口是否正常啓動
[root@node3 ~]# service mogstored start [root@node3 ~]# netstat -lntp | egrep"7500|7501" tcp 0 0 0.0.0.0:7500 0.0.0.0:* LISTEN 37119/mogstored tcp 0 0 0.0.0.0:7501 0.0.0.0:* LISTEN 37119/mogstored
查看MogileFS-Utils生成的命令,只列出經常使用的命令
[root@node1 ~]# rpm -ql MogileFS-Utils /usr/bin/mogadm #MogileFS管理工具,能夠實現將mogstored加入到mogilefsd /usr/bin/mogdelete #刪除文件 /usr/bin/mogfetch #獲取文件 /usr/bin/mogfileinfo #查看文件 /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 –help或者man mogadm能夠查看mogadm命令的詳細使用說明
向集羣中添加主機,將node2和node3添加到集羣中
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001host add node2 --ip=172.16.4.101 --status=alive [root@node1 ~]# mogadm --trackers=172.16.4.100:7001host add node3 --ip=172.16.4.102 --status=alive
add:表示添加主機
node2:表示主機名,這個能夠隨便寫
--ip:表示添加的主機地址
--status=alive:表示添加以後的狀態爲上線
添加完成查看主機列表已經有了主機
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001host list node2 [1]: alive IP: 172.16.4.101:7500 node3 [2]: alive IP: 172.16.4.102:7500
節點雖然添加完成了,可是還不能存儲數據,若是想存儲數據須要追蹤存儲節點上面的設備
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001device add node2 2 [root@node1 ~]# mogadm --trackers=172.16.4.100:7001device add node3 3
add:表示添加設備
Node2:節點名稱,必須和添加主機時保持一致
2:添加的dev設備編號
添加完成查看device列表就已經出現了設備
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001device list node2 [1]: alive used(G) free(G) total(G) weight(%) dev2: alive 0.042 27.866 27.908 100 node3 [2]: alive used(G) free(G) total(G) weight(%) dev3: alive 0.042 27.866 27.908 100
補充:一開始不當心將node3節點的設備,添加爲了dev4,而後由添加了dev3,結果node3就出現了dev3和dev4兩個設備
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001device add node3 4 [root@node1 ~]# mogadm --trackers=172.16.4.100:7001device list node2 [1]: alive used(G) free(G) total(G) weight(%) dev2: alive 0.000 0.000 0.000 100 node3 [2]: alive used(G) free(G) total(G) weight(%) dev3: alive 0.042 27.866 27.908 100 dev4: alive 0.042 27.866 27.908 100
刪除方法:這裏沒有deleted命令,須要使用mark將dev4標記爲dead狀態就刪除了
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001device mark node3 4 dead
定義名稱空間(domain):
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001domain add p_w_picpaths [root@node1 ~]# mogadm --trackers=172.16.4.100:7001domain add conffiles [root@node1 ~]# mogadm --trackers=172.16.4.100:7001domain list domain class mindevcount replpolicy hashtype -------------------- --------------------------------- ------------ ------- conffiles default 2 MultipleHosts() NONE p_w_picpaths default 2 MultipleHosts() NONE
domain:domain的名字
class:domain建立完成以後會自動建立一個class,全部的文件都存放在class中
mindevcount:最小複製單元;爲2表示上傳的文件最少存儲兩個副本
replpolicy:複製策略,MultipleHosts()表示多主機實現複製,這裏不用管爲默認便可
hashtype:class在命名時是使用哈希進行計算的,這裏表示哈希算法,NONE表示沒有使用哈希算法
定義class:
因爲建立domain會自動建立class,因此會出現class
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001class list domain class mindevcount replpolicy hashtype -------------------- --------------------------------- ------------ ------- conffiles default 2 MultipleHosts() NONE p_w_picpaths default 2 MultipleHosts() NONE
新添加一個class
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001class add p_w_picpaths nc1 --mindevcount=2 [root@node1 ~]# mogadm --trackers=172.16.4.100:7001class list domain class mindevcount replpolicy hashtype -------------------- --------------------------------- ------------ ------- conffiles default 2 MultipleHosts() NONE p_w_picpaths default 2 MultipleHosts() NONE p_w_picpaths nc1 2 MultipleHosts() NONE
這個時候分佈式文件系統就搭建好了,可使用mogupload命令上傳文件測試
[root@node1 ~]# mogupload--trackers=172.16.4.100:7001 --domain=p_w_picpaths --key='/1.jpg'--file='/usr/share/backgrounds/centos_1920x1200_logoonly.jpg'
--domain=p_w_picpaths:表示存儲到p_w_picpaths這個domain中
--key='/1.jpg':訪問文件的URL地址
--file:本地上傳的文件
查看上傳文件的信息,在node1和node2這兩個節點都有了文件
[root@node1 ~]# mogfileinfo--trackers=172.16.4.100:7001 --domain=p_w_picpaths --key='/1.jpg' - file: /1.jpg class: default devcount: 2 domain: p_w_picpaths fid: 2 key: /1.jpg length: 57592 -http://172.16.4.102:7500/dev3/0/000/000/0000000002.fid -http://172.16.4.101:7500/dev2/0/000/000/0000000002.fid
這個時候分別訪問下面的兩個URL就能夠出現剛剛上傳的圖片了
- http://172.16.4.102:7500/dev3/0/000/000/0000000002.fid
-http://172.16.4.101:7500/dev2/0/000/000/0000000002.fid
剛剛上傳了一個圖片,此次上傳一個文本文件試試
[root@node1 ~]# mogupload--trackers=172.16.4.100:7001 --domain=conffiles --key='/configures/fstab'--file='/etc/fstab' [root@node1 ~]# mogfileinfo --trackers=172.16.4.100:7001--domain=conffiles --key='/configures/fstab' - file: /configures/fstab class: default devcount: 2 domain: conffiles fid: 3 key: /configures/fstab length: 921 -http://172.16.4.102:7500/dev3/0/000/000/0000000003.fid -http://172.16.4.101:7500/dev2/0/000/000/0000000003.fid
分別訪問兩個URL路徑,查看文件均可以正常顯示
不光能夠上傳文件,還能夠下載文件,使用mogfetch指明domain是那個,key路徑,使用file在指明下載以後存儲到本地的那裏便可
[root@node1 ~]# mogfetch--trackers=172.16.4.100:7001 --domain=conffiles --key='/configures/fstab'--file='/root/fstab' [root@node1 ~]# ll /root/fstab -rw-r--r-- 1 root root 921 May 27 06:34 /root/fstab
Node1,node2,node3這三個節點否啓動mogilefsd和mogstored,使客戶端不管訪問那一個節點均可以獲取到數據,並且replpolicy設置最少2份,計算是一臺節點故障下線其餘節點也能夠繼續提供服務。
手動安裝mogstored的依賴包,若是不安裝此包,啓動mogstroed時端口不會正常啓動
[root@node1~]# yum install perl-IO-AIO
建立存儲目錄並掛載
[root@node1 ~]# mkdir /mogstore [root@node1 ~]# vim /etc/fstab /dev/sda4 /mogstore ext4 defaults 0 0 [root@node1 ~]# mount -a [root@node1 ~]# mount /dev/sda4 on /mogstore type ext4 (rw)
建立設備目錄並受權mogilefs用戶
[root@node1 ~]# mkdir /mogstore/dev1 [root@node1 ~]# chown -R mogilefs.mogilefs/mogstore/
修改配置文件,指定存儲目錄位置
[root@node1 ~]# vim /etc/mogilefs/mogstored.conf maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /mogstore
啓動服務
[root@node1 ~]# service mogstored start [root@node1 ~]# netstat -lntp | egrep"7500|7501" tcp 0 0 0.0.0.0:7500 0.0.0.0:* LISTEN 41087/mogstored tcp 0 0 0.0.0.0:7501 0.0.0.0:* LISTEN 41087/mogstored
配置完成以後使用mogadm命令將本身也添加到集羣中
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001host add node1 --ip=172.16.4.100 --status=alive [root@node1 ~]# mogadm --trackers=172.16.4.100:7001host list node2 [1]: alive IP: 172.16.4.101:7500 node3 [2]: alive IP: 172.16.4.102:7500 node1 [3]: alive IP: 172.16.4.100:7500
添加node1的設備到集羣中
[root@node1 ~]# mogadm --trackers=172.16.4.100:7001device add node1 1 [root@node1 ~]# mogadm --trackers=172.16.4.100:7001device list node2 [1]: alive used(G) free(G) total(G) weight(%) dev2: alive 0.043 27.865 27.908 100 node3 [2]: alive used(G) free(G) total(G) weight(%) dev3: alive 0.043 27.865 27.908 100 node1 [3]: alive used(G) free(G) total(G) weight(%) dev1: alive 0.042 27.866 27.908 100
因爲node2和node3節點須要配置mogilefsd須要把node1上面的配置文件直接拷貝過去,省的node2和node3節點修改
[root@node1 ~]# scp /etc/mogilefs/mogilefsd.conf172.16.4.101:/etc/mogilefs/ [root@node1 ~]# scp /etc/mogilefs/mogilefsd.conf 172.16.4.102:/etc/mogilefs/
因爲node1節點已經將配置文件拷貝過來了,因此直接修改配置文件的監聽地址便可,其餘選項無需修改
[root@node2 ~]# vim /etc/mogilefs/mogilefsd.conf listen = 172.16.4.101
設置完成啓動服務便可
[root@node2 ~]# service mogilefsd start [root@node2 ~]# netstat -lnt | grep 7001 tcp 0 0 172.16.4.101:7001 0.0.0.0:* LISTEN
同node2只須要修改監聽地址
[root@node3 ~]# vim /etc/mogilefs/mogilefsd.conf listen = 172.16.4.102
啓動服務便可
[root@node3 ~]# service mogilefsd start [root@node3 ~]# netstat -lnt | grep 7001 tcp 0 0 172.16.4.102:7001 0.0.0.0:* LISTEN
在三個節點各自配置好了tracker和storage以後高可用的MogileFS就配置完成了。
驗證方法以下:不管使用mogadm鏈接那一個節點,均可以看到節點中包含了三個主機
[root@node3 ~]# mogadm --trackers=172.16.4.100:7001host list node2 [1]: alive IP: 172.16.4.101:7500 node3 [2]: alive IP: 172.16.4.102:7500 node1 [3]: alive IP: 172.16.4.100:7500 [root@node3 ~]# mogadm --trackers=172.16.4.101:7001host list node2 [1]: alive IP: 172.16.4.101:7500 node3 [2]: alive IP: 172.16.4.102:7500 node1 [3]: alive IP: 172.16.4.100:7500 [root@node3 ~]# mogadm --trackers=172.16.4.102:7001host list node2 [1]: alive IP: 172.16.4.101:7500 node3 [2]: alive IP: 172.16.4.102:7500 node1 [3]: alive IP: 172.16.4.100:7500
上傳文件驗證,因爲只是設置兩個複製份數,因此上傳的文件會隨機出如今兩個節點中。
[root@node3 ~]# mogupload--trackers=172.16.4.100:7001,172.16.4.101:7001,172.16.4.102:7001--domain=conffiles --key='/issue' --file='/etc/issue' [root@node3 ~]# mogfileinfo --trackers=172.16.4.100:7001,172.16.4.101:7001,172.16.4.102:7001--domain=conffiles --key='/issue' - file: /issue class: default devcount: 2 domain: conffiles fid: 7 key: /issue length: 103 -http://172.16.4.100:7500/dev1/0/000/000/0000000007.fid -http://172.16.4.101:7500/dev2/0/000/000/0000000007.fid
拓撲圖:
Nginx IP地址:172.16.4.10
系統環境和node節點一致
Nginx默認不支持MogileFS的配置,須要在編譯nginx時指定nginx_mogilefs_module模塊才能夠代理MogileFS
nginx的mogilefs模塊官方配置地址
http://www.grid.net.ru/nginx/mogilefs.en.html
編譯安裝nginx
[root@nginx ~]# useradd nginx [root@nginx ~]# mkdir /var/tmp/nginx/client -p [root@nginx ~]# yum -y install pcre-devel [root@nginx ~]# tar xf nginx-1.6.2.tar.gz [root@nginx ~]# tar xf nginx_mogilefs_module-1.0.4.tar.gz #編譯nginx以前須要先解壓出來,編譯nginx的時候須要用 [root@nginx ~]# cd nginx-1.6.2
編譯配置,這裏須要指定MogileFS的模塊位置
./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=../nginx_mogilefs_module-1.0.4/ #編譯時必定要使用這一項指明mogilefs模塊的解壓目錄位置 make && make install
編譯完成提供nginx啓動腳本
[root@nginx ~]# cat /etc/init.d/nginx #!/bin/sh # # nginx - this script starts and stops the nginxdaemon # # 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.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() { echo -n$"Stopping $prog: " killproc$prog -QUIT retval=$? echo [ $retval-eq 0 ] && rm -f $lockfile return$retval } restart() { configtest || return $? 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}" exit2 esac
設置執行權限,並加入服務列表
[root@nginx ~]# chmod +x /etc/rc.d/init.d/nginx [root@nginx ~]# chkconfig --add nginx
啓動nginx服務
[root@nginx ~]# service nginx start [root@nginx ~]# netstat -lntp | grep 80 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 8841/nginx
修改nginx配置文件添加一個location
location /p_w_picpaths/ { mogilefs_tracker172.16.4.100:7001; mogilefs_domainp_w_picpaths; mogilefs_pass { proxy_pass$mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; }
設置完成重啓服務,配置生效
向存儲中上傳文件
[root@node1 ~]# mogupload --trackers=172.16.4.100:7001 --domain=p_w_picpaths--key="2.jpg" --file="/root/2.jpg" [root@node1 ~]# mogfileinfo --trackers=172.16.4.100:7001--domain=p_w_picpaths --key="2.jpg" - file: 2.jpg class: default devcount: 2 domain: p_w_picpaths fid: 8 key: 2.jpg length: 150255 -http://172.16.4.100:7500/dev1/0/000/000/0000000008.fid -http://172.16.4.102:7500/dev3/0/000/000/0000000008.fid
使用nginx訪問/p_w_picpaths/下的2.jpg,就能夠看到剛剛上傳的2.jpg文件
因爲後端有3個tracker服務器,因此可使用nginx的upstream實現負載均衡,配置方法以下所示:
upstream mogtrackers { server 172.16.4.100:7001; server172.16.4.101:7001; server172.16.4.102:7001; } server { 省略內容…… location /p_w_picpaths/ { mogilefs_tracker mogtrackers; mogilefs_domain p_w_picpaths; mogilefs_pass { proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; } }