用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )


 

 一、FastDFS介绍

FastDFS开源地址:https://github.com/happyfish100

参考:分布式文件系统FastDFS设计原理 

参考:FastDFS分布式文件系统

 

1、简介

FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。

  Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。

  Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。

  Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。

 

用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )_第1张图片

2、FastDFS的存储策略

为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。

在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

3、FastDFS的上传过程

FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。

Storage Server会定期的向Tracker Server发送自己的存储信息。当Tracker Server Cluster中的Tracker Server不止一个时,各个Tracker之间的关系是对等的,所以客户端上传时可以选择任意一个Tracker。

当Tracker收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group,当选定了group后就要决定给客户端分配group中的哪一个storage server。当分配好storage server后,客户端向storage发送写文件请求,storage将会为文件分配一个数据存储目录。然后为文件分配一个fileid,最后根据以上的信息生成文件名存储文件。

用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )_第2张图片

4、FastDFS的文件同步

写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。

每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。

storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为参考。

5、FastDFS的文件下载

客户端uploadfile成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。

用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )_第3张图片

跟upload file一样,在downloadfile时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。

二、安装FastDFS环境

最新的版本可以在这里获取,本文下载的版本是5.08,FastDFS是为互联网应用量身定做的一套分布式文件存储系统,非常适合用来存储用户图片、视频、文档等文件。对于互联网应用,和其他分布式文件系统相比,优势非常明显。具体情况大家可以看相关的介绍文档,包括FastDFS介绍PPT等等。

出于简洁考虑,FastDFS没有对文件做分块存储,因此不太适合分布式计算场景。

下载好后,server端分为两个部分,一个是tracker,一个是storage。顾名思义,前者调度管理,负载均衡,后者则是实际的存储节点。两个都能做成集群,以防止单点故障。以前的4.x版本依赖libevent,现在不需要了,只需要libfastcommon。安装方法如下:

1. 下载安装libfastcommon

git clone https://github.com/happyfish100/libfastcommon.git
cd libfastcommon/
./make.sh
./make.sh install

确认make没有错误后,执行安装,64位系统默认会复制到/usr/lib64下。

这时候需要设置环境变量或者创建软链接

export LD_LIBRARY_PATH=/usr/lib64/
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so

 2、下载安装FastDFS

 第一步:大家在浏览器地址栏输入:https://sourceforge.net/projects/fastdfs/files,我们会看到如下图所示界面。

用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )_第4张图片

第二步:下载FastDFS的Server安装包,我们点击上图"FastDFS Server Source Code",会看到如下图所示界面,我们选择2014-12-02那个版本,因为这个版本是最稳定的版本。

 

用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )_第5张图片

第三步:我们会看到如下图所示界面,我们点击"FastDFS_v5.05.tar.gz"进行下载即可。

用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )_第6张图片

 

tar xzf FastDFS_v5.08.tar.gz
cd FastDFS/
./make.sh
./make.sh install

确认make没有错误后,执行安装,默认会安装到/usr/bin中,并在/etc/fdfs中添加三个配置文件。

3. 修改配置文件


首先将三个文件的名字去掉sample,暂时只修改以下几点,先让fastdfs跑起来,其余参数调优的时候再考虑。

cd /etc/fdfs
mv -f tracker.conf.sample tracker.conf
mv -f storage.conf.sample storage.conf
mv -f client.conf.sample client.conf

去掉sample后缀 

(1)然后修改 tracker.conf 文件中的日志存放路径 和 tracker server HTTP端口号:


# the base path to store data and log files
base_path=/home/fastdfs/log

注意,这个路径是根据实际情况自定义的,文件路径需要安装者手动创建,否则后续步骤会报“路径不存在”的错误,下同。

 

# HTTP port on this tracker server
http.server_port=8090

(2)修改 storage.conf 文件:

group_name=group1
store_path0=/home/fastdfs/storage0
base_path=/home/fastdfs/log
tracker_server=192.168.1.11:22122
http.server_port=8888

注意:“/home/fastdfs/storage0”路径要真实存在!!!!

(3)修改 client.conf 文件:

base_path=/home/fastdfs/log
tracker_server=192.168.1.11:22122
http.tracker_server_port=8888

注意,#include http.conf 这句,原配置文件中有2个#,删掉一个。 

##include http.conf  修改成
#include http.conf

(4)最后,修改 http.conf 文件。http.conf 文件在解压目录的conf目录下,里面有个默认图片路径,愿意改就改了吧。

http.anti_steal.token_check_fail=/home/fastdfs/anti-steal.jpg

注意:要将http.conf./FastDFS/conf  路径下拷贝到  /etc/fdfs

用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )_第7张图片

4.启动服务 

依次执行:

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

 手动创建目录即可。

启动成功后,在 store_path0 目录下,创建了N*N个子目录:

/home/fastdfs/storage0/data 查看下

用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )_第8张图片

执行以下命令,验证服务:

ps -ef |grep fdfs

5.测试上传文件 

首先准备一张图片文件,例如:/mnt/hgfs/share/HBQJ042.jpg

将这张图片上传至FastDFS,执行:

 

fdfs_test /etc/fdfs/client.conf upload /mnt/hgfs/share/HBQJ042.jpg 

用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )_第9张图片

 

返回的文件ID由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

 http://192.168.1.11:8888/group1/M00/00/00/wKgBC1viSHuALqyQAGW3bk2DyE8501_big.jpg

用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )_第10张图片

上传成功,查看文件,路径:/home/fastdfs/storage0/data/00/00
用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )_第11张图片


常见bug:

 报错:浏览器无法访问
查看nginx错误日志 如下
 ERROR - file: ini_file_reader.c, line: 631, include file "http.conf" not exists, line: "#include http.conf"
 ERROR - file: /home/packages/fastdfs-nginx-module-master/src/common.c, line: 163, load conf file "/etc/fdfs/mod_fastdfs.conf" fail, ret code: 2
解决:# cp /home/fastdfs-5.11/conf/http.conf /etc/fdfs/
 


三、安装Nginx 

1.安装nginx的依赖库

sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install openssl libssl-dev

2.配置并编译nginx 


使用nginx的默认配置,添加nginx的rtmp模块。 

./configure
make
sudo make install

3.运行测试nginx 


进入安装目录/usr/local/nginx,运行命令

./sbin/nginx

注意:以后所有的命令都在/usr/local/nginx目录运行,也nginx配置文件的相对目录。

打开浏览器在地址栏输入:localhost。如果,如下图显示那样就证明您的nginx服务器搭建成功了。 
用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )_第12张图片

 

4.打开配置文件nginx.conf

文件路径: /usr/local/nginx/conf/nginx.conf

第一处:把第一行的user root前面的#去掉,之所以这样做是因为访问权限的问题,不去掉的话,会报Forbidden错误。

第二处:新添一个server,listen的端口还是用默认的80端口,server_name是我们的图片服务器的IP(192.168.1.11是我的图片服务器的IP,大家根据自己的图片服务器的IP进行更改即可),location指定了我们的图片服务器存放图片的地址,大家需要把图片上传到/home/fastdfs/storage0目录下面才行,上面通过FastDFS操作将图片放到了/home/fastdfs/storage0的目录下了。修改完配置文件之后我们保存就行了.

location /group1/M00 {
   alias /home/fastdfs/storage0/data;
	}

用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )_第13张图片

在浏览器访问之前上传的图片、成功。

http://192.168.1.11/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg

 

四、FastDFS 配置 Nginx 模块

1、安装配置Nginx模块

① fastdfs-nginx-module 模块说明

  FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储, 但是同组存储服务器之间需要进行文件复制, 有同步延迟的问题。

  假设 Tracker 服务器将文件上传到了 192.168.1.128,上传成功后文件 ID已经返回给客户端。

  此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.1.129,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.1.129 上取文件,就会出现文件无法访问的错误。

  而 fastdfs-nginx-module 可以重定向文件链接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。

② 下载 fastdfs-nginx-module、解压

用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )_第14张图片

tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
cd fastdfs-nginx-module

 

③ 配置Nginx

在nginx中添加模块

先停止nginx 
./nginx -s stop

进入解压包目录
cd /software/nginx-1.8.1/

# 添加模块
./configure --add-module=../fastdfs-nginx-module/src

重新编译、安装
make 
make install

注意:编译时候会有错误:

 

  root/fastdfs-nginx-module/src//common.c:21:25: fatal error: fdfs_define.h: No such file or directory

 #include "fdfs_define.h"

                        ^

compilation terminated.

make[1]: *** [objs/addon/src/ngx_http_fastdfs_module.o] Error 1

修改方法:

 vim /software/fastdfs-nginx-module/src/config
错误:
CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/local/lib -lfastcommon -lfdfsclient"

修改后正确的:
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"

 ④复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录, 并修改

cd /software/fastdfs-nginx-module/src

cp mod_fastdfs.conf /etc/fdfs/

修改如下配置,其它默认

# 连接超时时间
connect_timeout=10

# Tracker Server
tracker_server=192.168.1.11:22122

# StorageServer 默认端口
storage_server_port=23000

# 如果文件ID的uri中包含/group**,则要设置为true
url_have_group_name = true

# Storage 配置的store_path0路径,必须和storage.conf中的一致
store_path0=/home/fastdfs/storage0

⑤ 复制 FastDFS 的部分配置文件到/etc/fdfs 目录

cd /software/FastDFS/conf/

cp anti-steal.jpg http.conf mime.types /etc/fdfs/

 ⑥ 配置nginx,修改nginx.conf

vim /usr/local/nginx/conf/nginx.conf

注意:

  listen 80 端口值是要与 /etc/fdfs/storage.conf 中的 http.server_port=80 (前面改成80了)相对应。如果改成其它端口,则需要统一,同时在防火墙中打开该端口。

  location 的配置,如果有多个group则配置location ~/group([0-9])/M00 ,没有则不用配group。

 

⑦ 在/ljzsg/fastdfs/file 文件存储目录下创建软连接,将其链接到实际存放数据的目录,这一步可以省略。

ln -s /home/fastdfs/storage0/data/ /home/fastdfs/storage0/data/M00 

 ⑧启动nginx

/usr/local/nginx/sbin/nginx

打印处如下就算配置成功

 注意bug:

/usr/local/nginx/logs/nginx.pid 路径下找不到nginx.pid

错误信息:

nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)

修改方法:

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

⑩在地址栏访问。

能下载文件就算安装成功。注意和第三点中直接使用nginx路由访问不同的是,这里配置 fastdfs-nginx-module 模块,可以重定向文件链接到源服务器取文件。

http://192.168.1.11/group1/M00/00/00/wKgBC1viSHuALqyQAGW3bk2DyE8501.jpg

 

最终部署结构图(盗的图):可以按照下面的结构搭建环境。

用FastDFS一步步搭建文件管理系统(FastDFS + Nginx )_第15张图片

 更详细内容参考:https://www.cnblogs.com/chiangchou/p/fastdfs.html#_label2

你可能感兴趣的:(用FastDFS一步步搭建文件管理系统(FastDFS + Nginx ))