FastDFS开源地址:https://github.com/happyfish100
参考:分布式文件系统FastDFS设计原理
参考:FastDFS分布式文件系统
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向使用者提供基本文件访问接口,比如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,最后根据以上的信息生成文件名存储文件。
写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。
每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为参考。
客户端uploadfile成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。
跟upload file一样,在downloadfile时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。
最新的版本可以在这里获取,本文下载的版本是5.08,FastDFS是为互联网应用量身定做的一套分布式文件存储系统,非常适合用来存储用户图片、视频、文档等文件。对于互联网应用,和其他分布式文件系统相比,优势非常明显。具体情况大家可以看相关的介绍文档,包括FastDFS介绍PPT等等。
出于简洁考虑,FastDFS没有对文件做分块存储,因此不太适合分布式计算场景。
下载好后,server端分为两个部分,一个是tracker,一个是storage。顾名思义,前者调度管理,负载均衡,后者则是实际的存储节点。两个都能做成集群,以防止单点故障。以前的4.x版本依赖libevent,现在不需要了,只需要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
第一步:大家在浏览器地址栏输入:https://sourceforge.net/projects/fastdfs/files,我们会看到如下图所示界面。
第二步:下载FastDFS的Server安装包,我们点击上图"FastDFS Server Source Code",会看到如下图所示界面,我们选择2014-12-02那个版本,因为这个版本是最稳定的版本。
第三步:我们会看到如下图所示界面,我们点击"FastDFS_v5.05.tar.gz"进行下载即可。
tar xzf FastDFS_v5.08.tar.gz
cd FastDFS/
./make.sh
./make.sh install
确认make没有错误后,执行安装,默认会安装到/usr/bin中,并在/etc/fdfs中添加三个配置文件。
首先将三个文件的名字去掉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
依次执行:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
手动创建目录即可。
启动成功后,在 store_path0 目录下,创建了N*N个子目录:
/home/fastdfs/storage0/data 查看下
执行以下命令,验证服务:
ps -ef |grep fdfs
首先准备一张图片文件,例如:/mnt/hgfs/share/HBQJ042.jpg
将这张图片上传至FastDFS,执行:
fdfs_test /etc/fdfs/client.conf upload /mnt/hgfs/share/HBQJ042.jpg
返回的文件ID由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
http://192.168.1.11:8888/group1/M00/00/00/wKgBC1viSHuALqyQAGW3bk2DyE8501_big.jpg
上传成功,查看文件,路径:/home/fastdfs/storage0/data/00/00
报错:浏览器无法访问
查看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/
sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install openssl libssl-dev
使用nginx的默认配置,添加nginx的rtmp模块。
./configure
make
sudo make install
进入安装目录/usr/local/nginx,运行命令
./sbin/nginx
注意:以后所有的命令都在/usr/local/nginx目录运行,也nginx配置文件的相对目录。
打开浏览器在地址栏输入:localhost。如果,如下图显示那样就证明您的nginx服务器搭建成功了。
文件路径: /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;
}
在浏览器访问之前上传的图片、成功。
http://192.168.1.11/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg
① 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、解压
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
最终部署结构图(盗的图):可以按照下面的结构搭建环境。
更详细内容参考:https://www.cnblogs.com/chiangchou/p/fastdfs.html#_label2