天天看點

分布式檔案系統--MogileFS

分布式系統沒有統一的定義,各說紛纭。

從伺服器角度來說具有以下特點:

1、系統中的各個元件分布于網路上的多個計算機;

2、各個元件彼此之間通過消息傳遞來通信并協調行動。

但是從用戶端來說,看不出這些特性,不影響使用者體驗。

1、向上擴充的成本效益越來越低;

2、單機擴充存在臨界點;

3、從穩定性和可用性考慮,單機會存在多方面問題。

3、分布式檔案系統

常見的資料的種類有結構化、半結構化、非結構化資料。分布式存儲是利用分布式系統來存儲這些資料,最終實作這些資料存儲的檔案系統稱之為分布式檔案系統。

分布式檔案系統要實作的功能有:節點之間的通信、資料存儲、檔案系統的支援 。

GlusterFS: 适用于存儲單個(少量)大檔案 。适用雲環境,流媒體檔案  例如:用友公司

MogileFS: 适用于存儲海量小檔案。将中繼資料存放在Mysql中,并不是記憶體中,對性能有影響

FastDFS: 适用于存儲海量小檔案。将中繼資料存放在記憶體中,使用perl語言研發

MooseFS: 适用于小檔案 大檔案都可以

Ceph: 核心級别 支援PB級别級别的存儲

GFS(Google FS):提供了MapReduce對分布式資料的處理方式;提供bigtable對資料的存儲

HDFS: MapReduce + HDFS = Hadoop(平台) ,Hadoop是一個平台,提供存儲大量資料的平台;Hbase實作對資料的存儲

TFS: 對HDFS改進的實作海量小檔案存儲

Luster: Oracle的開源分布式檔案系統

比較流行的 HDFS MogileFS TFS

由LiveJournal旗下:Danga Interactive研發的,該公司著名的項目:memcached MoglieFS Perlbal(同Nginx)。

1、工作于應用層(使用者空間檔案系統)

2、無單點失敗

3、自動檔案複制

4、比“RAID”好

5、傳輸中立 無特殊協定

6、密命名空間簡單 每個檔案名稱對應一個key。使用全局檔案結構。可以使用domain來模拟實作目錄的作用。

7、不依賴于如何共享裝置

<a href="http://s3.51cto.com/wyfs02/M00/4C/34/wKioL1Q4xm7SX4A6AAKuRYDOEvM798.jpg" target="_blank"></a>

試驗原理圖如下:

<a href="http://guoting.blog.51cto.com/attachment/201410/8/8886857_1412761854o07F.png" target="_blank"></a>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

<code>### 1、安裝配置mysql</code>

<code>yum </code><code>install</code> <code>mysql-server -y</code>

<code>service mysqld start</code>

<code>## 授權使用者</code>

<code>mysql&gt; GRANT ALL ON mogdb.* TO moguser@</code><code>'172.16.10.%'</code> <code>IDENTIFIED BY </code><code>'mogpass'</code><code>;</code>

<code>mysql&gt; GRANT ALL ON *.* TO root@</code><code>'172.16.10.%'</code> <code>IDENTIFIED BY </code><code>'rootpass'</code><code>;</code>

<code>mysql&gt; FLUSH PRIVILEGES;</code>

<code>### 2、安裝配置 MogileFS 的tracker端</code>

<code>## 依賴于 epel 源</code>

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

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

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

<code> </code><code>perl-Perlbal-1.78-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm  -y</code>

<code>### 3、初始化,主要是建立資料庫和表資訊</code>

<code>mogdbsetup --dbhost=172.16.10.77 --dbuser=moguser --dbpass=mogpass \</code>

<code>   </code><code>--dbrootuser=root --dbrootpass=rootpass --dbname=mogdb </code>

<code>### 4、配置 tracker端(mogilefsd)</code>

<code>### 配置檔案 /etc/mogilefs/mogilefsd.conf,主要的配置選項如下: </code>

<code>daemonize = 1</code>

<code>pidfile = </code><code>/var/run/mogilefsd/mogilefsd</code><code>.pid</code>

<code>db_dsn = DBI:mysql:mogdb:host=172.16.10.77</code>

<code>db_user = moguser</code>

<code>db_pass = mogpass</code>

<code>listen = 172.16.10.77:7001</code>

<code>conf_port = 7001</code>

<code>query_jobs = 10</code>

<code>delete_jobs = 1</code>

<code>replicate_jobs = 5</code>

<code>reaper_jobs = 1</code>

<code>###################</code>

<code>service mogilefsd start</code>

<code>### 5、配置mogstared</code>

<code>### 配置檔案 /etc/mogilefs/mogstared.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/data</code> 

<code>mkdir</code> <code>-p </code><code>/mogdata/data</code>

<code>chown</code> <code>mogilefs.mogilefs </code><code>/mogdata/data/</code> <code>-R</code>

<code>service mogstored start</code>

<a href="http://guoting.blog.51cto.com/attachment/201410/8/8886857_1412761864ElwG.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201410/8/8886857_1412761872jmZ9.png" target="_blank"></a>

<code>### 1、安裝配置 MogileFS 的 storage 端</code>

<code>MogileFS-Server-mogilefsd.noarch-0:2.46-2.el6 \</code>

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

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

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

<code>### 2、配置mogstared</code>

<a href="http://guoting.blog.51cto.com/attachment/201410/8/8886857_1412761877CXWw.png" target="_blank"></a>

安裝配置,到此基本完成。注意,以上安裝的軟體都是perl語言的子產品。可以使用cpan指令線上安裝。

<a href="http://guoting.blog.51cto.com/attachment/201410/8/8886857_1412761912QzWm.png" target="_blank"></a>

<code>## 配置時,需要安裝perl-MogileFS-Client MogileFS-Utils</code>

<code>## 在172.16.10.77上進行配置:</code>

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

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

<code>1、向tracker添加各mogstored主機</code>

<code>mogadm --trackers=172.16.10.77:7001 host add node1 --ip=172.16.10.51 --status=alive</code>

<code>mogadm --trackers=172.16.10.77:7001 host add node2 --ip=172.16.10.77 --status=alive</code>

<code>2、向tracker添加各裝置</code>

<code>mogadm --trackers=172.16.10.77:7001 device add node1 1 --status=alive</code>

<code>mogadm --trackers=172.16.10.77:7001 device add node2 2 --status=alive</code>

<code>在172.16.10.51:</code>

<code>mkdir</code> <code>/mogdata/data/dev1</code>

<code>chown</code> <code>-R mogilefs.mogilefs </code><code>/mogdata/data</code>

<code>在172.16.10.77:</code>

<code>mkdir</code> <code>/mogdata/data/dev2</code>

<code>3、為tracker定義名稱空間domain</code>

<code>mogadm --trackers=172.16.10.77:7001 domain add images</code>

<code>mogadm --trackers=172.16.10.77:7001 domain add files </code>

<code>4、為domain添加一個或多個class </code><code># 非必需的</code>

<code>mogadm --trackers=TRACKER_NODE class add 可同時副本的最少個數;</code>

<code>mogupload  --trackers=172.16.10.77:7001 --domain=files --key=</code><code>'/issue.file'</code> <code>\</code>

<code>   </code><code>--</code><code>file</code><code>=</code><code>'/etc/issue'</code>

<code>mogupload  --trackers=172.16.10.77:7001 --domain=images --key=</code><code>'/linux.png'</code> <code>\</code>

<code>   </code><code>--</code><code>file</code><code>=</code><code>'/root/linux.png'</code>

<a href="http://guoting.blog.51cto.com/attachment/201410/8/8886857_14127619496NV5.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201410/8/8886857_1412761992BUpx.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201410/8/8886857_14127620422ym3.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201410/8/8886857_1412762055Gm2T.png" target="_blank"></a>

實驗原理圖如下:

<a href="http://guoting.blog.51cto.com/attachment/201410/8/8886857_1412762090YFoP.png" target="_blank"></a>

在192.16.10.9上安裝配置 Tracker和Storaged:

48

<code>在以上配置的基礎上,繼續配置:</code>

<code>### 1、安裝配置 MogileFS 的tracker端</code>

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

<code>### 2、初始化,主要是建立資料庫和表資訊</code>

<code>    </code><code>--dbrootuser=root --dbrootpass=rootpass --dbname=mogdb </code>

<code>### 3、配置 tracker端(mogilefsd)</code>

<code>listen = 172.16.10.9:7001</code>

<code>### 4、配置mogstared</code>

<code>1、向tracker添加各mogstored主機 mogadm --trackers=172.16.10.77:7001 host add \</code>

<code>   </code><code>node3 --ip=172.16.10.9 --status=alive</code>

<code>2、向tracker添加各裝置 mogadm --trackers=172.16.10.77:7001 device add node3 3 \</code>

<code>   </code><code>--status=alive</code>

<code>在172.16.10.9:</code>

<code>mkdir</code> <code>/mogdata/data/dev3</code> <code>chown</code> <code>-R mogilefs.mogilefs </code><code>/mogdata/data</code>

<a href="http://guoting.blog.51cto.com/attachment/201410/8/8886857_1412762092CJ8K.png" target="_blank"></a>

在172.16.10.51:

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

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

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

<code>## 編譯安裝nginx,編譯時要編譯 nginx-mogilefs子產品</code>

<code>## ngnix和nginx-mogilefs子產品在nginx的官網 nginx.org上,就可以下載下傳到</code>

<code>useradd</code> <code>-r nginx</code>

<code>tar</code> <code>xf nginx_mogilefs_module-1.0.4.</code><code>tar</code><code>.gz</code>

<code>tar</code> <code>xf nginx-1.6.2.</code><code>tar</code><code>.gz</code>

<code>cd</code> <code>nginx-1.6.2</code>

<code> </code><code>.</code><code>/configure</code> <code>--prefix=</code><code>/usr</code> <code>--sbin-path=</code><code>/usr/sbin/nginx</code> <code>--conf-path=</code><code>/etc/nginx/nginx</code><code>.conf\</code>

<code>  </code><code>--error-log-path=</code><code>/var/log/nginx/error</code><code>.log --http-log-path=</code><code>/var/log/nginx/access</code><code>.log \</code>

<code>  </code><code>--pid-path=</code><code>/var/run/nginx/nginx</code><code>.pid --lock-path=</code><code>/var/lock/nginx</code><code>.lock --user=nginx \</code>

<code>  </code><code>--group=nginx --with-http_ssl_module --with-http_flv_module   \</code>

<code>  </code><code>--with-http_stub_status_module --with-http_gzip_static_module \</code>

<code>  </code><code>--http-client-body-temp-path=</code><code>/var/tmp/nginx/client/</code> <code>\</code>

<code>  </code><code>--http-proxy-temp-path=</code><code>/var/tmp/nginx/proxy/</code> <code>\</code>

<code>  </code><code>--http-fastcgi-temp-path=</code><code>/var/tmp/nginx/fcgi/</code> <code>\</code>

<code>  </code><code>--http-uwsgi-temp-path=</code><code>/var/tmp/nginx/uwsgi</code> <code>\</code>

<code>  </code><code>--http-scgi-temp-path=</code><code>/var/tmp/nginx/scgi</code> <code>--with-pcre --with-debug \</code>

<code>  </code><code>--add-module=..</code><code>/nginx_mogilefs_module-1</code><code>.0.4</code>

<code>make</code> <code>&amp;&amp; </code><code>make</code> <code>install</code>

<code>## 添加服務腳本:</code>

<code>#!/bin/sh</code>

<code>#</code>

<code># nginx        Startup script for nginx</code>

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

<code># processname: nginx</code>

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

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

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

<code># description: nginx is an HTTP and reverse proxy server</code>

<code>### BEGIN INIT INFO</code>

<code># Provides: nginx</code>

<code># Required-Start: $local_fs $remote_fs $network</code>

<code># Required-Stop: $local_fs $remote_fs $network</code>

<code># Default-Start: 2 3 4 5</code>

<code># Default-Stop: 0 1 6</code>

<code># Short-Description: start and stop nginx</code>

<code>### END INIT INFO</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>if</code> <code>[ -L $0 ]; </code><code>then</code>

<code>    </code><code>initscript=`</code><code>/bin/readlink</code> <code>-f $0`</code>

<code>else</code>

<code>    </code><code>initscript=$0</code>

<code>fi</code>

<code>sysconfig=`</code><code>/bin/basename</code> <code>$initscript`</code>

<code>if</code> <code>[ -f </code><code>/etc/sysconfig/</code><code>$sysconfig ]; </code><code>then</code>

<code>    </code><code>. </code><code>/etc/sysconfig/</code><code>$sysconfig</code>

<code>nginx=${NGINX-</code><code>/usr/sbin/nginx</code><code>}</code>

<code>prog=`</code><code>/bin/basename</code> <code>$nginx`</code>

<code>conffile=${CONFFILE-</code><code>/etc/nginx/nginx</code><code>.conf}</code>

<code>lockfile=${LOCKFILE-</code><code>/var/lock/subsys/nginx</code><code>}</code>

<code>pidfile=${PIDFILE-</code><code>/var/run/nginx/nginx</code><code>.pid}</code>

<code>SLEEPMSEC=${SLEEPMSEC-200000}</code>

<code>UPGRADEWAITLOOPS=${UPGRADEWAITLOOPS-5}</code>

<code>RETVAL=0</code>

<code>start() {</code>

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

<code>    </code><code>daemon --pidfile=${pidfile} ${nginx} -c ${conffile}</code>

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

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

<code>    </code><code>[ $RETVAL = 0 ] &amp;&amp; </code><code>touch</code> <code>${lockfile}</code>

<code>    </code><code>return</code> <code>$RETVAL</code>

<code>}</code>

<code>stop() {</code>

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

<code>    </code><code>killproc -p ${pidfile} ${prog}</code>

<code>    </code><code>[ $RETVAL = 0 ] &amp;&amp; </code><code>rm</code> <code>-f ${lockfile} ${pidfile}</code>

<code>reload() {</code>

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

<code>    </code><code>killproc -p ${pidfile} ${prog} -HUP</code>

<code>upgrade() {</code>

<code>    </code><code>oldbinpidfile=${pidfile}.oldbin</code>

<code>    </code><code>configtest -q || </code><code>return</code>

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

<code>    </code><code>killproc -p ${pidfile} ${prog} -USR2</code>

<code>    </code><code>for</code> <code>i </code><code>in</code> <code>`</code><code>/usr/bin/seq</code> <code>$UPGRADEWAITLOOPS`; </code><code>do</code>

<code>        </code><code>/bin/usleep</code> <code>$SLEEPMSEC</code>

<code>        </code><code>if</code> <code>[ -f ${oldbinpidfile} -a -f ${pidfile} ]; </code><code>then</code>

<code>            </code><code>echo</code> <code>-n $</code><code>"Graceful shutdown of old $prog: "</code>

<code>            </code><code>killproc -p ${oldbinpidfile} ${prog} -QUIT</code>

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

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

<code>            </code><code>return</code>

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

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

<code>    </code><code>echo</code> <code>$</code><code>"Upgrade failed!"</code>

<code>    </code><code>RETVAL=1</code>

<code>configtest() {</code>

<code>    </code><code>if</code> <code>[ </code><code>"$#"</code> <code>-</code><code>ne</code> <code>0 ] ; </code><code>then</code>

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

<code>            </code><code>-q)</code>

<code>                </code><code>FLAG=$1</code>

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

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

<code>        </code><code>esac</code>

<code>        </code><code>shift</code>

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

<code>    </code><code>${nginx} -t -c ${conffile} $FLAG</code>

<code>rh_status() {</code>

<code>    </code><code>status -p ${pidfile} ${nginx}</code>

<code># See how we were called.</code>

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

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

<code>        </code><code>rh_status &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1 &amp;&amp; </code><code>exit</code> <code>0</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>rh_status</code>

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

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

<code>        </code><code>configtest -q || </code><code>exit</code> <code>$RETVAL</code>

<code>    </code><code>upgrade)</code>

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

<code>        </code><code>upgrade</code>

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

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

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

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

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

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

<code>    </code><code>configtest)</code>

<code>        </code><code>configtest</code>

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

<code>        </code><code>echo</code> <code>$"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload| \</code>

<code>          </code><code>upgrade|reload|status|help|configtest}"</code>

<code>        </code><code>RETVAL=2</code>

<code>esac</code>

<code>exit</code> <code>$RETVAL</code>

<code>################# end ################</code>

<code>mkdir</code> <code>/var/tmp/nginx/</code> <code>-p</code>

nginx安裝、基本配置完成。接下來,配置使用 nginx-mogilefs 子產品。

<code>在</code><code>/etc/ngnix/ngnix</code><code>的配置檔案中,添加:</code>

<code>upstream trackers{</code>

<code>    </code><code>server 172.16.10.77:7001;</code>

<code>    </code><code>server 172.16.10.9:7001;</code>

<code>location  </code><code>/upload</code> <code>{</code>

<code>    </code><code>mogilefs_tracker trackers;</code>

<code>    </code><code>mogilefs_domain images;</code>

<code>    </code><code>mogilefs_methods GET;</code>

<code>    </code><code>mogilefs_noverify on;</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>service ngnix start</code>

<a href="http://guoting.blog.51cto.com/attachment/201410/8/8886857_1412762100VeWC.png" target="_blank"></a>

可以實作檔案的浏覽功能,真正的上傳功能,每個公司都有自己開發的上傳工具。

<a href="http://down.51cto.com/data/2364930" target="_blank">附件:http://down.51cto.com/data/2364930</a>

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

繼續閱讀