FastDFS

Posted 何波安的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FastDFS相关的知识,希望对你有一定的参考价值。

FastDFS简介

FastDFS是一个开源的高性能分布式文件系统,它的主要功能包括文件存储,文件上传和文件下载,解决高容量和负载均衡问题。FastDFS应该满足基于照片共享站点和视频共享站点等文件服务的网站的要求。

支持存储服务器在线扩容,支持相同的文件只保存一份,节约磁盘。
FastDFS只能通过Client API访问,不支持POSIX访问方式。
FastDFS适合中大型网站使用,用来存储资源文件(如:图片、文档、视频等)

 

FastDFS有两个角色

tracker server(跟踪器):跟踪器负责文件访问的调度和负载平衡

storage server(存储器):存储器负责文件管理,包括文件存储,文件同步,文件提供存取接口它还管理作为表示文件的键值对的属性的元数据

跟踪器和存储包含一个或多个服务器。跟踪器或存储群集中的服务器可随时添加到群集或从群集中删除,而不影响在线服务。跟踪器集群中的服务器是对等的

由文件卷/组织组织的存储服务器获得高容量。存储系统包含一个或多个文件在这些卷中独立的卷。整个存储系统的容量等于所有容量的总和。文件卷包含一个或多个在这些服务器中文件相同的存储服务器。文件卷中的服务器相互备份,所有这些服务器都是负载均衡。将存储服务器添加到卷时,将自动将此卷中已有的文件复制到此新服务器,并且在完成此复制时,系统会将此服务器联机切换到提供存储服务

1)Tracker cluster中各个tracker server相互独立,不进行相互通信。
2)Storage cluster中各个storage组(Volume1,Volume2...)相互独立,不进行相互通信,也就是说各个组之间保存的数据是不相同的。但是各个组中的storage server之间是属于互相备份的关系,也就是说storage server之间保存相同的数据。
3)每个storage server会启动一个单独的线程主动向Tracker cluster中每个tracker server报告其状态信息,包括磁盘使用情况,文件同步情况及文件上传下载次数统计等信息。

文件上传

1)Client通过Tracker server将文件上传到Storage server。
2)Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
3)Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。
4)上传完成,Storage server返回Client一个文件ID,文件上传结束。

文件下载

1)Client通过Tracker server下载指定Storage组中某个Storage server上的某个文件(文件名包括Storage组名称)。
2)Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
3)Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件下载。

安装配置FastDFS

yum groupinstall "Development Tools" "Server platform Development"
mkdir /home/heboan/tools

下载并安装FastDFS依赖包libfastcommon

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

下载安装FastDFS

下载安装FastDFS
cd /home/heboan/tools
git clone https://github.com/happyfish100/fastdfs.git
cd fastdfs/
./make.sh 
./make.sh install

注意:这里我把tracker和storage服务器安装在同一台机,如果安装在不同的机器上都要执行以上操作

配置tracker server(跟踪服务器)

1)、复制tracker server和client端样例文件并重命名
    cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
    cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
2)、编辑tracker server配置文件tracker.conf,需要修改的内容如下:
    disabled=false
    port=22122
    base_path=/data/fdfs/tracker
3)、编辑client端的配置文件client.conf,需要修改的内容如下:
    base_path=/data/fdfs/client
    tracker_server=192.168.88.1:22122
4)、创建tracker server数据目录
    mkdir -p /data/fdfs/tracker
5)、启动tracker server
    /etc/init.d/fdfs_trackerd start
    netstat -lntp|grep 22122

配置storage server(存储服务器)

1)、复制storage server样例配置文件并重命名
    cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
2)、编辑storage server配置文件storage.conf,需要修改的内容如下:
    disabled=false
    port=23000
    base_path=/data/fdfs/storage
    tracker_server=192.168.88.1:22122
    store_path0=/data/fdfs/storage
    http.server_port=8888     #默认为8888,nginx中配置的监听端口那之一致
3)、创建storage server数据目录
    mkdir -p /data/fdfs/storage
4)、启动storage server,启动成功会自动在/data/fdfs/tracker目录新建data和logs目录
    #启动storage server的前提是tracker server必须事先已启动
    /etc/init.d/fdfs_storaged start
    netstat -lntp|grep 23000

文件上传/查看/下载测试

文件上传/查看/下载测试
    # fdfs_upload_file /etc/fdfs/client.conf /home/heboan/win8.png
    group1/M00/00/00/wKhYAVoumUyALZFGAATNsxTPz7I070.png  #返回文件ID说明文件已经上传成功
    
    # fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKhYAVoumUyALZFGAATNsxTPz7I070.png
    source storage id: 0
    source ip address: 192.168.88.1
    file create timestamp: 2017-12-11 22:42:20
    file size: 314803
    file crc32: 349163442 (0x14CFCFB2)
    
    # fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKhYAVoumUyALZFGAATNsxTPz7I070.png /tmp/win8.jpg

查看存储节点状态

fdfs_monitor /etc/fdfs/client.conf

####配置nginx为storage server提供http访问接口####

下载fastdfs-nginx-module

cd /home/heboan/tools
git clone https://github.com/happyfish100/fastdfs-nginx-module.git

拷贝fastdfs-nginx-module模块中配置文件到/etc/fdfs目录中并编辑

# cp /home/heboan/tools/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
# vim /etc/fdfs/mod_fastdfs.conf   修改内容如下
    connect_timeout=10
    base_path=/tmp
    tracker_server=192.168.88.1:22122
    storage_server_port=23000
    url_have_group_name = true
    store_path0=/data/fdfs/storage
    group_name=group1

    ...
    [group1]
    group_name=group1
    storage_server_port=23000
    store_path_count=1
    store_path0=/data/fdfs/storage

  

下载nginx源码,并编译支持FastDFS

yum install openssl-devel pcre-devl
cd /home/heboan/tools
useradd -r nginx
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar xf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure --prefix=/opt/nginx-1.12.2 --user=nginx --group=nginx --add-module=../fastdfs-nginx-module/src/
make && make install
ln -s /opt/nginx-1.12.2 /opt/nginx

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

cp /home/tools/fastdfs/conf/http.conf /etc/fdfs/
cp /home/tools/fastdfs/conf/mime.types /etc/fdfs/

做软链接

ln -s  /data/fdfs/storage/data   /data/fdfs/storage/data/M00

配置nginx

vim /opt/nginx/conf/nginx.conf
    ...
    server {
        listen       8888;  #888端口号与/etc/fdfs/storage.conf中的http.server_port=8888相对应
        server_name  localhost;
        location ~/group/M00 {
            ngx_fastdfs_module;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        root   html;
        }
    }

启动nginx,通过浏览器访问之前已经上传的文件

/opt/nginx/sbin/nginx -t
/opt/nginx/sbin/nginx
访问http://192.168.88.1:8888/group1/M00/00/00/wKhYAVoumUyALZFGAATNsxTPz7I070.png

 

集群模式

tracker配置

tracker cluster中各个tracker server相互独立,不进行相互通信,所以两台部署是一样的

具体部署过程参考上面

 

storage配置(storage四台服务器全都要做)

storage.conf
    disabled=false
    group_name=group1               (第一组为group1,第二组为group2)
    port=2300                       同一组的storage端口号必须相同
    base_path=/data/fdfs/storage    设置storage的日志目录
    store_path0=/data/fdfs/storage  存储路径
    store_path_count=1              存储路径的个数,需要和store个数匹配
    tracker_server=xxxxxx:xxxx      tracker服务器的ip地址和端口
    tracker_server=xxxxxx:xxxx      多个tracker直接添加多条配置
    http.server_port=8888           设置http端口号 

说明:一台storage只会选择一个tracker服务器,一台tracker服务器挂掉,会接着选择另外一台tracker服务器

记得创建数据和日志目录:/data/fdfs/storage

查看storage服务器的具体信息,可以用于监控,任意一台storage服务器

fdfs_monitor /etc/fdfs/storage.conf

 

上传文件测试

在tracker服务器上测试(任意一台)
    fdfs_upload_file   /etc/fdfs/client.conf  /usr/local/src/fastdfs-5.05.tar.gz 
storage服务器检测一下:
    cd  /data/fdfs/storage/data/00/00;ls

 

在每个storage服务器安装nginx(在storage上安装的nginx主要为了提供http的访问服务,同时解决group中storage服务器的同步延迟问题。)

fastdfs-nginx-module下载,编辑安装nginx并加入fastdfs-nginx-module(操作步骤查看前面)

拷贝nginx-module配置文件(mod_fastdfs.conf )到/etc/fdfs下并修改

connect_timeout=2
network_timeout=30
base_path=/tmp
load_fdfs_parameters_from_tracker=true
storage_sync_file_max_delay = 86400
use_storage_id = false
storage_ids_filename = storage_ids.conf
tracker_server=192.168.88.1:22122
tracker_server=192.168.88.2:22122
storage_server_port=23000
group_name=group1    #group1 的配置文件为group1  group2的配置文件为group2  其余不变
url_have_group_name = true
store_path_count=1
store_path0=/fastdfs/storage
log_level=info
log_filename=
response_mode=proxy
if_alias_prefix=
flv_support = true
flv_extension = flv
group_count = 2
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/fastdfs/storage
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/fastdfs/storage

复制fastdfs的配置文件到/etc/fdfs下(http.conf , mime.types)

做软链接

ln -s  /data/fdfs/storage/data   /data/fdfs/storage/data/M00

修改nginx配置

user  root;
listen       8888;
location ~/group([0-9])/M00 {
   ngx_fastdfs_module;
}

启动nginx

测试结论

在任意一台storage服务器上使用fdfs_upload_file命令来上传文件,会根据内置的调度算法存储到group1,或者group2

这里我们假设被存储到了group1:那么这个文件就会被存储到88.3、88.4的主机上,一个组 内的机机器上的数据是一致的

虽然数据只是被存储到group1上,因为group1和group2是在一个集群里面。所以,通过访问集群里面的任意一台机器(88.3-88.4-88.5-88.6)都可以访问获取到这个文件

例如:

http://192.168.56.88.3:8888/group1/M00/00/00/wKg4iViD5pGASNhIAAUggSnIHZU.tar.gz 

http://192.168.56.88.4:8888/group2/M00/00/00/wKg4iViD5pGASNhIAAUggSnIHZU.tar.gz 

http://192.168.56.88.5:8888/group3/M00/00/00/wKg4iViD5pGASNhIAAUggSnIHZU.tar.gz 

http://192.168.56.88.6:8888/group4/M00/00/00/wKg4iViD5pGASNhIAAUggSnIHZU.tar.gz 

 

fastdfs的高可用 在安装一台nginx分别代理所有group的nginx

  1. 此台nginx 可以安装在两台tracker上面,用keepalived做高可用,目的反向代理

  2. 所有storage上面的nginx 是目标重定向用的防止找不到下载文件,因为同步延迟

upstream  group1 {
 server 192.168.88.3:8888;
 server 192.168.88.4:8888;
}
upstream  group2 {
 server 192.168.88.6:8888;
 server 192.168.88.7:8888;
}

server {
	listen   80 default_server;
	location /group1/M00 {
	    proxy_pass http://group1;
	}
	location /group2/M00 {
	    proxy_pass http://group2;
	}
}

 

以上是关于FastDFS的主要内容,如果未能解决你的问题,请参考以下文章

分布式文件服务器FastDFS之“文件上传后(JAVA),前(AngularJS)端代码"

Java实现FastDFS文件上传下载和删除

Java实现FastDFS文件上传下载和删除

FastDFS - 文件服务器学习资料

关于 go-fastdfs-web 的SpringBoot 后台管理

django中使用FastDFS分布式文件系统接口代码实现文件上传下载更新删除