一、關于MogileFS
MongileFS是一個由Perl開發的分布式檔案系統,遵循CAP理論,即Consistency:資料的一緻性;Availability:資料的可用性;Tolerance of network Partition:資料的容錯性;而這裡的MongileFS滿足了後倆者,也就是隻滿足資料的可用性和容錯性,對于大型網站,資料的可用性和容錯性要優先于資料的一緻性。
MongileFS使用一緻性hash來解決資料的可用性,使用虛拟節點來解決資料傾斜的問題;MongileFS特别适合存儲海量小檔案的資料,與之類似的分布式檔案系統還有:FastDFS,MooseFS等,也适合存儲海量小檔案。
MongileFS的特性:
1、應用層實作,不需要特殊的核心元件;
2、無單點失敗,MogileFS分布式檔案存儲系統安裝的三個元件(存儲節點、跟蹤器、跟蹤用的資料庫),均可運作在多個機器上,是以沒有單點失;
3、自動的檔案複制 — 基于不同的檔案“分類”,檔案可以被自動的複制到多個有足夠存儲空間的存儲4節點上,這樣可以滿足這個“類别”的最少複制要求;
4、簡單的命名空間 –檔案通過一個給定的key來确定,是一個全局的命名空間.你可以自己生成多個命名空間,隻要你願意,不過這樣可能在同一MogileFS中會造成key沖突;
5、不用共享任何東西 — MogileFS分布式檔案存儲系統不需要依靠昂貴的SAN來共享磁盤,每個機器隻用維護好自己的磁盤;
實作MogileFS分布檔案系統所需要的主機角色:
1、Tracker(MogileFSd 程序):這個是 MogileFS 的核心部分,他是一個排程器,MogileFSd 程序就是trackers程序程式,trackers 做了很多工作:Replication ,Deletion,Query,Reaper,Monitor 等等,這個是基于事件的( event-based ) 父程序/消息總線來管理所有來之于用戶端應用的互動(requesting operations to be performed),,包括将請求負載平衡到多個“query workers”中,然後讓 MogileFSd 的子程序去處理;
2、MySQL:用來存放 MogileFS 的中繼資料 (命名空間, 和檔案在哪裡),是Trackers 來操作和管理它,可以用mogdbsetup程式來初始化資料庫,因為資料庫儲存了MogileFS的所有中繼資料,建議做成HA架構;
3、Storage Nodes:實際檔案存放的地方,存儲節點是一個HTTP伺服器,用來做删除,存放,重命名等事情,任何WebDAV伺服器都可以, 不過推薦使用mogstored,MogileFSd 可以配置到兩個機器上使用不同端口,mogstored來進行所有的DAV操作和流量,IO監測, 并且你自己選擇的HTTP伺服器(預設為 perlbal)用來做GET操作給用戶端提供檔案。
MogileFS管理的幾個概念:
1、Domain:一個MogileFS可以有多個Domain,用來存放不同檔案(大小,類型),同一個Domain内key必須為一,不同Domain内,key可以相同;
2、Class:檔案屬性管理,定位檔案存儲在不同裝置上的份數;
二、MongileFS工作原理圖
<a href="http://s3.51cto.com/wyfs02/M00/23/E7/wKiom1NGZNiTKzaNAAD4rEDUBXs571.jpg" target="_blank"></a>
三、實驗環境
10.232.50.239 OS:CentOS 6.4 x86_64 node1.luojianlong.com
10.232.42.218 OS:CentOS 6.4 x86_64 node2.luojianlong.com
10.232.42.219 OS:CentOS 6.4 x86_64 node3.luojianlong.com
拓撲圖
首先,分别在node1,node2,node3上面安裝cpan以及依賴的包
1
2
3
<code>[root@node1 ~]</code><code># yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes cpan</code>
<code>[root@node2 ~]</code><code># yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes cpan</code>
<code>[root@node3 ~]</code><code># yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes cpan</code>
使用cpan指令安裝MogileFS::Server,MogileFS::Client,以及依賴的子產品,前提是主機能夠上網際網路
4
5
6
7
8
9
10
<code># 安裝過程中,如有提示安裝依賴的子產品,直接回答yes即可</code>
<code>[root@node1 ~]</code><code># cpan -i install MogileFS::Server</code>
<code>[root@node1 ~]</code><code># cpan -i install MogileFS::Client</code>
<code>[root@node1 ~]</code><code># cpan -i install MogileFS::Utils</code>
<code>[root@node2 ~]</code><code># cpan -i install MogileFS::Server</code>
<code>[root@node2 ~]</code><code># cpan -i install MogileFS::Client</code>
<code>[root@node2 ~]</code><code># cpan -i install MogileFS::Utils</code>
<code>[root@node3 ~]</code><code># cpan -i install MogileFS::Server</code>
<code>[root@node3 ~]</code><code># cpan -i install MogileFS::Client</code>
<code>[root@node3 ~]</code><code># cpan -i install MogileFS::Utils</code>
安裝完成以後,在node1上面安裝mysql
11
12
13
14
15
16
17
18
19
20
21
22
23
<code>[root@node1 ~]</code><code># useradd -r mysql</code>
<code>[root@node1 ~]</code><code># tar zxvf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/</code>
<code>[root@node1 ~]</code><code># cd /usr/local/</code>
<code>[root@node1 </code><code>local</code><code>]</code><code># ln -s mysql-5.5.33-linux2.6-x86_64 mysql</code>
<code>[root@node1 </code><code>local</code><code>]</code><code># cd mysql</code>
<code>[root@node1 mysql]</code><code># chown -R root.mysql ./*</code>
<code>[root@node1 mysql]</code><code># mkdir /mydata/data -p</code>
<code>[root@node1 mysql]</code><code># chown -R mysql.mysql /mydata/data/</code>
<code>[root@node1 mysql]</code><code># cp support-files/mysql.server /etc/rc.d/init.d/mysqld</code>
<code>[root@node1 mysql]</code><code># chmod +x /etc/rc.d/init.d/mysqld</code>
<code>[root@node1 mysql]</code><code># chkconfig --add mysqld</code>
<code>[root@node1 mysql]</code><code># chkconfig mysqld on</code>
<code>[root@node1 mysql]</code><code># cp support-files/my-large.cnf /etc/my.cnf</code>
<code>[root@node1 mysql]</code><code># ./scripts/mysql_install_db --user=mysql --datadir=/mydata/data</code>
<code>[root@node1 mysql]</code><code># vi /etc/my.cnf</code>
<code># 添加如下倆行</code>
<code>datadir = </code><code>/mydata/data</code>
<code>innodb_file_per_table = 1</code>
<code>[root@node1 mysql]</code><code># vi /etc/profile.d/mysql.sh</code>
<code>export</code> <code>PATH=</code><code>/usr/local/mysql/bin</code><code>:$PATH</code>
<code>[root@node1 mysql]</code><code># . /etc/profile.d/mysql.sh</code>
<code>[root@node1 mysql]</code><code># service mysqld start</code>
<code>Starting MySQL.... SUCCESS!</code>
建立Tracker連接配接mysql的遠端使用者
<code>mysql> grant all on *.* to </code><code>'root'</code><code>@</code><code>'%'</code> <code>identified by </code><code>'123456'</code><code>;</code>
<code>Query OK, 0 rows affected (0.00 sec)</code>
<code>mysql> flush privileges;</code>
配置Tracker
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<code>[root@node1 ~]</code><code># useradd -r mogilefs</code>
<code>[root@node1 ~]</code><code># mkdir /var/run/mogilefsd/ -p</code>
<code>[root@node1 ~]</code><code># chown -R mogilefs.mogilefs /var/run/mogilefsd</code>
<code>[root@node1 ~]</code><code># mkdir /etc/mogilefs/</code>
<code># 編輯配置檔案:/etc/mogilefs/mogilefsd.conf</code>
<code>[root@node1 ~]</code><code># vi /etc/mogilefs/mogilefsd.conf</code>
<code>db_dsn = DBI:mysql:mogilefs:host=10.232.50.239;port=3306;mysql_connect_timeout=5</code>
<code>db_user = mogile</code>
<code>db_pass = 123456</code>
<code>conf_port = 7001</code>
<code>listener_jobs = 5</code>
<code>node_timeout = 5</code>
<code>rebalance_ignore_missing = 1</code>
<code># 編寫mogilefsd啟動腳本</code>
<code>[root@node1 ~]</code><code># vi /etc/rc.d/init.d/mogilefsd</code>
<code>#!/bin/bash</code>
<code>#</code>
<code># mogilefsd - Startup script for the MogileFS tracker</code>
<code># chkconfig: - 85 15</code>
<code># description: MogileFS tracker</code>
<code># processname: mogilefsd</code>
<code># config: /etc/mogilefs/mogilefsd.conf</code>
<code># pidfile: /var/run/mogilefsd/mogilefsd.pid</code>
<code># Source function library.</code>
<code>. </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code>
<code># Path to the apachectl script, server binary, and short-form for messages.</code>
<code>lockfile=${LOCKFILE-</code><code>/var/lock/subsys/mogilefsd</code><code>}</code>
<code>RETVAL=0</code>
<code>prog=$(</code><code>which</code> <code>mogilefsd)</code>
<code>start() {</code>
<code> </code><code>ulimit</code> <code>-n 65535</code>
<code> </code><code>echo</code> <code>-n $</code><code>"Starting mogilefsd"</code>
<code> </code><code>su</code> <code>- mogilefs -c </code><code>"$prog -c /etc/mogilefs/mogilefsd.conf --daemon"</code>
<code> </code><code>RETVAL=$?</code>
<code> </code><code>[ $RETVAL = 0 ] && success && </code><code>touch</code> <code>${lockfile} || failure</code>
<code> </code><code>echo</code>
<code> </code><code>return</code> <code>$RETVAL</code>
<code>}</code>
<code>stop() {</code>
<code> </code><code>echo</code> <code>-n $</code><code>"Stopping mogilefsd"</code>
<code> </code><code>netstat</code> <code>-nlp|</code><code>grep</code> <code>"mogilefsd"</code><code>|</code><code>grep</code> <code>-</code><code>v</code> <code>grep</code><code>|</code><code>awk</code> <code>'{print $7}'</code><code>|</code><code>awk</code> <code>-F</code><code>"/"</code> <code>'{print $1}'</code><code>|</code><code>xargs</code> <code>kill</code> <code>-9</code>
<code> </code><code>[ $RETVAL = 0 ] && success && </code><code>rm</code> <code>-f ${lockfile} || failure</code>
<code>reload() {</code>
<code> </code><code>echo</code> <code>-n $</code><code>"Reloading mogilefsd: "</code>
<code> </code><code>killall mogilefsd -HUP</code>
<code> </code><code>[ $RETVAL = 0 ] && success || failure</code>
<code>case</code> <code>"$1"</code> <code>in</code>
<code> </code><code>start)</code>
<code> </code><code>start</code>
<code> </code><code>;;</code>
<code> </code><code>stop)</code>
<code> </code><code>stop</code>
<code> </code><code>status)</code>
<code> </code><code>status mogilefsd</code>
<code> </code><code>RETVAL=$?</code>
<code> </code><code>restart)</code>
<code> </code><code>sleep</code> <code>1</code>
<code> </code><code>reload)</code>
<code> </code><code>reload</code>
<code> </code><code>*)</code>
<code> </code><code>echo</code> <code>$</code><code>"Usage: mogilefsd {start|stop|restart|reload|status}"</code>
<code> </code><code>exit</code> <code>1</code>
<code>esac</code>
<code>exit</code> <code>$RETVAL</code>
<code>[root@node1 ~]</code><code># chmod +x /etc/rc.d/init.d/mogilefsd</code>
<code>[root@node1 ~]</code><code># chkconfig --add mogilefsd</code>
<code>[root@node1 ~]</code><code># chkconfig mogilefsd on</code>
<code># 初始化資料庫</code>
<code>[root@node1 ~]</code><code># mogdbsetup --dbhost=127.0.0.1 --dbrootuser=root --dbpass=123456 --dbname=mogilefs --dbuser=mogile --dbpassword=123456</code>
<code>This will attempt to setup or upgrade your MogileFS database.</code>
<code>It won't destroy existing data.</code>
<code>Run with --help </code><code>for</code> <code>more</code> <code>information. Run with --</code><code>yes</code> <code>to shut up these prompts.</code>
<code>Continue? [N</code><code>/y</code><code>]: y</code>
<code>Create</code><code>/Upgrade</code> <code>database name </code><code>'mogilefs'</code><code>? [Y</code><code>/n</code><code>]: y</code>
<code>Grant all privileges to user </code><code>'mogile'</code><code>, connecting from anywhere, to the mogilefs database </code><code>'mogilefs'</code><code>? [Y</code><code>/n</code><code>]: y</code>
<code>[root@node1 ~]</code><code># ln -s /usr/local/bin/mogilefsd /usr/bin/</code>
<code>[root@node1 ~]</code><code># ln -s /usr/local/bin/mogilefsd /usr/sbin/</code>
<code>[root@node1 ~]</code><code># service mogilefsd start</code>
<code>Starting mogilefsd [ OK ]</code>
<code>[root@node1 ~]</code><code># ss -anptl</code>
<code>Recv-Q Send-Q Local Address:Port Peer Address:Port</code>
<code>0 128 :::22 :::* </code><code>users</code><code>:((</code><code>"sshd"</code><code>,8066,4))</code>
<code>0 128 *:22 *:* </code><code>users</code><code>:((</code><code>"sshd"</code><code>,8066,3))</code>
<code>0 128 *:7001 *:* </code><code>users</code><code>:((</code><code>"mogilefsd"</code><code>,3444,6))</code>
<code>0 50 *:3306 *:* </code><code>users</code><code>:((</code><code>"mysqld"</code><code>,1003,11))</code>
<code># 啟動成功</code>
<code># 在node2,node3上面執行相同的操作,安裝mogilefsd,不需要初始化資料</code>
配置mogstored
<code># 編輯mogstored配置檔案</code>
<code>[root@node1 ~]</code><code># vi /etc/mogilefs/mogstored.conf</code>
<code>maxconns = 10000</code>
<code>httplisten = 0.0.0.0:7500</code>
<code>mgmtlisten = 0.0.0.0:7501</code>
<code>docroot = </code><code>/mogdata</code>
<code>[root@node1 ~]</code><code># mkdir /mogdata/dev1</code>
<code>[root@node1 ~]</code><code># chown -R mogilefs.mogilefs /mogdata/dev1</code>
<code># 編寫mogstored啟動腳本</code>
<code>[root@node1 ~]</code><code># vi /etc/rc.d/init.d/mogstored</code>
<code># mogstored - Startup script for the MogileFS storage</code>
<code># chkconfig: - 86 14</code>
<code># description: MogileFS storage</code>
<code># processname: mogstored</code>
<code># config: /etc/mogilefs/mogstored.conf</code>
<code># pidfile: /var/run/mogilefsd/mogstored.pid</code>
<code>lockfile=${LOCKFILE-</code><code>/var/lock/subsys/mogstored</code><code>}</code>
<code>configfile=</code><code>'/etc/mogilefs/mogstored.conf'</code>
<code>prog=$(</code><code>which</code> <code>mogstored)</code>
<code> </code><code>echo</code> <code>-n $</code><code>"Starting mogstored"</code>
<code> </code><code>su</code> <code>- mogilefs -c </code><code>"$prog -c $configfile --daemon"</code> <code>&> </code><code>/dev/null</code>
<code> </code><code>echo</code> <code>-n $</code><code>"Stopping mogstored"</code>
<code> </code><code>netstat</code> <code>-nlp|</code><code>grep</code> <code>"mogstored"</code><code>|</code><code>grep</code> <code>-</code><code>v</code> <code>grep</code><code>|</code><code>awk</code> <code>'{print $7}'</code><code>|</code><code>awk</code> <code>-F</code><code>"/"</code> <code>'{print $1}'</code><code>|</code><code>xargs</code> <code>kill</code> <code>-9</code>
<code> </code><code>echo</code> <code>-n $</code><code>"Reloading mogstored: "</code>
<code> </code><code>killall mogstored -HUP</code>
<code> </code><code>status mogstored</code>
<code> </code><code>echo</code> <code>$</code><code>"Usage: mogstored {start|stop|restart|reload|status}"</code>
<code>[root@node1 ~]</code><code># chmod +x /etc/rc.d/init.d/mogstored</code>
<code>[root@node1 ~]</code><code># chkconfig --add mogstored</code>
<code>[root@node1 ~]</code><code># chkconfig mogstored on</code>
<code>[root@node1 ~]</code><code># ln -s /usr/local/bin/mogstored /usr/bin/</code>
<code>[root@node1 ~]</code><code># ln -s /usr/local/bin/mogstored /usr/sbin/</code>
<code>[root@node1 ~]</code><code># service mogstored start</code>
<code>Starting mogstored [ OK ]</code>
<code>Recv-Q Send-Q Local Address:Port Peer Address:Port</code>
<code>0 128 *:7500 *:* </code><code>users</code><code>:((</code><code>"mogstored"</code><code>,5108,4))</code>
<code>0 128 *:7501 *:* </code><code>users</code><code>:((</code><code>"mogstored"</code><code>,5108,9))</code>
<code>0 128 :::22 :::* </code><code>users</code><code>:((</code><code>"sshd"</code><code>,8066,4))</code>
<code>0 128 *:22 *:* </code><code>users</code><code>:((</code><code>"sshd"</code><code>,8066,3))</code>
<code>0 128 *:7001 *:* </code><code>users</code><code>:((</code><code>"mogilefsd"</code><code>,3444,6))</code>
<code>0 50 *:3306 *:* </code><code>users</code><code>:((</code><code>"mysqld"</code><code>,1003,11))</code>
<code># node2,node3執行相同的操作,對應的存儲目錄為/mogdata/dev2,/mogdata/dev3</code>
在node2上面編譯安裝nginx
<code>[root@node2 ~]</code><code># yum -y groupinstall "Development Tools" "Server Platform Deveopment"</code>
<code>[root@node2 ~]</code><code># yum -y install openssl-devel pcre-devel</code>
<code>[root@node2 ~]</code><code># groupadd -r nginx</code>
<code>[root@node2 ~]</code><code># useradd -r -g nginx nginx</code>
<code># 解壓nginx的第三方子產品mogilefs子產品</code>
<code>[root@node2 ~]</code><code># unzip nginx-mogilefs-module-master.zip</code>
<code>[root@node2 ~]</code><code># tar zxvf nginx-1.4.2.tar.gz</code>
<code>[root@node2 ~]</code><code># cd nginx-1.4.2</code>
<code>[root@node2 nginx-1.4.2]</code><code># ./configure \</code>
<code>> --prefix=</code><code>/usr</code> <code>\</code>
<code>> --sbin-path=</code><code>/usr/sbin/nginx</code> <code>\</code>
<code>> --conf-path=</code><code>/etc/nginx/nginx</code><code>.conf \</code>
<code>> --error-log-path=</code><code>/var/log/nginx/error</code><code>.log \</code>
<code>> --http-log-path=</code><code>/var/log/nginx/access</code><code>.log \</code>
<code>> --pid-path=</code><code>/var/run/nginx/nginx</code><code>.pid \</code>
<code>> --lock-path=</code><code>/var/lock/nginx</code><code>.lock \</code>
<code>> --user=nginx \</code>
<code>> --group=nginx \</code>
<code>> --with-http_ssl_module \</code>
<code>> --with-http_flv_module \</code>
<code>> --with-http_stub_status_module \</code>
<code>> --with-http_gzip_static_module \</code>
<code>> --http-client-body-temp-path=</code><code>/var/tmp/nginx/client/</code> <code>\</code>
<code>> --http-proxy-temp-path=</code><code>/var/tmp/nginx/proxy/</code> <code>\</code>
<code>> --http-fastcgi-temp-path=</code><code>/var/tmp/nginx/fcgi/</code> <code>\</code>
<code>> --http-uwsgi-temp-path=</code><code>/var/tmp/nginx/uwsgi</code> <code>\</code>
<code>> --http-scgi-temp-path=</code><code>/var/tmp/nginx/scgi</code> <code>\</code>
<code>> --with-pcre \</code>
<code>> --add-module=</code><code>/root/nginx-mogilefs-module-master</code>
<code>[root@node2 nginx-1.4.2]</code><code># make && make install</code>
<code>[root@node2 nginx-1.4.2]</code><code># mkdir /var/tmp/nginx/client -p</code>
<code>[root@node2 nginx-1.4.2]</code><code># nginx</code>
Nginx 做為 MogileFS 的前端用戶端,我們使用Nginx來吐檔案,做前端的查詢代理時,我們需要使用到mogilefs的這個子產品,可以下載下傳這個子產品編譯進Nginx就行了,直接使用 ./configure -add-module=這個參數就可以了,最新的這個子產品的下載下傳位址是:https://github.com/vkholodkov/nginx-mogilefs-module
在node1上,使用mogadm添加節點
<code>[root@node1 ~]</code><code># mogadm host add 10.232.50.239 --ip=10.232.50.239 --status=alive</code>
<code>[root@node1 ~]</code><code># mogadm host add 10.232.42.218 --ip=10.232.42.218 --status=alive</code>
<code>[root@node1 ~]</code><code># mogadm host add 10.232.42.219 --ip=10.232.42.219 --status=alive</code>
<code>[root@node1 ~]</code><code># mogadm check </code>
<code>Checking trackers...</code>
<code> </code><code>127.0.0.1:7001 ... OK</code>
<code>Checking hosts...</code>
<code> </code><code>[ 1] 10.232.50.239 ... OK</code>
<code> </code><code>[ 2] 10.232.42.218 ... OK</code>
<code> </code><code>[ 3] 10.232.42.219 ... OK</code>
<code>Checking devices...</code>
<code> </code><code>host device size(G) used(G) </code><code>free</code><code>(G) use% ob state I</code><code>/O</code><code>%</code>
<code> </code><code>---- ------------ ---------- ---------- ---------- ------ ---------- -----</code>
<code> </code><code>---- ------------ ---------- ---------- ---------- ------</code>
<code> </code><code>total: 0.000 0.000 0.000 0.00%</code>
<code># 添加host成功</code>
為每個host添加device
<code>[root@node1 ~]</code><code># mogadm device add 10.232.50.239 1</code>
<code>[root@node1 ~]</code><code># mogadm device add 10.232.42.218 2</code>
<code>[root@node1 ~]</code><code># mogadm device add 10.232.42.219 3</code>
<code>[root@node1 ~]</code><code># mogadm check</code>
<code> </code><code>[ 1] dev1 7.472 2.443 5.029 32.69% writeable N</code><code>/A</code>
<code> </code><code>[ 2] dev2 7.472 1.839 5.633 24.61% writeable N</code><code>/A</code>
<code> </code><code>[ 3] dev3 7.472 1.647 5.825 22.04% writeable N</code><code>/A</code>
<code> </code><code>total: 22.416 5.928 16.488 26.45%</code>
<code># 添加成功</code>
添加domain
<code>[root@node1 ~]</code><code># mogadm domain add files</code>
<code>[root@node1 ~]</code><code># mogadm domain add images</code>
<code>[root@node1 ~]</code><code># mogadm domain list</code>
<code> </code><code>domain class mindevcount replpolicy hashtype</code>
<code>-------------------- -------------------- ------------- ------------ -------</code>
<code> </code><code>files default 2 MultipleHosts() NONE</code>
<code> </code><code>images default 2 MultipleHosts() NONE</code>
<code># 發現已經自動添加了default class</code>
上傳檔案測試
<code>[root@node1 ~]</code><code># mogupload --trackers=10.232.50.239 --domain=files --key='/fstab' --file='/etc/fstab'</code>
<code>[root@node1 ~]</code><code># mogfileinfo --trackers=10.232.50.239 --domain=files --key='/fstab'</code>
<code>- </code><code>file</code><code>: </code><code>/fstab</code>
<code> </code><code>class: default</code>
<code> </code><code>devcount: 3</code>
<code> </code><code>domain: files</code>
<code> </code><code>fid: 5</code>
<code> </code><code>key: </code><code>/fstab</code>
<code> </code><code>length: 463</code>
<code> </code><code>- http:</code><code>//10</code><code>.232.42.219:7500</code><code>/dev3/0/000/000/0000000005</code><code>.fid</code>
<code> </code><code>- http:</code><code>//10</code><code>.232.42.218:7500</code><code>/dev2/0/000/000/0000000005</code><code>.fid</code>
<code># 可以看到檔案被自動儲存為2個副本</code>
<code>[root@node1 ~]</code><code># curl http://10.232.42.218:7500/dev2/0/000/000/0000000005.fid</code>
<code>/dev/xvda1</code> <code>/ ext3 noatime,acl,user_xattr 1 1</code>
<code>/dev/xvdc</code> <code>swap swap defaults 0 0</code>
<code>proc </code><code>/proc</code> <code>proc defaults 0 0</code>
<code>sysfs </code><code>/sys</code> <code>sysfs noauto 0 0</code>
<code>debugfs </code><code>/sys/kernel/debug</code> <code>debugfs noauto 0 0</code>
<code>devpts </code><code>/dev/pts</code> <code>devpts mode=0620,gid=5 0 0</code>
<code># 可以正常通路</code>
模拟down掉一個節點,看檔案會不會丢失
<code>[root@node1 ~]</code><code># mogadm host mark 10.232.42.218 down</code>
<code> </code><code>[ 2] 10.232.42.218 ... skipping; status = down</code>
<code> </code><code>[ 1] dev1 7.472 2.443 5.029 32.70% writeable N</code><code>/A</code>
<code> </code><code>[ 3] dev3 7.472 1.648 5.824 22.05% writeable N</code><code>/A</code>
<code> </code><code>total: 14.944 4.091 10.853 27.37%</code>
<code>[root@node1 ~]</code><code># mogfileinfo --trackers=10.232.42.218 --domain=files --key='/fstab'</code>
<code> </code><code>devcount: 1</code>
<code># 發現檔案依然存在</code>
下面使用Nginx來替換storage nodes上 mogstored中的Perlbal
<code>[root@node2 ~]</code><code># vi /etc/nginx/nginx.conf</code>
<code># 添加如下</code>
<code> </code><code>upstream trackers {</code>
<code> </code><code>server 10.232.50.239:7001;</code>
<code> </code><code>server 10.232.42.218:7001;</code>
<code> </code><code>server 10.232.42.219:7001;</code>
<code> </code><code>location </code><code>/files/</code> <code>{</code>
<code> </code><code>mogilefs_tracker trackers;</code>
<code> </code><code>mogilefs_domain files;</code>
<code> </code><code>mogilefs_methods get;</code>
<code> </code><code>mogilefs_pass {</code>
<code> </code><code>proxy_pass $mogilefs_path;</code>
<code> </code><code>proxy_hide_header Content-Type;</code>
<code> </code><code>proxy_buffering off;</code>
<code> </code><code>}</code>
<code>[root@node2 ~]</code><code># nginx -s reload</code>
關于如上配置解釋一下,比如:
http://www.a.com/files/A6B00135E24AB17E043B9B5453762438.png
這個URL中的UUID是A6B00135E24AB17E043B9B5453762438.png.這時我們使用這個做key來存到MogileFS中就行,再結合rewrite,隻要key在url裡有,就能直接代理到後端的mogilefs,如果使用了多個tracker的話,要配置使用多個tracker來進行負載均衡和備份,可以直接配置tracker到upstrame裡面,然後後面配置tracker的連接配接時,直接加上mogilefs_tracker online_mogilefs就行了,如果你還想配置使用 mogilefs 的 Nginx 上傳,使用其中的 put 功能然後就不要安裝用戶端上傳送,就需要打個更新檔,上面的配置一樣,關鍵對于上傳的配置,需要給方法修改為mogilefs_methods PUT DETEL。
<code># 設定files domain的class複制份數為3</code>
<code>[root@node1 ~]</code><code># mogadm class modify files default --mindevcount=3</code>
<code># 上傳檔案</code>
<code>[root@node1 ~]</code><code># echo "9966" > /tmp/index11.html</code>
<code>[root@node1 ~]</code><code># mogupload --trackers=10.232.50.239 --domain=files --key='index11.html' --file='/tmp/index11.html'</code>
<code>[root@node1 ~]</code><code># mogfileinfo --trackers=10.232.50.239 --domain=files --key='index11.html'</code>
<code>- </code><code>file</code><code>: index11.html</code>
<code> </code><code>fid: 24</code>
<code> </code><code>key: index11.html</code>
<code> </code><code>length: 5</code>
<code> </code><code>- http:</code><code>//10</code><code>.232.42.218:7500</code><code>/dev2/0/000/000/0000000024</code><code>.fid</code>
<code> </code><code>- http:</code><code>//10</code><code>.232.50.239:7500</code><code>/dev1/0/000/000/0000000024</code><code>.fid</code>
<code> </code><code>- http:</code><code>//10</code><code>.232.42.219:7500</code><code>/dev3/0/000/000/0000000024</code><code>.fid</code>
<code># 發現有3個副本</code>
<code>[root@node2 ~]</code><code># curl http://10.232.42.218/files/index11.html</code>
<code>9966</code>
測試正常通路
下面模拟down掉一個節點
<code>[root@node1 ~]</code><code># mogadm host mark 10.232.50.239 down</code>
<code> </code><code>[ 1] 10.232.50.239 ... skipping; status = down</code>
<code> </code><code>[ 2] dev2 7.472 1.843 5.629 24.67% writeable N</code><code>/A</code>
<code> </code><code>[ 3] dev3 7.472 1.652 5.820 22.11% writeable N</code><code>/A</code>
<code> </code><code>total: 14.944 3.495 11.449 23.39%</code>
發現通路一切正常
如果想根據跨多機房多網段來複制不同class份數,需要安裝MogileFS::Network子產品
<code>[root@node1 ~]</code><code># cpan -i MogileFS::Network</code>
<code># 安裝完成後</code>
<code># 添加網段名稱,這裡添加2個</code>
<code>[root@node1 ~]</code><code># mogadm settings set network_zones near,far</code>
<code># 添加網段位址</code>
<code>[root@node1 ~]</code><code># mogadm settings set zone_near 10.0.0.0/8</code>
<code># 修改class屬性</code>
<code>[root@node1 ~]</code><code># mogadm class modify files default --replpolicy "HostsPerNetwork(near=2)"</code>
<code># 發現修改生效</code>
<code>[root@node1 ~]</code><code># mogadm class list</code>
<code> </code><code>files default 2 HostsPerNetwork(near=2) NONE</code>
<code> </code><code>files index 3 MultipleHosts() NONE</code>
<code># 這裡就實作了根據網段不同複制不同的class數量</code>
注意:如果是多個tracker的話,每個tracker主機上都需要安裝MogileFS::Network子產品。
常見問題及解決方法:
如果遇到class的devcount始終為1,修改class的mindevcount也無效的話,可以設定如下:
<code>[root@node1 ~]</code><code># perl -MSys::Syscall -e 'print $Sys::Syscall::VERSION'</code>
<code>0.25</code>
<code># 顯示為0.25版本,這就會有問題</code>
<code>[root@node1 ~]</code><code># cpanm http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz</code>
<code>0.23</code>
<code># 降級為0.23的版本就能解決次問題了</code>
到此,MogileFS, nginx-mogilefs高可用分布式檔案系統配置完成。
本文轉自ljl_19880709 51CTO部落格,原文連結:http://blog.51cto.com/luojianlong/1393547,如需轉載請自行聯系原作者