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
一、安装部署
1、配置tracker server
解决依赖关系
<code>1.</code><code>[root@varnish ~]</code><code># tar xf libevent-2.0.21-stable.tar.gz</code>
<code>2.</code><code>[root@varnish ~]</code><code># cd libevent-2.0.21-stable</code>
<code>3.</code><code>[root@varnish libevent-2.0.21-stable]</code><code># ./configure --prefix=/usr/local/libevent</code>
<code>4.</code><code>[root@varnish libevent-2.0.21-stable]</code><code># make</code>
<code>5.</code><code>[root@varnish libevent-2.0.21-stable]</code><code># make install</code>
<code>6.</code><code>[root@varnish libevent-2.0.21-stable]</code><code># echo ‘/usr/local/libevent/include/‘ >> /etc/ld.so.conf</code>
<code>7.</code><code>[root@varnish libevent-2.0.21-stable]</code><code># echo ‘/usr/local/libevent/lib/‘ >> /etc/ld.so.conf</code>
<code>8.</code><code>[root@varnish libevent-2.0.21-stable]</code><code># ldconfig</code>
安装fastdfs
注意:我们这里使用的是最新版本的fastdfs,由于最新版的fastdfs取消了自带的http功能,所以这里我们就不对make.sh做修改。
<code>1.</code><code>[root@varnish ~]</code><code># tar xf FastDFS_v4.07.tar.gz</code>
<code>2.</code><code>[root@varnish ~]</code><code># cd FastDFS</code>
<code>3.</code><code>[root@varnish FastDFS]</code><code># ./make.sh C_INCLUDE_PATH=/usr/local/libevent/include/ LIBRARY_PATH=/usr/local/libevent/lib/</code>
<code>4.</code><code>[root@varnish FastDFS]</code><code># ./make.sh install</code>
<code>5.</code><code>[root@varnish FastDFS]</code><code># ls /etc/fdfs/</code>
<code>6.</code><code>client.conf http.conf mime.types storage.conf tracker.conf</code>
配置文件解释:
tracker.conf //负责均衡调度服务器配置文件
client.conf
//客户端上传配置文件
http.conf
//http服务器配置文件
storage.conf//文件存储服务器配置文件
mime.types //文件类型配置文件
修改tracker
server的配置文件
<code>1.</code><code>[root@varnish ~]</code><code># vim /etc/fdfs/tracker.conf</code>
<code>2.</code><code>bind_addr= 改为 bind_addr=192.168.25.204</code>
<code>3.</code><code>base_path=/home/yuqing/fastdfs 改为 base_path=/data/fastdfs</code>
<code>4.</code><code>http.server_port=8080 改为 http.server_port=80</code>
创建/data/fastdfs,用于存放tracker日志、storage
server等信息
<code>1.</code><code>[root@varnish ~]</code><code># mkdir -p /data/fastdfs</code>
<code>2.</code><code>启动tracker server</code>
<code>3.</code><code>[root@varnish ~]</code><code># /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf</code>
2、配置storage server
上述安装过程是一样的这里就不在进行演示,请大家见谅!
<code>1.</code><code>修改storage server的配置文件:</code>
<code>2.</code><code>[root@web2 ~]</code><code># vim /etc/fdfs/storage.conf</code>
<code>3.</code><code>bind_addr= 改为 bind_addr=192.168.25.207</code>
<code>4.</code><code>base_path=/home/yuqing/fastdfs 改为 base_path=/data/fastdfs</code>
<code>5.</code><code>store_path0=/home/yuqing/fastdfs 改为 store_path0=/data/fastdfs</code>
<code>6.</code><code>tracker_server=192.168.209.121:22122 改为 tracker_server=192.168.25.204:22122</code>
<code>7.</code><code>http.server_port=8888 改为 http.server_port=80</code>
创建数据目录,并启动storage
server(有刷屏的感觉)
查看tracker和storage的链接情况:
3、测试上传文件
我们这里在tracker
server上配置客户端上传文件
<code>1.</code><code>[root@varnish ~]</code><code># vim /etc/fdfs/client.conf</code>
<code>2.</code><code>base_path=/home/yuqing/fastdfs 改为 base_path=/data/fastdfs</code>
<code>3.</code><code>tracker_server=192.168.0.197:22122</code>
<code>4.</code><code>改为</code>
<code>5.</code><code>tracker_server=192.168.25.204:22122</code>
上传个文件,如果上传成功,会返回一个url,我们记住这个url,等下要用到
http://192.168.25.207/group1/M00/00/00/wKgZz1IEYnSASqs2AAAGgpr6pLY3507236_big
二、在storage
server上安装nginx
1、安装nginx关于fastdfs集合的扩展模块,注意这个模块nginx默认的编译模块中没有,需手动下载安装
<code>1.</code><code>[root@web2 ~]</code><code># tar xf fastdfs-nginx-module_v1.15.tar.gz</code>
<code>2.</code><code>[root@web2 ~]</code><code># cd fastdfs-nginx-module</code>
只需解压开就可,这里我们再解释一下,好些朋友,在加载这个模块的时候,会报一些很莫名其妙的错,这个本人在编译的时候也是亲身体会,百思不得其解,后来经过点播才发现,版本不匹配,这里fastdfs官网给有详细说明,请看模块解压目录下的HISTORY、INSTALL问件,这里面很详细的安装和版本匹配说明(吃一堑一定要长一智)
安装nginx之前需要解决很多依赖关系的,这里不做说明,我这里是安装过得了,就不贴出来了,请大家按照网上的教程,解决依赖关系!
<code>01.</code><code>[root@web2 ~]</code><code># tar xf nginx-1.4.1.tar.gz</code>
<code>02.</code><code>[root@web2 ~]</code><code># cd nginx-1.4.1</code>
<code>03.</code><code>[root@web2 nginx-1.4.1]</code><code># ./configure \</code>
<code>04.</code><code>&</code><code>gt</code><code>; --prefix=/usr \</code>
<code>05.</code><code>&</code><code>gt</code><code>; --sbin-path=/usr/sbin/nginx \</code>
<code>06.</code><code>&</code><code>gt</code><code>; --conf-path=/etc/nginx/nginx.conf \</code>
<code>07.</code><code>&</code><code>gt</code><code>; --error-log-path=/var/log/nginx/error.log \</code>
<code>08.</code><code>&</code><code>gt</code><code>; --http-log-path=/var/log/nginx/access.log \</code>
<code>09.</code><code>&</code><code>gt</code><code>; --pid-path=/var/run/nginx/nginx.pid \</code>
<code>10.</code><code>&</code><code>gt</code><code>; --lock-path=/var/lock/nginx.lock \</code>
<code>11.</code><code>&</code><code>gt</code><code>; --user=nginx \</code>
<code>12.</code><code>&</code><code>gt</code><code>; --group=nginx \</code>
<code>13.</code><code>&</code><code>gt</code><code>; --with-http_ssl_module \</code>
<code>14.</code><code>&</code><code>gt</code><code>; --with-http_flv_module \</code>
<code>15.</code><code>&</code><code>gt</code><code>; --with-http_stub_status_module \</code>
<code>16.</code><code>&</code><code>gt</code><code>; --with-http_gzip_static_module \</code>
<code>17.</code><code>&</code><code>gt</code><code>; --http-client-body-temp-path=/var/tmp/nginx/client/ \</code>
<code>18.</code><code>&</code><code>gt</code><code>; --http-proxy-temp-path=/var/tmp/nginx/proxy/ \</code>
<code>19.</code><code>&</code><code>gt</code><code>; --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \</code>
<code>20.</code><code>&</code><code>gt</code><code>; --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \</code>
<code>21.</code><code>&</code><code>gt</code><code>; --http-scgi-temp-path=/var/tmp/nginx/scgi \</code>
<code>22.</code><code>&</code><code>gt</code><code>; --with-pcre \</code>
<code>23.</code><code>&</code><code>gt</code><code>; --add-module=/root/fastdfs-nginx-module/src</code>
<code>24.</code><code>[root@web2 nginx-1.4.1]</code><code># make</code>
<code>25.</code><code>[root@web2 nginx-1.4.1]</code><code># make install</code>
<code>1.</code><code>[root@web2 ~]</code><code># cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/</code>
<code>2.</code><code>[root@web2 ~]</code><code># vim /etc/fdfs/mod_fastdfs.conf</code>
<code>3.</code><code>base_path=/tmp 改为 base_path=/data/fastdfs</code>
<code>4.</code><code>tracker_server=tracker:22122 改为 tracker_server=192.168.25.204:22122</code>
[root@web2 ~]# ln -s
/data/fastdfs/data /data/fastdfs/data/M00
修改nginx的配置文件
<code>01.</code><code>[root@web2 ~]</code><code># vim /etc/nginx/nginx.conf</code>
<code>02.</code><code>在server段添加如下内容:</code>
<code>03.</code><code>location /group1/M00{</code>
<code>04.</code><code>alias</code> <code>/data/fastdfs/data;</code>
<code>05.</code><code>ngx_fastdfs_module;</code>
<code>06.</code><code>}</code>
<code>07.</code><code>[root@web2 ~]</code><code># /usr/sbin/nginx -t</code>
<code>08.</code><code>ngx_http_fastdfs_set pid=28145</code>
<code>09.</code><code>nginx: the configuration </code><code>file</code> <code>/etc/nginx/nginx.conf syntax is ok</code>
<code>10.</code><code>nginx: configuration </code><code>file</code> <code>/etc/nginx/nginx.conf </code><code>test</code> <code>is successful</code>
<code>11.</code><code>[root@web2 ~]</code><code># /usr/sbin/nginx</code>
<code>12.</code><code>ngx_http_fastdfs_set pid=28148</code>
然后我们在浏览器中输入上边上传的url,访问一下:
我们可以很清楚的看到400,Bad
Request,那么我们换种访问方式试试
<code>1.</code><code>修改nginx的配置文件</code>
<code>2.</code><code>[root@web2 ~]</code><code># vim /etc/nginx/nginx.conf</code>
<code>3.</code><code>location /M00{</code>
<code>4.</code><code>alias</code> <code>/data/fastdfs/data;</code>
<code>5.</code><code>ngx_fastdfs_module;</code>
<code>6.</code><code>}</code>
<code>1.</code><code>之后重启服务</code>
<code>2.</code><code>[root@web2 ~]</code><code># /usr/sbin/nginx -s stop</code>
<code>3.</code><code>ngx_http_fastdfs_set pid=28947</code>
<code>4.</code><code>[root@web2 ~]</code><code># /usr/sbin/nginx</code>
<code>5.</code><code>ngx_http_fastdfs_set pid=28948</code>
然后我们把url中的group1手动去掉,访问一下:
很明显可以访问,我在配置的时候也是百思不得其解,网上也有此类问题,无意间打开了一个相关的帖子,终于让我找到了答案。
<code>1.</code><code>我们把nginx的配置文件修改回来</code>
<code>2.</code><code>location /group1/M00{</code>
<code>3.</code><code>alias</code> <code>/data/fastdfs/data;</code>
<code>4.</code><code>ngx_fastdfs_module;</code>
<code>5.</code><code>}</code>
修改fastdfs的模块配置文件
<code>1.</code><code>[root@web2 ~]</code><code># vim /etc/fdfs/mod_fastdfs.conf</code>
<code>2.</code><code>url_have_group_name = </code><code>false</code> <code>改为 </code><code>true</code> <code>#关于啥意思,配置文件中有解释</code>
然后我们再来访问一下:
如上图所示,ok了,加上组名可以访问,到这里基本上已经配置完成了
但是我在网上搜解决上述解决方法时,看到了一篇博文,结合了php,我觉得有必要分享一下,那好继续我们苦逼的配置吧!
三、PHP客户端配置
因为php的客户端安装也会依赖fastdfs本身的一些库文件,所以请保证已经安装了fastdfs
安装过程和上边一样,这里参考上边安装过程!
这个php客户端所在的测试机本来我就在上边搭建好了LNMP,所以只需参考上述过程安装fastdfs即可!
<code>01.</code><code>[root@web1 ~]</code><code># cd /root/FastDFS/php_client</code>
<code>02.</code><code>[root@web1 php_client]</code><code># /usr/local/php/bin/phpize</code>
<code>03.</code><code>Configuring </code><code>for</code><code>:</code>
<code>04.</code><code>PHP Api Version: 20090626</code>
<code>05.</code><code>Zend Module Api No: 20090626</code>
<code>06.</code><code>Zend Extension Api No: 220090626</code>
<code>07.</code><code>[root@web1 php_client]</code><code># ./configure --with-php-config=/usr/local/php/bin/php-config</code>
<code>08.</code><code>[root@web1 php_client]</code><code># make && make install</code>
<code>09.</code><code>[root@web1 php_client]</code><code># cat fastdfs_client.ini >> /usr/local/php/etc/p</code>
<code>10.</code><code>pear.conf php-fpm.conf php-fpm.conf.default</code>
<code>11.</code><code>[root@web1 php_client]</code><code># cat fastdfs_client.ini >> /etc/php.ini</code>
验证模块是否被正常加载
<code>1.</code><code>[root@web1 php_client]</code><code># /usr/local/php/bin/php -m | grep fastdfs_client</code>
<code>2.</code><code>fastdfs_client </code><code>#说明模块已加载 www.it165.net</code>
<code>3.</code>
<code>4.</code><code>重新加载php</code>
<code>5.</code><code>[root@web1 php_client]</code><code># service php-fpm reload</code>
修改为如下配置:
<code>1.</code><code>tracker_server=192.168.25.204:22122</code>
<code>2.</code><code>http.tracker_server_port=80</code>
然后我们写个小页面,写个php脚本上传
<code>1.</code><code>[root@web1 ~]</code><code># echo "php client is here." > /opt/upload.txt</code>
<code>2.</code><code>[root@web1 ~]</code><code># vim test.php</code>
<code>3.</code><code>&</code><code>lt</code><code>;?php</code>
<code>4.</code><code>var_dump(function_exists(‘fastdfs_storage_upload_by_filename‘));</code>
<code>5.</code><code>$ret = fastdfs_storage_upload_by_filename(‘/opt/upload.txt‘);</code>
<code>6.</code><code>var_dump($ret);</code>
<code>7.</code><code>?&</code><code>gt</code><code>;</code>
执行php脚本
[root@web1 ~]#
/usr/local/php/bin/php test.php
结果如下图所示:
我们来访问下试试;
到此为止我们关于fastdfs的完整应用就介绍到此了,希望大家都动手做一下!还有关于fastdfs
php插件的使用方法和函数调用方法,可以看/root/FastDFS/php_client/README,里面有详细介绍!此篇博文过程中如果有什么不对的地方,还请朋友们们指正,大家一起进步!
http://blog.chinaunix.net/uid-27003384-id-4059897.html