FastDFS原理详解及部署使用

前言

FastDFS是一个c语言编写的一个开源的轻量级分布式文件系统,它对文件进程管理,功能包括:文件存储,文件同步,文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题,特别适合以文件为载体的在线服务,如相册网站,视频网站等等,FastDFS为互联网量身定制,充分考虑了冗余备份,负载均衡,现行扩容等,并注重高可用,高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载服务。

成都创新互联是一家集网站建设,垫江企业网站建设,垫江品牌网站建设,网站定制,垫江网站建设报价,网络营销,网络优化,垫江网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

博文大纲:
一、FastDFS原理及架构详解
二、部署Fast DFS架构

一、FastDFS原理及架构详解

1、FastDFS架构

FastDFS架构包括Tracker server和Storage server,client请求Tracker server 进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。

  • Tracker server:负责调度及负载均衡,通过Tracker server,在文件上传时可以根据一些策略找到Storage server来提供上传服务,可以将tracker称为追踪服务器或调度服务器;
  • Storage server:负责文件最终存储,客户端上传的文件最终存储在storage服务器上,Storage server没有实现自己的文件系统,而是利用操作系统的文件系统来管理文件,可以将storage称为存储服务器。

FastDFS原理详解及部署使用

2、Fast DFS系统的角色

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

  • Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的Storage server和group,每个storage在启动后会连接Tracker,告知自己所属group等信息,并保持周期性心跳。
  • Storage Server:存储服务器,主要提供容量和备份服务;以group为单位,每个group内部可以有多台storage server,数据互为备份。
  • Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。

3、Fast DFS原理

关于模块:跟踪服务器和存储节点都可以由一台或多台服务器构成,跟踪服务器和存储节点均可以随时增加或者下线不会影响线上服务,其中跟踪服务器中所有服务器是对 等,可以根据服务器压力情况随时增加或减少

4、文件上传流程

Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。

FastDFS原理详解及部署使用

客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。

文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。

  • 组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。
  • 虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path2则是M01,以此类推。
  • 数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
  • 文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

5、文件下载流程

FastDFS原理详解及部署使用

client发送download请求给某个tracker,必须带上文件名信息,tracker从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求,由于group内的文件同步时在后台是异步的,所以有可能出现在读的时候,文件还没有同步到某些storage server上,为了尽量避免访问到这样的storage,tracker按照如下规则选择group内可读的storage:
文件创建时间戳-storage被同步到的时间戳 且(当前时间-文件创建时间戳)>文件同步最大时间(5分钟),说明文件创建后,认为经过最大同步时间后,肯定已经同步到其他storage了。

二、部署Fast DFS架构

1、环境准备

FastDFS原理详解及部署使用

注:文中所有用到的源码包都可以在我的网盘链接中下载。

由于有一些重复性的安装操作,所以我写了一个简单的脚本,可以在进行那些重复性操作时,执行这个脚本。脚本如下(这个脚本在tracker的两个服务器上执行就行):

[root@tracker01 ~]# vim install.sh    #脚本如下,最好手动执行以下获取Ip的指令是否可以获取到自己的IP,否则需要做相应的修改
#!/bin/bash
IP=`ip a | grep inet | grep ens33 | awk '{print $2}' | awk -F/ '{print $1}'`
mkdir -p /storage/fastdfs
cd /usr/src
if [ -f fastdfs.tar.gz ] && [ -f libfastcommon.tar.gz ]
then
        tar zxf libfastcommon.tar.gz
        tar zxf fastdfs.tar.gz
        cd libfastcommon/
        ./make.sh &> /dev/null && ./make.sh install &> /dev/null
        cd ../fastdfs/
        ./make.sh &> /dev/null && ./make.sh install &> /dev/null
        cd conf
        cp mime.types http.conf /etc/fdfs/
        cd /etc/fdfs/
        cp tracker.conf.sample tracker.conf
        sed -i "s/bind_addr=/bind_addr=${IP}/g" tracker.conf
        sed -i "s/base_path=\/home\/yuqing\/fastdfs/base_path=\/storage\/fastdfs/g" tracker.conf
        echo "tracker server install succees ......."
else
        echo "error,file not found."
        exit 1
fi

2、配置主机tracker01

[root@tracker01 src]# pwd        #确定当前路径
/usr/src
[root@tracker01 src]# ls         #确定有这两个源码包及我的脚本
fastdfs.tar.gz  install.sh  libfastcommon.tar.gz
[root@tracker01 src]# sh install.sh     #执行脚本进行编译安装
tracker server install succees .......   #输出该行信息表示安装成功
[root@tracker01 src]# /etc/init.d/fdfs_trackerd start    #启动trackerd服务
[root@tracker01 src]# netstat -anpt | grep 22122    #确定端口在监听

3、配置主机tracker02

[root@tracker02 src]# pwd   #确定当前路径
/usr/src
[root@tracker02 src]# ls      #确定当前路径有以下我呢见
fastdfs.tar.gz  install.sh  libfastcommon.tar.gz
[root@tracker02 src]# sh install.sh          #执行脚本
tracker server install succees ....... 
[root@tracker02 src]# /etc/init.d/fdfs_trackerd start      #启动tracker服务
[root@tracker02 src]# netstat -anpt | grep 22122          #确定端口在监听

4、配置主机storage01

#编译安装fast DFS及libfast
[root@storage01 src]# tar zxf fastdfs.tar.gz 
[root@storage01 src]# tar zxf libfastcommon.tar.gz 
[root@storage01 src]# cd libfastcommon/
[root@storage01 libfastcommon]# ./make.sh && ./make.sh install
[root@storage01 libfastcommon]# cd ../fastdfs/
[root@storage01 fastdfs]# ./make.sh && ./make.sh install
[root@storage01 fastdfs]# cd conf
[root@storage01 conf]# cp mime.types http.conf /etc/fdfs/
[root@storage01 conf]# cd ../../
#解压nginx第三方模块复制到指定路径
[root@storage01 src]# tar zxf fastdfs-nginx-module.tar.gz 
[root@storage01 src]# cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
#修改storage配置文件
[root@storage01 src]# cd /etc/fdfs/
[root@storage01 fdfs]# cp storage.conf.sample storage.conf
[root@storage01 fdfs]# vim storage.conf    #修改配置文件如下
group_name=group1
bind_addr=192.168.20.5
base_path=/storage/fastdfs     #数据和日志目录地址
store_path0=/storage/fastdfs    #第一个存储目录和base_path路径相同
#以下是指定tracker-server的监听地址
tracker_server=192.168.20.3:22122
tracker_server=192.168.20.4:22122
http.server_port=8888          #http访问文件的端口
[root@storage01 fdfs]# vim mod_fastdfs.conf         #编辑此文件
base_path=/storage/fastdfs
tracker_server=192.168.20.3:22122
tracker_server=192.168.20.4:22122
storage_server_port=23000
group_name=group1  
url_have_group_name = true          #当group有多个的时候需要更改为true,以组名去访问
store_path0=/storage/fastdfs
group_count = 2
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/storage/fastdfs/
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/storage/fastdfs/
#编辑完成后,保存退出即可
[root@storage01 conf]# mkdir -p /storage/fastdfs/   #创建所需目录
#编译安装nginx并添加第三方模块
[root@storage01 conf]# yum -y install openssl-devel pcre-devel
#注意下面的第三方nginx模块路径,要与自己的对应
[root@storage01 fdfs]# cd /usr/src
[root@storage01 src]# tar zxf nginx-1.14.0.tar.gz 
[root@storage01 src]# cd nginx-1.14.0/
[root@storage01 nginx-1.14.0]# ./configure --add-module=/usr/src/fastdfs-nginx-module/src && make && make install
[root@storage01 fdfs]# cd /usr/local/nginx/conf/
[root@storage01 conf]# vim nginx.conf         #编辑nginx主配置文件
#在原来的server字段上面(34行)添加以下内容
    server {
        listen 8888;
        server_name localhost;
        location ~/group[0-9]/M00/ {
                ngx_fastdfs_module;
        }
}
[root@storage01 conf]# /etc/init.d/fdfs_storaged start   #启动storage服务
[root@storage01 conf]# /usr/local/nginx/sbin/nginx      #启动nginx
#确定相关端口在监听
[root@storage01 conf]# netstat -anput | grep 23000
[root@storage01 conf]# netstat -anpt | grep 80
[root@storage01 conf]# netstat -anpt | grep 8888

4、配置主机storage02

[root@storage02 src]# tar zxf fastdfs.tar.gz
[root@storage02 src]#  tar zxf libfastcommon.tar.gz 
[root@storage02 src]# cd libfastcommon/
[root@storage02 libfastcommon]# ./make.sh && ./make.sh install
[root@storage02 libfastcommon]# cd ..cc
[root@storage02 fastdfs]# ./make.sh && ./make.sh install
[root@storage02 fastdfs]# cd conf
[root@storage02 conf]# cp mime.types http.conf /etc/fdfs/
[root@storage02 conf]# cd ../../
[root@storage02 src]#  tar zxf fastdfs-nginx-module.tar.gz 
[root@storage02 src]# cd /etc/fdfs/
#将storage01修改后的配置文件复制到本地
[root@storage02 fdfs]# scp root@192.168.20.5:/etc/fdfs/storage.conf /etc/fdfs/
[root@storage02 fdfs]# scp root@192.168.20.5:/etc/fdfs/mod_fastdfs.conf /etc/fdfs/
#修改复制后的配置文件
[root@storage02 fdfs]# vim storage.conf
group_name=group2
bind_addr=192.168.20.6
[root@storage02 fdfs]# vim mod_fastdfs.conf 
group_name=group2
[root@storage02 fdfs]# mkdir -p /storage/fastdfs/   #创建所需目录
#安装nginx
[root@storage02 fdfs]# cd /usr/src
[root@storage02 src]# tar zxf nginx-1.14.0.tar.gz 
[root@storage02 src]# cd nginx-1.14.0/
[root@storage02 nginx-1.14.0]#  ./configure --add-module=/usr/src/fastdfs-nginx-module/src && make && make install
#更改配置文件
[root@storage02 nginx-1.14.0]# cd /usr/local/nginx/conf/
#将storage01主机的配置文件复制过来即可
[root@storage02 conf]# scp root@192.168.20.5:/usr/local/nginx/conf/nginx.conf .
[root@storage02 conf]# /etc/init.d/fdfs_storaged start   #启动storage服务
[root@storage02 conf]# /usr/local/nginx/sbin/nginx      #启动nginx
#确定相关端口在监听
[root@storage02 conf]# netstat -anput | grep 23000
[root@storage02 conf]# netstat -anpt | grep 80
[root@storage02 conf]# netstat -anpt | grep 8888

5、配置主机nginx提供反向代理功能

[root@nginx ~]# cd  /usr/src
[root@nginx src]# yum -y install openssl-devel pcre-devel
[root@nginx src]# tar zxf nginx-1.14.0.tar.gz 
[root@nginx src]# cd nginx-1.14.0/
[root@nginx nginx-1.14.0]# ./configure && make && make install
[root@nginx nginx-1.14.0]# cd /usr/local/nginx/conf/
[root@nginx conf]# vim nginx.conf
                ...........#省略部分内容
http {               #找到http字段
    include       mime.types;
    default_type  application/octet-stream;
        #添加以下内容
    upstream fdfs_group1 {
        server 192.168.20.5:8888 weight=1 max_fails=2 fail_timeout=30s;
        }
        upstream fdfs_group2 {
        server 192.168.20.6:8888 weight=1 max_fails=2 fail_timeout=30s;
        }
                           ...........#省略部分内容
    server {          #定位到server字段
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
                #添加以下内容
        location ~ /group1 {
                proxy_pass http://fdfs_group1;
}           
        location ~ /group2 {
                proxy_pass http://fdfs_group2;
}
               ...........#省略部分内容
[root@nginx conf]# /usr/local/nginx/sbin/nginx      #启动nginx服务
[root@nginx conf]# netstat -anpt | grep 80         #确定端口在监听

6、客户端验证服务是否可以正常使用

[root@client ~]# cd /usr/src
[root@client src]#  tar zxf libfastcommon.tar.gz
[root@client src]#  tar zxf fastdfs.tar.gz
[root@client src]#  cd libfastcommon/
[root@client libfastcommon]# ./make.sh && ./make.sh install
[root@client libfastcommon]# cd ../fastdfs/
[root@client fastdfs]# ./make.sh && ./make.sh install
[root@client fastdfs]# cd /etc/fdfs/
[root@client fdfs]# mv client.conf.sample client.conf
[root@client fdfs]# vim /etc/fdfs/client.conf
base_path=/storage/fastdfs/
tracker_server=192.168.20.3:22122
tracker_server=192.168.20.4:22122
[root@client fdfs]# ls a.png      #确定当前路径下有这个测试图片
a.png
[root@client fdfs]# mkdir -p /storage/fastdfs
[root@client fdfs]# fdfs_upload_file /etc/fdfs/client.conf a.png    #进行上传
group1/M00/00/00/wKgUBV3d9viAbz_LAAAPXsH7Cms189.png
#上面返回的信息需要保存,访问这个图片时需要
#在终端进行下载
[root@client ~]# mkdir a
[root@client ~]# cd a
[root@client a]# fdfs_download_file /etc/fdfs/client.conf  group1/M00/00/00/wKgUBV3d9viAbz_LAAAPXsH7Cms189.png b.png
[root@client a]# ls
b.png
#ok!成功下载了,并且重命名了

浏览器访问nginx反向代理+上传图片时返回的ID(我这里访问的地址是:http://192.168.20.2/group1/M00/00/00/wKgUBV3d9viAbz_LAAAPXsH7Cms189.png ),测试可以成功访问到图片:

FastDFS原理详解及部署使用

附加踩过的坑:

在我最后浏览器访问验证的时候,总是访问不到上传的图片(client正常上传及下载都没有问题),找了好久原因,最后发现,是因为在配置storage服务器时,没有将/usr/src/fastdfs/conf/目录下的 mime.types和 http.conf 这两个文件复制到/etc/fdfs/目录下。

———————— 本文至此结束,感谢阅读 ————————


新闻名称:FastDFS原理详解及部署使用
URL标题:http://hbruida.cn/article/pcchoh.html