天天看点

分布式文件系统--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,如需转载请自行联系原作者

继续阅读