您的位置:首页 > 其它

分布式文件系统FastDFS详解

2016-03-22 11:40 477 查看
FastDFS功能简介:

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

主页地址:http://code.google.com/p/fastdfs/ #目前据说这上面已停止更新

FastDFS特点:

FastDFS主要解决了大容量的文件(主要是图片、视频、音频等小文件)存储和高并发访问的问题,并在文件存取时实现了负载均衡。与其它类GFS系统相比,FastDFS最大的特点在于它是一个轻量级的系统,体现在以下几个方面。

首先,FastDFS的结构比较简单,主要由Client、Tracker server和Storage server三部分组成。Client通过Tracker server得到Storage server的信息,然后直接与Storage server通信访问文件,避免了Tracker server成为瓶颈。

第二,FastDFS不对文件进行分块存储,与支持文件分块存储的DFS相比,更加简洁高效。

第三,FastDFS中的文件ID是由Storage server生成后返回给客户端的。文件ID中包含了组号、文件相对路径和文件名等(文件ID中还包含文件大小、时间戳、源Storage server IP地址、文件内容校验码、随机数等),client可以根据文件ID直接定位到文件所在的组(但具体通过哪个Storage server下载需要询问Tracker server根据负载均衡原则指定)。因此FastDFS不需要存储文件索引信息。而其他文件系统则通常需要由NameServer存储文件索引信息,如mogileFS采用MySQL数据库来存储文件索引以及系统相关的信息,而MySQL很容易成为系统瓶颈。

FastDFS特性:

文件不分块存储,上传的文件和OS文件系统中的文件一一对应

支持相同内容的文件只保存一份,节约磁盘空间

下载文件支持HTTP协议,可以使用内置Web Server,也可以和其他Web Server配合使用

支持在线扩容

支持主从文件

存储服务器上可以保存文件属性(meta-data)V2.0网络通信采用libevent,支持大并发访问,整体性能更好

FastDFS架构示意图:





文件上传流程:





1. Client询问Tracker server应上传到哪个Storage server;

2. Tracker server返回一台可用的Storage server,返回的数据为该Storage server的IP地址和端口;

3. Client直接和该Storage server建立连接,进行文件上传。

4. Storage server返回新生成的文件ID,文件上传结束。

5. 连接关闭。

文件下载流程:





1. client询问tracker可以下载指定文件的storage,参数为文件ID(组名和文件名);

2. tracker返回一台可用的storage;

3. client直接和storage通信完成文件下载。

4. 连接关闭。

FastDFS论坛:http://bbs.chinaunix.net/forum-240-1.html

FastDFS google code:http://code.google.com/p/fastdfs/

关于tracker server 和 storage server之间是如何交互的,请看我在附件中的PPT、以及PDF格式的电子书,还有一个是关于配置文件的参数以及fastdfs各项参数是如何调优的,都有详细的说明,下面就让我们开始配置过程吧!

配置环境:

CentOS 5.8 x 64

tracker server: 192.168.25.204

storage server: 192.168.25.207

php 客户端 :192.168.25.205

FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。在UC基于FastDFS开发向用户提供了:网盘,社区,广告和应用下载等业务的存储服务。

FastDFS架构:

FastDFS服务端有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)。

tracker server:跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。相比GFS中的master更为精简,不记录文件索引信息,占用的内存量很少。

storage server:存储服务器(又称:存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上。Storage server直接利用OS的文件系统调用管理文件。

client:客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。





Tracker Server:跟踪服务器,主要做调度工作,在访问上起负载均衡的作用。

Storage Server:存储服务器(又称数据服务器)。

ps:这样的架构具有以下特点:1.轻量级(相比GFS简化了master角色,不再管理meta数据信息)。2.对等结构。3.分组方式。

FastDFS协议:

FastDFS角色间是基于TCP/IP协议进行通信,协议包格式为:header + body。具体结构如图:





FastDFS各节点间都是通过tcp/ip的方式来进行通信的。

协议包由两部分组成:header和body

上传机制:





同步时间管理:

当一个文件上传成功后,客户端马上发起对该文件下载请求(或删除请求)时,tracker是如何选定一个适用的存储服务器呢?

其实每个存储服务器都需要定时将自身的信息上报给tracker,这些信息就包括了本地同步时间(即,同步到的最新文件的时间戳)。而tracker根据各个存储服务器的上报情况,就能够知道刚刚上传的文件,在该存储组中是否已完成了同步。同步信息上报如下图:





下载机制:





精巧的FID:

说到下载就不得不提文件索引(又称:FID)的精巧设计了。文件索引结构如下图,是客户端上传文件后存储服务器返回给客户端,用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。





ps:

组名:文件上传后所在的存储组名称,在文件上传成功后有存储服务器返回,需要客户端自行保存。

虚拟磁盘路径:存储服务器配置的虚拟路径,与磁盘选项store_path*对应。

数据两级目录:存储服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。

文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

快速定位文件:

知道FastDFS FID的组成后,我们来看看FastDFS是如何通过这个精巧的FID定位到需要访问的文件。

通过组名tracker能够很快的定位到客户端需要访问的存储服务器组,并将选择合适的存储服务器提供客户端访问;

存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。





本次分享的主要内容包含:FastDFS各角色的任务分工/协作,文件索引的原理设计以及文件上传/下载操作的流程。通过此次学习我们对FastDFS有了初步的了解,如:

FastDFS只有三个角色;且跟踪服务器和存储服务器均不存在单点。

跟踪服务器被动的接收存储服务器汇报,对存储服务器进行分组管理;并为客户端选定适用的存储服务器。同一存储服务器可以同时向多台跟踪服务器汇报状态信息。

存储服务器组内所有存储服务器是对等关系,存储的数据一一对应且相同;所有的存储服务器均是同时在线服务,极大的提高的服务器的使用率,分担了数据访问压力。

一、安装部署

1、配置tracker server

解决依赖关系

view source

print?

1.
[root@varnish
~]
#
tar xf libevent-2.0.21-stable.tar.gz


2.
[root@varnish
~]
#
cd libevent-2.0.21-stable


3.
[root@varnish
libevent-2.0.21-stable]
#
./configure --prefix=/usr/local/libevent


4.
[root@varnish
libevent-2.0.21-stable]
#
make


5.
[root@varnish
libevent-2.0.21-stable]
#
make install


6.
[root@varnish
libevent-2.0.21-stable]
#
echo '/usr/local/libevent/include/' >> /etc/ld.so.conf


7.
[root@varnish
libevent-2.0.21-stable]
#
echo '/usr/local/libevent/lib/' >> /etc/ld.so.conf


8.
[root@varnish
libevent-2.0.21-stable]
#
ldconfig


安装fastdfs

注意:我们这里使用的是最新版本的fastdfs,由于最新版的fastdfs取消了自带的http功能,所以这里我们就不对make.sh做修改。

view source

print?

1.
[root@varnish
~]
#
tar xf FastDFS_v4.07.tar.gz


2.
[root@varnish
~]
#
cd FastDFS


3.
[root@varnish
FastDFS]
#
./make.sh C_INCLUDE_PATH=/usr/local/libevent/include/ LIBRARY_PATH=/usr/local/libevent/lib/


4.
[root@varnish
FastDFS]
#
./make.sh install


5.
[root@varnish
FastDFS]
#
ls /etc/fdfs/


6.
client.conf
http.conf  mime.types  storage.conf  tracker.conf


配置文件解释:

tracker.conf //负责均衡调度服务器配置文件

client.conf //客户端上传配置文件

http.conf //http服务器配置文件

storage.conf//文件存储服务器配置文件

mime.types //文件类型配置文件

修改tracker server的配置文件

view source

print?

1.
[root@varnish
~]
#
vim /etc/fdfs/tracker.conf


2.
bind_addr=
改为bind_addr=192.168.25.204


3.
base_path=/home/yuqing/fastdfs
改为 base_path=/data/fastdfs


4.
http.server_port=8080
改为http.server_port=80


创建/data/fastdfs,用于存放tracker日志、storage server等信息

view source

print?

1.
[root@varnish
~]
#
mkdir -p /data/fastdfs


2.
启动tracker
server


3.
[root@varnish
~]
#
/usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf






2、配置storage server

上述安装过程是一样的这里就不在进行演示,请大家见谅!

view source

print?

1.
修改storage
server的配置文件:


2.
[root@web2
~]
#
vim /etc/fdfs/storage.conf


3.
bind_addr=
改为bind_addr=192.168.25.207


4.
base_path=/home/yuqing/fastdfs
改为base_path=/data/fastdfs


5.
store_path0=/home/yuqing/fastdfs
改为store_path0=/data/fastdfs


6.
tracker_server=192.168.209.121:22122
改为tracker_server=192.168.25.204:22122


7.
http.server_port=8888
改为http.server_port=80


创建数据目录,并启动storage server(有刷屏的感觉)









查看tracker和storage的链接情况:





3、测试上传文件

我们这里在tracker server上配置客户端上传文件

view source

print?

1.
[root@varnish
~]
#
vim /etc/fdfs/client.conf


2.
base_path=/home/yuqing/fastdfs
改为base_path=/data/fastdfs


3.
tracker_server=192.168.0.197:22122


4.
改为


5.
tracker_server=192.168.25.204:22122


上传个文件,如果上传成功,会返回一个url,我们记住这个url,等下要用到




http://192.168.25.207/group1/M00/00/00/wKgZz1IEYnSASqs2AAAGgpr6pLY3507236_big
二、在storage server上安装nginx

1、安装nginx关于fastdfs集合的扩展模块,注意这个模块nginx默认的编译模块中没有,需手动下载安装

view source

print?

1.
[root@web2
~]
#
tar xf fastdfs-nginx-module_v1.15.tar.gz


2.
[root@web2
~]
#
cd fastdfs-nginx-module


只需解压开就可,这里我们再解释一下,好些朋友,在加载这个模块的时候,会报一些很莫名其妙的错,这个本人在编译的时候也是亲身体会,百思不得其解,后来经过点播才发现,版本不匹配,这里fastdfs官网给有详细说明,请看模块解压目录下的HISTORY、INSTALL问件,这里面很详细的安装和版本匹配说明(吃一堑一定要长一智)

安装nginx之前需要解决很多依赖关系的,这里不做说明,我这里是安装过得了,就不贴出来了,请大家按照网上的教程,解决依赖关系!

view source

print?

01.
[root@web2
~]
#
tar xf nginx-1.4.1.tar.gz


02.
[root@web2
~]
#
cd nginx-1.4.1


03.
[root@web2
nginx-1.4.1]
#
./configure \


04.
&
gt
;
--prefix=/usr \


05.
&
gt
;
--sbin-path=/usr/sbin/nginx \


06.
&
gt
;
--conf-path=/etc/nginx/nginx.conf\


07.
&
gt
;
--error-log-path=/var/log/nginx/error.log \


08.
&
gt
;
--http-log-path=/var/log/nginx/access.log \


09.
&
gt
;
--pid-path=/var/run/nginx/nginx.pid  \


10.
&
gt
;
--lock-path=/var/lock/nginx.lock \


11.
&
gt
;
--user=nginx \


12.
&
gt
;
--group=nginx \


13.
&
gt
;
--with-http_ssl_module \


14.
&
gt
;
--with-http_flv_module \


15.
&
gt
;
--with-http_stub_status_module \


16.
&
gt
;
--with-http_gzip_static_module \


17.
&
gt
;
--http-client-body-temp-path=/var/tmp/nginx/client/ \


18.
&
gt
;
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \


19.
&
gt
;
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \


20.
&
gt
;
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \


21.
&
gt
;
--http-scgi-temp-path=/var/tmp/nginx/scgi \


22.
&
gt
;
--with-pcre \


23.
&
gt
;
--add-module=/root/fastdfs-nginx-module/src


24.
[root@web2
nginx-1.4.1]
#
make


25.
[root@web2
nginx-1.4.1]
#
make install


view source

print?

1.
[root@web2
~]
#
cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/


2.
[root@web2
~]
#
vim /etc/fdfs/mod_fastdfs.conf


3.
base_path=/tmp
改为base_path=/data/fastdfs


4.
tracker_server=tracker:22122
改为tracker_server=192.168.25.204:22122


5.
store_path0=/home/yuqing/fastdfs
改为store_path0=/data/fastdfs


[root@web2 ~]# ln -s /data/fastdfs/data /data/fastdfs/data/M00

修改nginx的配置文件

view source

print?

01.
[root@web2
~]
#
vim /etc/nginx/nginx.conf


02.
在server段添加如下内容:


03.
location
/group1/M00{


04.
alias
/data/fastdfs/data;


05.
ngx_fastdfs_module;


06.
}


07.
[root@web2
~]
#
/usr/sbin/nginx -t


08.
ngx_http_fastdfs_set
pid=28145


09.
nginx:
the configuration
file
/etc/nginx/nginx.conf
syntax is ok


10.
nginx:
configuration
file
/etc/nginx/nginx.conf
test
is
successful


11.
[root@web2
~]
#
/usr/sbin/nginx


12.
ngx_http_fastdfs_set
pid=28148


然后我们在浏览器中输入上边上传的url,访问一下:



我们可以很清楚的看到400,Bad Request,那么我们换种访问方式试试

view source

print?

1.
修改nginx的配置文件


2.
[root@web2
~]
#
vim /etc/nginx/nginx.conf


3.
location
/M00{


4.
alias
/data/fastdfs/data;


5.
ngx_fastdfs_module;


6.
}


view source

print?

1.
之后重启服务


2.
[root@web2
~]
#
/usr/sbin/nginx -s stop


3.
ngx_http_fastdfs_set
pid=28947


4.
[root@web2
~]
#
/usr/sbin/nginx


5.
ngx_http_fastdfs_set
pid=28948


然后我们把url中的group1手动去掉,访问一下:





很明显可以访问,我在配置的时候也是百思不得其解,网上也有此类问题,无意间打开了一个相关的帖子,终于让我找到了答案。

view source

print?

1.
我们把nginx的配置文件修改回来


2.
location
/group1/M00{


3.
alias
/data/fastdfs/data;


4.
ngx_fastdfs_module;


5.
}


修改fastdfs的模块配置文件

view source

print?

1.
[root@web2
~]
#
vim /etc/fdfs/mod_fastdfs.conf


2.
url_have_group_name
=
false
改为
true
#关于啥意思,配置文件中有解释


然后我们再来访问一下:





如上图所示,ok了,加上组名可以访问,到这里基本上已经配置完成了

但是我在网上搜解决上述解决方法时,看到了一篇博文,结合了php,我觉得有必要分享一下,那好继续我们苦逼的配置吧!

三、PHP客户端配置

因为php的客户端安装也会依赖fastdfs本身的一些库文件,所以请保证已经安装了fastdfs

安装过程和上边一样,这里参考上边安装过程!

这个php客户端所在的测试机本来我就在上边搭建好了LNMP,所以只需参考上述过程安装fastdfs即可!

view source

print?

01.
[root@web1
~]
#
cd /root/FastDFS/php_client


02.
[root@web1
php_client]
#
/usr/local/php/bin/phpize


03.
Configuring
for
:


04.
PHP
Api Version:         20090626


05.
Zend
Module Api No:      20090626


06.
Zend
Extension Api No:   220090626


07.
[root@web1
php_client]
#
./configure --with-php-config=/usr/local/php/bin/php-config


08.
[root@web1
php_client]
#
make && make install


09.
[root@web1
php_client]
#
cat fastdfs_client.ini >> /usr/local/php/etc/p


10.
pear.conf
php-fpm.conf          php-fpm.conf.default


11.
[root@web1
php_client]
#
cat fastdfs_client.ini >> /etc/php.ini


验证模块是否被正常加载

view source

print?

1.
[root@web1
php_client]
#
/usr/local/php/bin/php -m | grep fastdfs_client


2.
fastdfs_client
#说明模块已加载
www.it165.net


3.


4.
重新加载php


5.
[root@web1
php_client]
#
service php-fpm reload


修改为如下配置:

view source

print?

1.
tracker_server=192.168.25.204:22122


2.
http.tracker_server_port=80


3.


4.
重新加载php


5.
[root@web1
php_client]
#
service php-fpm reload


然后我们写个小页面,写个php脚本上传

view source

print?

1.
[root@web1
~]
#
echo "php client is here." > /opt/upload.txt


2.
[root@web1
~]
#
vim test.php


3.
&
lt
;?php


4.
var_dump(function_exists('fastdfs_storage_upload_by_filename'));


5.
$ret
= fastdfs_storage_upload_by_filename('/opt/upload.txt');


6.
var_dump($ret);


7.
?&
gt
;


执行php脚本

[root@web1 ~]# /usr/local/php/bin/php test.php

结果如下图所示:





我们来访问下试试;





到此为止我们关于fastdfs的完整应用就介绍到此了,希望大家都动手做一下!还有关于fastdfs php插件的使用方法和函数调用方法,可以看/root/FastDFS/php_client/README,里面有详细介绍!此篇博文过程中如果有什么不对的地方,还请朋友们们指正,大家一起进步!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: