一、分布式文件系统简介

1、分布式系统定义?

分布式系统没有统一的定义,各说纷纭。

从服务器角度来说具有以下特点:

1、系统中的各个组件分布于网路上的多个计算机;

2、各个组件彼此之间通过消息传递来通信并协调行动。

但是从客户端来说,看不出这些特性,不影响用户体验。

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

二、MogileFS(开源的分布式存储)

由LiveJournal旗下:Danga Interactive研发的,该公司著名的项目:memcached MoglieFS Perlbal(同Nginx)。

MogileFS特性

1、工作于应用层(用户空间文件系统)

2、无单点失败

3、自动文件复制

4、比“RAID”好

5、传输中立 无特殊协议

6、密命名空间简单 每个文件名称对应一个key。使用全局文件结构。可以使用domain来模拟实现目录的作用。

7、不依赖于如何共享设备

MogileFS的工作架构:

wKioL1Q4xm7SX4A6AAKuRYDOEvM798.jpg

三、MogileFS的实现

1、手动实现MogileFS的上传和下载

试验原理图如下:

2

实验步骤:

在172.16.10.77:

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
### 1、安装配置mysql
yum install mysql-server -y
service mysqld start
 
## 授权用户
mysql> GRANT ALL ON mogdb.* TO moguser@'172.16.10.%' IDENTIFIED BY 'mogpass';
mysql> GRANT ALL ON *.* TO root@'172.16.10.%' IDENTIFIED BY 'rootpass';
mysql> FLUSH PRIVILEGES;
 
### 2、安装配置 MogileFS 的tracker端
## 依赖于 epel 源
yum install MogileFS-Server-2.46-2.el6.noarch.rpm \
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm \
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm \
 perl-Perlbal-1.78-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm  -y
 
### 3、初始化,主要是创建数据库和表信息
mogdbsetup --dbhost=172.16.10.77 --dbuser=moguser --dbpass=mogpass \
   --dbrootuser=root --dbrootpass=rootpass --dbname=mogdb 
 
### 4、配置 tracker端(mogilefsd)
### 配置文件 /etc/mogilefs/mogilefsd.conf,主要的配置选项如下: 
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogdb:host=172.16.10.77
db_user = moguser
db_pass = mogpass
listen = 172.16.10.77:7001
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1
###################
 
service mogilefsd start
 
### 5、配置mogstared
### 配置文件 /etc/mogilefs/mogstared.conf,主要的配置选项如下:
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogdata/data 
###################
mkdir -p /mogdata/data
chown mogilefs.mogilefs /mogdata/data/ -R
service mogstored start

3

4

在172.16.10.51:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
### 1、安装配置 MogileFS 的 storage 端
## 依赖于 epel 源
yum install MogileFS-Server-2.46-2.el6.noarch.rpm \
MogileFS-Server-mogilefsd.noarch-0:2.46-2.el6 \
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  \
perl-Perlbal-1.78-1.el6.noarch.rpm \
perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-IO-AIO -y
 
### 2、配置mogstared
### 配置文件 /etc/mogilefs/mogstared.conf,主要的配置选项如下:
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogdata/data 
###################
mkdir -p /mogdata/data
chown mogilefs.mogilefs /mogdata/data/ -R
service mogstored start

5

安装配置,到此基本完成。注意,以上安装的软件都是perl语言的模块。可以使用cpan命令在线安装。

6

接下来就是要配置mogielfs:

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
## 配置时,需要安装perl-MogileFS-Client MogileFS-Utils
## 在172.16.10.77上进行配置:
yum install perl-MogileFS-Client-1.14-1.el6.noarch.rpm \
MogileFS-Utils-2.19-1.el6.noarch.rpm 
 
1、向tracker添加各mogstored主机
mogadm --trackers=172.16.10.77:7001 host add node1 --ip=172.16.10.51 --status=alive
mogadm --trackers=172.16.10.77:7001 host add node2 --ip=172.16.10.77 --status=alive
 
2、向tracker添加各设备
mogadm --trackers=172.16.10.77:7001 device add node1 1 --status=alive
mogadm --trackers=172.16.10.77:7001 device add node2 2 --status=alive
在172.16.10.51:
mkdir /mogdata/data/dev1
chown -R mogilefs.mogilefs /mogdata/data
在172.16.10.77:
mkdir /mogdata/data/dev2
chown -R mogilefs.mogilefs /mogdata/data
 
3、为tracker定义名称空间domain
mogadm --trackers=172.16.10.77:7001 domain add images
mogadm --trackers=172.16.10.77:7001 domain add files 
 
4、为domain添加一个或多个class # 非必需的
mogadm --trackers=TRACKER_NODE class add 可同时副本的最少个数;

7 

上传文件:mogupload

1
2
3
4
mogupload  --trackers=172.16.10.77:7001 --domain=files --key='/issue.file' \
   --file='/etc/issue'
mogupload  --trackers=172.16.10.77:7001 --domain=images --key='/linux.png' \
   --file='/root/linux.png'

查看文件信息:mogfileinfo

8

9

列出domain中的文件:moglistkeys

11

文件下载:mogfetch

10

2、使用Nginx作为反向代理

实验原理图如下:

13

在192.16.10.9上安装配置 Tracker和Storaged:

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
48
在以上配置的基础上,继续配置:
 
### 1、安装配置 MogileFS 的tracker端
## 依赖于 epel 源
yum install MogileFS-Server-2.46-2.el6.noarch.rpm \
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm \
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm \
perl-Perlbal-1.78-1.el6.noarch.rpm \
perl-Net-Netmask-1.9015-8.el6.noarch.rpm  -y
 
### 2、初始化,主要是创建数据库和表信息
mogdbsetup --dbhost=172.16.10.77 --dbuser=moguser --dbpass=mogpass \
    --dbrootuser=root --dbrootpass=rootpass --dbname=mogdb 
 
### 3、配置 tracker端(mogilefsd)
### 配置文件 /etc/mogilefs/mogilefsd.conf,主要的配置选项如下: 
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogdb:host=172.16.10.77
db_user = moguser
db_pass = mogpass
listen = 172.16.10.9:7001
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1
###################
service mogilefsd start
 
### 4、配置mogstared
### 配置文件 /etc/mogilefs/mogstared.conf,主要的配置选项如下:
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogdata/data 
###################
mkdir -p /mogdata/data
chown mogilefs.mogilefs /mogdata/data/ -R
service mogstored start
 
## 在172.16.10.77上进行配置:
1、向tracker添加各mogstored主机 mogadm --trackers=172.16.10.77:7001 host add \
   node3 --ip=172.16.10.9 --status=alive
2、向tracker添加各设备 mogadm --trackers=172.16.10.77:7001 device add node3 3 \
   --status=alive
在172.16.10.9:
mkdir /mogdata/data/dev3 chown -R mogilefs.mogilefs /mogdata/data

14

配置ngnix端:

在172.16.10.51:

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
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
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
## 编译安装nginx,编译时要编译 nginx-mogilefs模块
## ngnix和nginx-mogilefs模块在nginx的官网 nginx.org上,就可以下载到
useradd -r nginx
tar xf nginx_mogilefs_module-1.0.4.tar.gz
tar xf nginx-1.6.2.tar.gz
cd nginx-1.6.2
 ./configure --prefix=/usr --sbin-path=/usr/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 --with-debug \
  --add-module=../nginx_mogilefs_module-1.0.4
make && make install
 
## 添加服务脚本:
 
#!/bin/sh
#
# nginx        Startup script for nginx
#
# chkconfig: - 85 15
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx/nginx.pid
# description: nginx is an HTTP and reverse proxy server
#
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop nginx
### END INIT INFO
 
# Source function library.
/etc/rc.d/init.d/functions
 
if [ -L $0 ]; then
    initscript=`/bin/readlink -f $0`
else
    initscript=$0
fi
 
sysconfig=`/bin/basename $initscript`
 
if [ -f /etc/sysconfig/$sysconfig ]; then
    /etc/sysconfig/$sysconfig
fi
 
nginx=${NGINX-/usr/sbin/nginx}
prog=`/bin/basename $nginx`
conffile=${CONFFILE-/etc/nginx/nginx.conf}
lockfile=${LOCKFILE-/var/lock/subsys/nginx}
pidfile=${PIDFILE-/var/run/nginx/nginx.pid}
SLEEPMSEC=${SLEEPMSEC-200000}
UPGRADEWAITLOOPS=${UPGRADEWAITLOOPS-5}
RETVAL=0
 
start() {
    echo -n $"Starting $prog: "
 
    daemon --pidfile=${pidfile} ${nginx} -c ${conffile}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch ${lockfile}
    return $RETVAL
}
 
stop() {
    echo -n $"Stopping $prog: "
    killproc -p ${pidfile} ${prog}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
 
reload() {
    echo -n $"Reloading $prog: "
    killproc -p ${pidfile} ${prog} -HUP
    RETVAL=$?
    echo
}
 
upgrade() {
    oldbinpidfile=${pidfile}.oldbin
 
    configtest -q || return
    echo -n $"Starting new master $prog: "
    killproc -p ${pidfile} ${prog} -USR2
    echo
 
    for in `/usr/bin/seq $UPGRADEWAITLOOPS`; do
        /bin/usleep $SLEEPMSEC
        if [ -f ${oldbinpidfile} -a -f ${pidfile} ]; then
            echo -n $"Graceful shutdown of old $prog: "
            killproc -p ${oldbinpidfile} ${prog} -QUIT
            RETVAL=$?
            echo
            return
        fi
    done
 
    echo $"Upgrade failed!"
    RETVAL=1
}
 
configtest() {
    if "$#" -ne 0 ] ; then
        case "$1" in
            -q)
                FLAG=$1
                ;;
            *)
                ;;
        esac
        shift
    fi
    ${nginx} -t -c ${conffile} $FLAG
    RETVAL=$?
    return $RETVAL
}
 
rh_status() {
    status -p ${pidfile} ${nginx}
}
 
# See how we were called.
case "$1" in
    start)
        rh_status >/dev/null 2>&1 && exit 0
        start
        ;;
    stop)
        stop
        ;;
    status)
        rh_status
        RETVAL=$?
        ;;
    restart)
        configtest -q || exit $RETVAL
        stop
        start
        ;;
    upgrade)
        rh_status >/dev/null 2>&1 || exit 0
        upgrade
        ;;
    condrestart|try-restart)
        if rh_status >/dev/null 2>&1; then
            stop
            start
        fi
        ;;
    force-reload|reload)
        reload
        ;;
    configtest)
        configtest
        ;;
    *)
        echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload| \
          upgrade|reload|status|help|configtest}"
        RETVAL=2
esac
 
exit $RETVAL
 
################# end ################
mkdir /var/tmp/nginx/ -p

nginx安装、基本配置完成。接下来,配置使用 nginx-mogilefs 模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/etc/ngnix/ngnix的配置文件中,添加:
upstream trackers{
    server 172.16.10.77:7001;
    server 172.16.10.9:7001;
}
 
location  /upload {
    mogilefs_tracker trackers;
    mogilefs_domain images;
    mogilefs_methods GET;
    mogilefs_noverify on;
        mogilefs_pass {
                    proxy_pass $mogilefs_path;
                    proxy_hide_header Content-Type;
                    proxy_buffering off;
            }
}
 
 
## 启动服务即可:
service ngnix start

15

可以实现文件的浏览功能,真正的上传功能,每个公司都有自己开发的上传工具。