天天看點

基于mogileFS搭建分布式檔案系統--海量小檔案的存儲利器

一、分布式檔案系統

   1.簡介

   分布式檔案系統(Distributed File System)是指檔案系統管理的實體存儲資源不一定直接連接配接在本地節點上,而是通過計算機網絡與節點相連。分布式檔案系統的設計基于客戶機/伺服器模式。一個典型的網絡可能包括多個供多使用者通路的伺服器。另外,對等特性允許一些系統扮演客戶機和伺服器的雙重角色。例如,使用者可以“發表”一個允許其他客戶機通路的目錄,一旦被通路,這個目錄對客戶機來說就像使用本地驅動器一樣。

   當下我們處在一個網際網路飛速發展的資訊社會,在海量并發連接配接的驅動下每天所産生的資料量必然以幾何方式增長,随着資訊連接配接方式日益多樣化,資料存儲的結構也随着發生了變化。在這樣的壓力下使得人們不得不重新審視大量資料的存儲所帶來的挑戰,例如:資料采集、資料存儲、資料搜尋、資料共享、資料傳輸、資料分析、資料可視化等一系列問題。

   傳統存儲在面對海量資料存儲表現出的力不從心已經是不争的事實,例如:縱向擴充受陣列空間限制、橫向擴充受交換裝置限制、節點受檔案系統限制。

      然而分布式存儲的出現在一定程度上有效的緩解了這一問題,之是以稱之為緩解是因為分布式存儲在面對海量資料存儲時也并非十全十美毫無壓力,依然存在的難點與挑戰例如:節點間通信、資料存儲、資料空間平衡、容錯、檔案系統支援等一系列問題仍處在不斷摸索和完善中。

   2.分布式檔案系統的一些解決方案

Google Filesystem

适合存儲海量大個檔案,中繼資料存儲與記憶體中

HDFS(Hadoop Filesystem)

GFS的山寨版,适合存儲大量大個檔案

TFS(Taobao Filesystem)

淘寶的檔案系統,在名稱節點上将中繼資料存儲與關系資料庫中,檔案數量不在受限于名稱節點的内容空間,可以存儲海量小檔案

Lustre

Oracle開發的企業級分布式系統,較重量級

MooseFS

基于FUSE的格式,可以進行挂載使用

MogileFS

擅長存儲海量的小資料,中繼資料存儲與關系型資料庫中

二、MogileFS

MogileFS是一個開源的分布式檔案系統,用于組建分布式檔案叢集,由LiveJournal旗下DangaInteractive公司開發,Danga團隊開發了包括 Memcached、MogileFS、Perlbal等不錯的開源項目:(注:Perlbal是一個強大的Perl寫的反向代理伺服器)。MogileFS是一個開源的分布式檔案系統。

   目前使用 MogileFS 的公司非常多,比如國外的一些公司,日本前幾名的公司基本都在使用這個.

國内所知道的使用 MogileFS 的公司有圖檔托管網站 yupoo又拍,digg, 洋芋, 豆瓣,1 号店, 大衆點評,搜狗,安居客等等網站.基本很多網站容量,圖檔都超過 30T 以上。

   2.MogileFS特性

     1) 應用層提供服務,不需要使用核心元件

     2)無單點失敗,主要有三個元件組成,分為tracker(跟蹤節點)、mogstore(存儲節點)、database(資料庫節點)

     3)自動複制檔案,複制檔案的最小機關不是檔案,而是class

     4)傳輸中立,無特殊協定,可以通過NFS或HTTP實作通信

     5)簡單的命名空間:沒有目錄,直接存在與存儲空間上,通過域來實作

     6)不用共享任何資料

   3.MogileFS的組成

     1)Tracker--跟蹤器,排程器

        MogileFS的核心,是一個排程器,mogilefsd程序就是trackers程序程式,trackers的主要職責有:删除資料、複制資料、監控、查詢等等.這個是基于事件的( event-based ) 父程序/消息總線來管理所有來之于用戶端應用的互動(requesting operations to be performed), 包括将請求負載平衡到多個"query workers"中,然後讓 mogilefs的子程序去處理.

       mogadm,mogtool的所有操作都要跟trackers打交道,Client的一些操作也需要定義好trackers,是以最好同時運作多個trackers來做負載均衡.trackers也可以隻運作在一台機器上,使用負載均衡時可以使用搞一些簡單的負載均衡解決方案,如haproxy,lvs,nginx等,

       tarcker的配置檔案為/etc/mogilefs/mogilefsd.conf,監聽在TCP的7001端口

     2)Database--資料庫部分

         主要用來存儲mogilefs的中繼資料,所有的中繼資料都存儲在資料庫中,是以,這個資料相當重要,如果資料庫挂掉,所有的資料都不能用于通路,是以,建議應該對資料庫做高可用

     3)mogstored--存儲節點

       資料存儲的位置,通常是一個HTTP(webDAV)伺服器,用來做資料的建立、删除、擷取,任何 WebDAV 伺服器都可以, 不過推薦使用 mogstored . mogilefsd可以配置到兩個機器上使用不同端口… mogstored 來進行所有的 DAV 操作和流量,IO監測, 并且你自己選擇的HTTP伺服器(預設為 perlbal)用來做 GET 操作給用戶端提供檔案.

       典型的應用是一個挂載點有一個大容量的SATA磁盤. 隻要配置完配置檔案後mogstored程式的啟動将會使本機成為一個存儲節點.當然還需要mogadm這個工具增加這台機器到Cluster中.

       配置檔案為/etc/mogilefs/mogstored.conf,監聽在TCP的7500端口

  4.基本工作流程

   應用程式請求打開一個檔案 (通過RPC 通知到 tracker, 找到一個可用的機器). 做一個 “create_open” 請求.

   tracker 做一些負載均衡(load balancing)處理,決定應該去哪兒,然後給應用程式一些可能用的位置。

   應用程式寫到其中的一個位置去 (如果寫失敗,他會重新嘗試并寫到另外一個位置去).

   應用程式 (client) 通過”create_close” 告訴tracker檔案寫到哪裡去了.

   tracker 将該名稱和域命的名空間關聯 (通過資料庫來做的)

   tracker, 在背景, 開始複制檔案,知道他滿足該檔案類别設定的複制規則

   然後,應用程式通過 “get_paths” 請求 domain+key (key == “filename”) 檔案, tracker基于每一位置的I/O繁忙情況回複(在内部經過 database/memcache/etc 等的一些抉擇處理), 該檔案可用的完整 URLs位址清單.

   應用程式然後按順序嘗試這些URL位址. (tracker’持續監測主機和裝置的狀态,是以不會傳回死連接配接,預設情況下他對傳回清單中的第一個元素做雙重檢查,除非你不要他這麼做..)

三、Nginx+mogilefs的實作

   1.拓撲圖

<a href="http://s3.51cto.com/wyfs02/M02/26/EB/wKioL1NumHjSeFsZAACZ6ZyV-8Y920.jpg" target="_blank"></a>

     說明:1.使用者通過URL通路前端的nginx

           2.nginx根據特定的挑選算法,挑選出後端一台tracker來響應nginx請求

           3.tracker通過查找database資料庫,擷取到要通路的URL的值,并傳回給nginx

           4.nginx通過傳回的值及某種挑選算法挑選一台mogstored發起請求

           5.mogstored将結果傳回給nginx

           6.nginx建構響應封包傳回給用戶端

   2.ip規劃

角色

運作軟體

ip位址

反向代理

nginx

192.168.1.201

存儲節點與排程節點1

mogilefs

192.168.1.202

存儲節點與排程節點2

192.168.1.203

資料庫節點

MariaDB

192.168.1.204

   3.資料庫的安裝操作并為授權

   關于資料庫的編譯安裝,請參照本人相關博文http://wangfeng7399.blog.51cto.com/3518031/1393146,本處将不再累贅,本處使用的為yum源的安裝方式安裝mysql

1

2

3

4

5

6

<code>mysql&gt; grant all on *.* to </code><code>'root'</code><code>@</code><code>'192.168.1.%'</code> <code>identified by </code><code>'wangfeng7399'</code><code>;</code>

<code>Query OK, </code><code>0</code> <code>rows affected (</code><code>0.00</code> <code>sec)</code>

<code>mysql&gt; grant all on mgdb.* to </code><code>'mguser'</code><code>@</code><code>'192.168.1.%'</code> <code>identified by </code><code>'wangfeng7399'</code><code>;</code>

<code>mysql&gt; flush privileges;</code>

   4.安裝mogilefs.安裝mogilefs,可以使用yum安裝,也可以使用編譯安裝,本處通過yum安裝

7

8

9

<code>[root@node2 download]# ls</code>

<code>MogileFS-Server-</code><code>2.46</code><code>-</code><code>2</code><code>.el6.noarch.rpm</code>

<code>MogileFS-Server-mogilefsd-</code><code>2.46</code><code>-</code><code>2</code><code>.el6.noarch.rpm</code>

<code>MogileFS-Server-mogstored-</code><code>2.46</code><code>-</code><code>2</code><code>.el6.noarch.rpm</code>

<code>MogileFS-Utils-</code><code>2.19</code><code>-</code><code>1</code><code>.el6.noarch.rpm</code>

<code>perl-MogileFS-Client-</code><code>1.14</code><code>-</code><code>1</code><code>.el6.noarch.rpm</code>

<code>perl-Net-Netmask-</code><code>1.9015</code><code>-</code><code>8</code><code>.el6.noarch.rpm</code>

<code>perl-Perlbal-</code><code>1.78</code><code>-</code><code>1</code><code>.el6.noarch.rpm</code>

<code>[root@node2 download]# yum install *.rpm perl-IO-AIO -y</code>

   5.初始化資料庫    

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<code>[root@node2 ~]# mogdbsetup --dbhost=</code><code>192.168</code><code>.</code><code>1.204</code> <code>--dbname=mgdb --dbrootuser=root --dbrootpass=wangfeng7399 --dbuser=mguser --dbpass=wangfeng7399 --yes</code>

<code>mysql&gt; show tables;</code>

<code>+----------------------+</code>

<code>| Tables_in_mgdb       |</code>

<code>| checksum             |</code>

<code>| </code><code>class</code>                <code>|</code>

<code>| device               |</code>

<code>| domain               |</code>

<code>| file                 |</code>

<code>| file_on              |</code>

<code>| file_on_corrupt      |</code>

<code>| file_to_delete       |</code>

<code>| file_to_delete2      |</code>

<code>| file_to_delete_later |</code>

<code>| file_to_queue        |</code>

<code>| file_to_replicate    |</code>

<code>| fsck_log             |</code>

<code>| host                 |</code>

<code>| server_settings      |</code>

<code>| tempfile             |</code>

<code>| unreachable_fids     |</code>

   可以看到在資料庫中建立了一些表

   6.修改配置檔案,啟動服務

<code>修改/etc/mogilefs/mogilefsd.conf</code>

<code>daemonize = </code><code>1</code>  <code>//是否已守護程序模式啟動mogilefsd</code>

<code>pidfile = /</code><code>var</code><code>/run/mogilefsd/mogilefsd.pid </code><code>//piad檔案的存放位置</code>

<code>db_dsn = DBI:mysql:mgdb:host=</code><code>192.168</code><code>.</code><code>1.204</code>  <code>//資料庫的存放位置</code>

<code>db_user = mguser   </code><code>//資料庫的使用者名</code>

<code>db_pass = wangfeng7399  </code><code>//資料庫的密碼</code>

<code>listen = </code><code>0.0</code><code>.</code><code>0.0</code><code>:</code><code>7001</code>  <code>//監聽的位址</code>

<code>[root@node2 ~]# ss -tnl |grep </code><code>7001</code>

<code>LISTEN     </code><code>0</code>      <code>128</code>                       <code>*:</code><code>7001</code>                     <code>*:*</code>

<code>修改/etc/mogilefs/mogstored.conf</code>

<code>maxconns = </code><code>10000</code>  <code>//最大連接配接數</code>

<code>httplisten = </code><code>0.0</code><code>.</code><code>0.0</code><code>:</code><code>7500</code>  <code>//http監聽的位址</code>

<code>mgmtlisten = </code><code>0.0</code><code>.</code><code>0.0</code><code>:</code><code>7501</code>  <code>//mgm監聽的位址</code>

<code>docroot = /mgdata    </code><code>//資料的存放位置</code>

<code>[root@node2 ~]# mkdir /mgdata/dev1</code>

<code>[root@node2 ~]# chown -R mogilefs.mogilefs /mgdata</code>

<code>[root@node2 ~]# chown mogilefs.mogilefs /etc/mogilefs/mogstored.conf</code>

<code>[root@node2 ~]# ss -tnl</code>

<code>State       Recv-Q Send-Q             Local Address:Port               Peer Address:Port</code>

<code>LISTEN      </code><code>0</code>      <code>128</code>                            <code>*:</code><code>7500</code>                          <code>*:*   </code>

<code>LISTEN      </code><code>0</code>      <code>128</code>                            <code>*:</code><code>7501</code>                          <code>*:*</code>

   7.配置mogilefs

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

<code>[root@node2 ~]# mogadm</code>

<code>Usage:  (enter any command prefix, leaving off options, </code><code>for</code> <code>further help)</code>

<code>  </code><code>mogadm check                     Check the state of the MogileFS world.</code>

<code>  </code><code>mogadm stats                     Show MogileFS system statistics.  (DEPRECATED: </code><code>use</code> <code>mogstats instead)</code>

<code>  </code><code>mogadm host ...</code>

<code>         </code><code>host add ...              Add a host to MogileFS.</code>

<code>         </code><code>host </code><code>delete</code> <code>...           Delete a host.</code>

<code>         </code><code>host list                 List all hosts.</code>

<code>         </code><code>host mark ...             Change the status of a host.  (equivalent to </code><code>'modify --status'</code><code>)</code>

<code>         </code><code>host modify ...           Modify a host's properties.</code>

<code>  </code><code>mogadm device ...</code>

<code>         </code><code>device add ...            Add a device to a host.</code>

<code>         </code><code>device list ...           List all devices, </code><code>for</code> <code>each</code> <code>host.</code>

<code>         </code><code>device mark ...           Mark a device </code><code>as</code> <code>{alive,dead,down,drain,readonly}</code>

<code>         </code><code>device modify ...         Modify a device's properties.</code>

<code>         </code><code>device summary ...        List the summary of devices, </code><code>for</code> <code>each</code> <code>host.</code>

<code>  </code><code>mogadm domain ...</code>

<code>         </code><code>domain add ...            Add a domain (</code><code>namespace</code><code>)</code>

<code>         </code><code>domain </code><code>delete</code> <code>...         Delete a domain.</code>

<code>         </code><code>domain list               List all hosts.</code>

<code>  </code><code>mogadm </code><code>class</code> <code>...</code>

<code>         </code><code>class</code> <code>add ...             Add a file </code><code>class</code> <code>to a domain.</code>

<code>         </code><code>class</code> <code>delete</code> <code>...          Delete a file </code><code>class</code> <code>from a domain.</code>

<code>         </code><code>class</code> <code>list                List all classes, </code><code>for</code> <code>each</code> <code>domain.</code>

<code>         </code><code>class</code> <code>modify ...          Modify properties of a file </code><code>class</code><code>.</code>

<code>  </code><code>mogadm slave ...</code>

<code>         </code><code>slave add ...             Add a slave node </code><code>for</code> <code>store usage</code>

<code>         </code><code>slave </code><code>delete</code> <code>...          Delete a slave node </code><code>for</code> <code>store usage</code>

<code>         </code><code>slave list                List current store slave nodes.</code>

<code>         </code><code>slave modify ...          Modify a slave node </code><code>for</code> <code>store usage</code>

<code>  </code><code>mogadm fsck ...</code>

<code>         </code><code>fsck clearlog             Clear the fsck log</code>

<code>         </code><code>fsck printlog             Display the fsck log</code>

<code>         </code><code>fsck reset ...            Reset fsck position back to the beginning</code>

<code>         </code><code>fsck start                Start (or resume) background fsck</code>

<code>         </code><code>fsck status               Show fsck status</code>

<code>         </code><code>fsck stop                 Stop (pause) background fsck</code>

<code>         </code><code>fsck taillog              Tail the fsck log</code>

<code>  </code><code>mogadm rebalance ...</code>

<code>         </code><code>rebalance policy ...      Add or adjust the current policy</code>

<code>         </code><code>rebalance reset           Reset an existing policy</code>

<code>         </code><code>rebalance settings        Display rebalance settings</code>

<code>         </code><code>rebalance start           Start a rebalance job</code>

<code>         </code><code>rebalance status          Show status of current rebalance job</code>

<code>         </code><code>rebalance stop            Stop a rebalance job</code>

<code>         </code><code>rebalance test            Show what devices the current policy would match</code>

<code>  </code><code>mogadm settings ...</code>

<code>         </code><code>settings list             List all server settings</code>

<code>         </code><code>settings </code><code>set</code> <code>...          Set server setting </code><code>'key'</code> <code>to </code><code>'value'</code><code>.</code>

   添加存儲主機

<code>[root@node2 ~]# mogadm --trackers=</code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>7001</code> <code>host add </code><code>192.168</code><code>.</code><code>1.202</code> <code>-ip=</code><code>192.168</code><code>.</code><code>1.202</code> <code>--status=alive</code>

<code>[root@node2 ~]# mogadm --trackers=</code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>7001</code> <code>host list</code>

<code>192.168</code><code>.</code><code>1.202</code> <code>[</code><code>1</code><code>]: alive</code>

<code>  </code><code>IP:       </code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>7500</code>

   添加儲存設備    

<code>[root@node2 ~]# mogadm --trackers=</code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>7001</code> <code>device add </code><code>192.168</code><code>.</code><code>1.202</code> <code>1</code>

<code>[root@node2 ~]# mogadm --trackers=</code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>7001</code> <code>device list</code>

<code>                    </code><code>used(G)    free(G)   total(G)  weight(%)</code>

<code>   </code><code>dev1:   alive      </code><code>0.393</code>     <code>18.293</code>     <code>18.686</code>        <code>100</code>

   添加域

<code>[root@node2 ~]# mogadm --trackers=</code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>7001</code> <code>domain add imgs</code>

<code>[root@node2 ~]# mogadm --trackers=</code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>7001</code> <code>domain add files</code>

<code>[root@node2 ~]# mogadm --trackers=</code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>7001</code> <code>domain list</code>

<code> </code><code>domain               </code><code>class</code>                <code>mindevcount   replpolicy   hashtype</code>

<code>-------------------- -------------------- ------------- ------------ -------</code>

<code> </code><code>files                </code><code>default</code>                   <code>2</code>        <code>MultipleHosts() NONE </code>

<code> </code><code>imgs                 </code><code>default</code>                   <code>2</code>        <code>MultipleHosts() NONE</code>

   添加class

<code>[root@node2 ~]# mogadm --trackers=</code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>7001</code> <code>class</code> <code>add imgs class1</code>

<code>[root@node2 ~]# mogadm --trackers=</code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>7001</code> <code>class</code> <code>add imgs class2</code>

<code>[root@node2 ~]# mogadm --trackers=</code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>7001</code> <code>class</code> <code>add files class1</code>

<code>[root@node2 ~]# mogadm --trackers=</code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>7001</code> <code>class</code> <code>add files class2</code>

<code> </code><code>files                class1                    </code><code>2</code>        <code>MultipleHosts() NONE </code>

<code> </code><code>files                class2                    </code><code>2</code>        <code>MultipleHosts() NONE </code>

<code> </code><code>imgs                 class1                    </code><code>2</code>        <code>MultipleHosts() NONE </code>

<code> </code><code>imgs                 class2                    </code><code>2</code>        <code>MultipleHosts() NONE </code>

   8.配置192.168.1.203的mogilefs。切記不要初始化資料庫,配置應該與192.168.1.202一樣

<code>[root@node3 download]# mogadm --trackers=</code><code>192.168</code><code>.</code><code>1.203</code><code>:</code><code>7001</code> <code>host add </code><code>192.168</code><code>.</code><code>1.203</code> <code>--ip=</code><code>192.168</code><code>.</code><code>1.203</code> <code>--status=alive</code>

<code>[root@node3 download]# mogadm --trackers=</code><code>192.168</code><code>.</code><code>1.203</code><code>:</code><code>7001</code> <code>host list</code>

<code>192.168</code><code>.</code><code>1.203</code> <code>[</code><code>2</code><code>]: alive</code>

<code>  </code><code>IP:       </code><code>192.168</code><code>.</code><code>1.203</code><code>:</code><code>7500</code>

<code>添加存儲節點</code>

<code>[root@node3 download]# mkdir /mgdata/dev2</code>

<code>[root@node3 download]# chown mogilefs.mogilefs -R /mgdata/dev2/</code>

<code>[root@node3 download]# mogadm --trackers=</code><code>192.168</code><code>.</code><code>1.203</code><code>:</code><code>7001</code> <code>device add </code><code>192.168</code><code>.</code><code>1.203</code> <code>2</code>

<code>[root@node3 download]# mogadm --trackers=</code><code>192.168</code><code>.</code><code>1.203</code><code>:</code><code>7001</code> <code>domain list</code>

<code>隻需要添加主機就可以看到在其他主機上配置的内容</code>

   9.嘗試上傳資料,擷取資料,用戶端讀取資料

   上傳資料,在任何一個節點上傳都可以

<code>[root@node3 download]# mogupload --trackers=</code><code>192.168</code><code>.</code><code>1.203</code><code>:</code><code>7001</code> <code>--domain=imgs --key=</code><code>'2.jpg'</code> <code>--file=</code><code>'/root/1.jpg'</code>

   擷取資料

<code>[root@node3 download]# mogfileinfo --trackers=</code><code>192.168</code><code>.</code><code>1.203</code><code>:</code><code>7001</code> <code>--domain=imgs --key=</code><code>'2.jpg'</code>

<code>- file: </code><code>2</code><code>.jpg</code>

<code>     </code><code>class</code><code>:              </code><code>default</code>

<code>  </code><code>devcount:                    </code><code>2</code>

<code>    </code><code>domain:                 imgs</code>

<code>       </code><code>fid:                    </code><code>4</code>

<code>       </code><code>key:                </code><code>2</code><code>.jpg</code>

<code>    </code><code>length:                </code><code>49809</code>

<code> </code><code>- http:</code><code>//192.168.1.203:7500/dev2/0/000/000/0000000004.fid</code>

<code> </code><code>- http:</code><code>//192.168.1.202:7500/dev1/0/000/000/0000000004.fid</code>

   用戶端檢視資料

<a href="http://s3.51cto.com/wyfs02/M01/26/F0/wKiom1NveGuQUXK7AAJneocHjt8432.jpg" target="_blank"></a>

   我們可以通過任何一個節點檢視到資料

三、與nginx結合    

   要想nginx能夠實作對後端trucker的反向代理,必須結合第三方子產品來實作

   1.編譯安裝nginx    

<code>[root@node1 ~]# tar xf nginx-</code><code>1.6</code><code>.</code><code>0</code><code>.tar.gz</code>

<code>[root@node1 ~]# tar xf nginx_mogilefs_module-</code><code>1.0</code><code>.</code><code>4</code><code>.tar.gz</code>

<code>[root@node1 ~]# useradd -r nginx</code>

<code>[root@node1 ~]# cd nginx-</code><code>1.6</code><code>.</code><code>0</code>

<code>[root@node1 nginx-</code><code>1.6</code><code>.</code><code>0</code><code>]# ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/</code><code>var</code><code>/log/nginx/error.log --http-log-path=/</code><code>var</code><code>/log/nginx/access.log --pid-path=/</code><code>var</code><code>/run/nginx/nginx.pid  --lock-path=/</code><code>var</code><code>/lock/nginx.lock --user=nginx --group=nginx --</code><code>with</code><code>-http_ssl_module --</code><code>with</code><code>-http_flv_module --</code><code>with</code><code>-http_stub_status_module --</code><code>with</code><code>-http_gzip_static_module --http-client-body-temp-path=/</code><code>var</code><code>/tmp/nginx/client/ --http-proxy-temp-path=/</code><code>var</code><code>/tmp/nginx/proxy/ --http-fastcgi-temp-path=/</code><code>var</code><code>/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/</code><code>var</code><code>/tmp/nginx/uwsgi  --http-scgi-temp-path=/</code><code>var</code><code>/tmp/nginx/scgi --</code><code>with</code><code>-pcre --add-module=../nginx_mogilefs_module-</code><code>1.0</code><code>.</code><code>4</code>

<code>[root@node1 nginx-</code><code>1.6</code><code>.</code><code>0</code><code>]# make &amp;&amp; make install</code>

   2.準備啟動腳本

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

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

<code>#!/bin/bash</code>

<code>#nginx - </code><code>this</code> <code>script starts and stops the nginx daemon</code>

<code>#</code>

<code># chkconfig:   - </code><code>85</code> <code>15</code>

<code># description:  Nginx </code><code>is</code> <code>an HTTP(S) server, HTTP(S) reverse \</code>

<code>#               proxy and IMAP/POP3 proxy server</code>

<code># processname: nginx</code>

<code># config:      /etc/nginx/nginx.conf</code>

<code># config:      /etc/sysconfig/nginx</code>

<code># pidfile:     /</code><code>var</code><code>/run/nginx.pid</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                    </code> 

<code># Source </code><code>function</code> <code>library.</code>

<code>. /etc/rc.d/init.d/functions</code>

<code># Source networking configuration.</code>

<code>. /etc/sysconfig/network</code>

<code># Check that networking </code><code>is</code> <code>up.</code>

<code>[ </code><code>"$NETWORKING"</code> <code>= </code><code>"no"</code> <code>] &amp;&amp; exit </code><code>0</code>

<code>nginx=</code><code>"/usr/local/nginx/sbin/nginx"</code>

<code>prog=$(basename $nginx)</code>

<code>NGINX_CONF_FILE=</code><code>"/etc/nginx/nginx.conf"</code>

<code>[ -f /etc/sysconfig/nginx ] &amp;&amp; . /etc/sysconfig/nginx</code>

<code>lockfile=/</code><code>var</code><code>/lock/subsys/nginx</code>

<code>make_dirs() {</code>

<code>   </code><code># make required directories</code>

<code>   </code><code>user=`nginx -V </code><code>2</code><code>&gt;&amp;</code><code>1</code> <code>| grep </code><code>"configure arguments:"</code> <code>| sed </code><code>'s/[^*]*--user=\([^ ]*\).*/\1/g'</code> <code>-`</code>

<code>   </code><code>options=`$nginx -V </code><code>2</code><code>&gt;&amp;</code><code>1</code> <code>| grep </code><code>'configure arguments:'</code><code>`</code>

<code>   </code><code>for</code> <code>opt </code><code>in</code> <code>$options; </code><code>do</code>

<code>       </code><code>if</code> <code>[ `echo $opt | grep </code><code>'.*-temp-path'</code><code>` ]; then</code>

<code>           </code><code>value=`echo $opt | cut -d </code><code>"="</code> <code>-f </code><code>2</code><code>`</code>

<code>           </code><code>if</code> <code>[ ! -d </code><code>"$value"</code> <code>]; then</code>

<code>               </code><code># echo </code><code>"creating"</code> <code>$value</code>

<code>               </code><code>mkdir -p $value &amp;&amp; chown -R $user $value</code>

<code>           </code><code>fi</code>

<code>       </code><code>fi</code>

<code>   </code><code>done</code>

<code>}</code>

<code>start() {</code>

<code>    </code><code>[ -x $nginx ] || exit </code><code>5</code>

<code>    </code><code>[ -f $NGINX_CONF_FILE ] || exit </code><code>6</code>

<code>    </code><code>make_dirs</code>

<code>    </code><code>echo -n $</code><code>"Starting $prog: "</code>

<code>    </code><code>daemon $nginx -c $NGINX_CONF_FILE</code>

<code>    </code><code>retval=$?</code>

<code>    </code><code>echo</code>

<code>    </code><code>[ $retval -eq </code><code>0</code> <code>] &amp;&amp; touch $lockfile</code>

<code>    </code><code>return</code> <code>$retval</code>

<code>stop() {</code>

<code>    </code><code>echo -n $</code><code>"Stopping $prog: "</code>

<code>    </code><code>killproc $prog -QUIT</code>

<code>    </code><code>[ $retval -eq </code><code>0</code> <code>] &amp;&amp; rm -f $lockfile</code>

<code>restart() {</code>

<code>    </code><code>configtest || </code><code>return</code> <code>$?</code>

<code>    </code><code>stop</code>

<code>    </code><code>sleep </code><code>1</code>

<code>    </code><code>start</code>

<code>reload() {</code>

<code>    </code><code>echo -n $</code><code>"Reloading $prog: "</code>

<code>    </code><code>killproc $nginx -HUP</code>

<code>    </code><code>RETVAL=$?</code>

<code>force_reload() {</code>

<code>    </code><code>restart</code>

<code>configtest() {</code>

<code>  </code><code>$nginx -t -c $NGINX_CONF_FILE</code>

<code>rh_status() {</code>

<code>    </code><code>status $prog</code>

<code>rh_status_q() {</code>

<code>    </code><code>rh_status &gt;/dev/</code><code>null</code> <code>2</code><code>&gt;&amp;</code><code>1</code>

<code>case</code> <code>"$1"</code> <code>in</code>

<code>    </code><code>start)</code>

<code>        </code><code>rh_status_q &amp;&amp; exit </code><code>0</code>

<code>        </code><code>$</code><code>1</code>

<code>        </code><code>;;</code>

<code>    </code><code>stop)</code>

<code>        </code><code>rh_status_q || exit </code><code>0</code>

<code>    </code><code>restart|configtest)</code>

<code>    </code><code>reload)</code>

<code>        </code><code>rh_status_q || exit </code><code>7</code>

<code>    </code><code>force-reload)</code>

<code>        </code><code>force_reload</code>

<code>    </code><code>status)</code>

<code>        </code><code>rh_status</code>

<code>    </code><code>condrestart|</code><code>try</code><code>-restart)</code>

<code>            </code><code>;;</code>

<code>    </code><code>*)</code>

<code>        </code><code>echo $</code><code>"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"</code>

<code>        </code><code>exit </code><code>2</code>

<code>esac</code>

   3.nginx與mofilefs互聯

<code>location ~* /images/  {</code>

<code>   </code><code>mogilefs_tracker </code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>7001</code><code>;</code>

<code>   </code><code>mogilefs_domain imgs;</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> </code><code>}</code>

<code>location ~* /file {</code>

<code>    </code><code>mogilefs_tracker </code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>7001</code><code>;</code>

<code>    </code><code>mogilefs_domain files;</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>

   檢視效果

<a href="http://s3.51cto.com/wyfs02/M01/26/F0/wKiom1NvgUCic7eYAALKDzynopM117.jpg" target="_blank"></a>

   5.配置後端truckers的叢集    

<code>upstream mgfs {</code>

<code>    </code><code>server </code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>7001</code><code>;</code>

<code>    </code><code>server </code><code>192.168</code><code>.</code><code>1.203</code><code>:</code><code>7001</code><code>;</code>

<code>server{</code>

<code>    </code><code>location ~* /images/  {</code>

<code>       </code><code>mogilefs_tracker mgfs;</code>

<code>       </code><code>mogilefs_domain imgs;</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>     </code><code>}</code>

<code>    </code><code>location ~* /file {</code>

<code>        </code><code>mogilefs_tracker mgfs;</code>

<code>        </code><code>mogilefs_domain files;</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>

  大功告成了,後續思路,前段的nginx和資料庫都存在單點故障,可以實作高可用叢集

本文轉自wangfeng7399 51CTO部落格,原文連結:http://blog.51cto.com/wangfeng7399/1409582,如需轉載請自行聯系原作者