FastDFS 分布式文件系统

1. FastDFS简介

FastDFS 是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件

访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服

务,如相册网站、视频网站等等。

FastDFS 服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在

访问上起负载均衡的作用。存储节点存储文件,完成文件管理的所有功能:存储、同步和提供存取接口。

FastDFS 同时对文件的 meta data 进行管理。所谓文件的 meta data 就是文件的相关属性,以键值对(key

value pair)方式表示,如:width=1024,其中的 key 为 width,value 为 1024。文件 meta data 是文件属

性列表,可以包含多个键值对。FastDFS 系统结构如下图所示:

在这里插入图片描述

跟踪器存储节点都可以由一台多台服务器构成。

跟踪器存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。

为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。

存储系统由一个或多个组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。

一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。

在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。

当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

FastDFS 中的文件标识分为两个部分:卷名和文件名,二者缺一不可。

2. 相关术语

Tracker Server:跟踪服务器,主要做调度工作,在访问上起负载均衡的作用。记录storage server的状态,是连接Client和Storage server的枢纽。
Storage Server:存储服务器,文件和meta data都保存到存储服务器上
group:组,也可称为卷。同组内服务器上的文件是完全相同的
文件标识:包括两部分:组名和文件名(包含路径)
meta data:文件相关属性,键值对(Key Value Pair)方式,如:width=1024,heigth=768

3. 同步机制

  1. 同一组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行;
  2. 文件同步只在同组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器;
  3. 源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了;
  4. 上述第二条规则有个例外,就是新增加一台storage server时,由已有的一台storage server将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器。

4. FastDFS上传文件交互过程

在这里插入图片描述

  1. client 询问 tracker 上传到的 storage,不需要附加参数;

  2. tracker 返回一台可用的 storage;

  3. client 直接和 storage 通讯完成文件上传。

客户端 client 发起对 FastDFS 的文件传输动作,是通过连接到某一台 Tracker Server 的指定端

口来实现的,Tracker Server 根据目前已掌握的信息,来决定选择哪一台 Storage Server ,然后将这个

Storage Server 的地址等信息返回给 client,然后 client 再通过这些信息连接到这台 Storage Server,

将要上传的文件传送到给 Storage Server 上。

5. FastDFS下载文件交互过程

在这里插入图片描述

  1. client 询问 tracker 下载文件的 storage,参数为文件标识(卷名和文件名);

  2. tracker 返回一台可用的 storage;

  3. client 直接和 storage 通讯完成文件下载。

6. 运行时目录结构

6.1 Tracker server (跟踪服务器)

在这里插入图片描述

6.2 Storage server (存储服务器)

在这里插入图片描述

7. 网上资源

FastDFS论坛

源码地址

下载地址

8. 单节点安装方式

Tracker server和Storage server 执行相同的操作

8.1 编译和安装所需的依赖包

[root@localhost ~]# yum install make cmake gcc gcc-c++

8.2 安装 libfastcommon

  1. 上传或下载 libfastcommon-master.zip 到/usr/local/src 目录

  2. 解压

    [root@localhost ~]# cd /usr/local/src
    [root@localhost src]# unzip libfastcommon-master.zip
    [root@localhost src]# cd libfastcommon-master
    

在这里插入图片描述

  1. 编译、安装
[root@localhost libfastcommon-master]# ./make.sh
[root@localhost libfastcommon-master]# ./make.sh install

libfastcommon 默认安装到了:

/usr/lib64/libfastcommon.so

/usr/lib64/libfdfsclient.so

  1. 因为 FastDFS 主程序设置的 lib 目录是/usr/local/lib,所以需要创建软链接
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so

8.3 安装 FastDFS

  1. 上传或下载 FastDFS 源码包(FastDFS_v5.05.tar.gz)到 /usr/local/src 目录
  2. 解压
# cd /usr/local/src/
# tar -zxvf FastDFS_v5.05.tar.gz
# cd FastDFS

在这里插入图片描述

  1. 编译、安装(编译前要确保已经成功安装了 libfastcommon)
# ./make.sh
# ./make.sh install

采用默认安装的方式安装,安装后的相应文件与目录:

A、服务脚本在:

/etc/init.d/fdfs_storaged
/etc/init.d/fdfs_tracker

B、配置文件在(样例配置文件):

/etc/fdfs/client.conf.sample
/etc/fdfs/storage.conf.sample
/etc/fdfs/tracker.conf.sample

C、命令工具在/usr/bin/目录下的:

fdfs_appender_test
fdfs_appender_test1
fdfs_append_file
fdfs_crc32
fdfs_delete_file
fdfs_download_file
fdfs_file_info
fdfs_monitor
fdfs_storagedfdfs_test
fdfs_test1
fdfs_trackerd
fdfs_upload_appender
fdfs_upload_file
stop.sh
restart.sh
  1. 因为 FastDFS 服务脚本设置的 bin 目录是/usr/local/bin,但实际命令安装在/usr/bin,可以进入

    /user/bin 目录使用以下命令查看 fdfs 的相关命令:

    # cd /usr/bin/
    # ls | grep fdfs
    

在这里插入图片描述

因此需要修改 FastDFS 服务脚本中相应的命令路径,也就是把/etc/init.d/fdfs_storaged

/etc/init.d/fdfs_tracker 两个脚本中的/usr/local/bin 修改成/usr/bin

# vi fdfs_trackerd

使用查找替换命令进统一修改(vi/vim命令):

%s+/usr/local/bin+/usr/bin
# vi fdfs_storaged

使用查找替换命令进统一修改:

%s+/usr/local/bin+/usr/bin

8.4 配置跟踪器

  1. 复制FastDFS跟踪器样例配置文件,并重命名

    # cd /etc/fdfs/
    

在这里插入图片描述

# cp tracker.conf.sample tracker.conf
  1. 编辑跟踪器配置文件:
# vi /etc/fdfs/tracker.conf

修改如下内容:

disabled=false
port=22122
base_path=/fastdfs/tracker

其它参数保留默认配置。

  1. 创建基础数据目录(参考基础目录base_path的配置)
mkdir -p /fastdfs/tracker
  1. 防火墙中打开跟踪器端口(设置的22122)
firewall-cmd --zone=public --add-port=22122/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-prots #查看端口是否开放成功

CentOS6(iptables防火墙方式)下设置方式

vi /etc/sysconfig/iptables
#添加如下端口行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT
重启防火墙:
service iptables restart
  1. 启动Tracker跟踪服务器
/etc/init.d/fdfs_trackerd start

初次成功启动,会在/fastdfs/tracker 目录下创建 data、logs 两个目录

查看 FastDFS Tracker 是否已成功启动:

ps -ef | grep fdfs

在这里插入图片描述

  1. 关闭Tracker跟踪服务器
/etc/init.d/fdfs_trackerd stop
  1. 设置 FastDFS 跟踪器开机启动:

    vi /etc/rc.d/rc.local 
    

    添加以下内容:

    /etc/init.d/fdfs_trackerd start
    

8.5 配置存储器

  1. 复制 FastDFS 存储器样例配置文件,并重命名:

    cd /etc/fdfs/
    

在这里插入图片描述

# cp storage.conf.sample storage.conf
  1. 编辑存储器样例配置文件

    # vi /etc/fdfs/storage.conf
    

    修改如下内容:

    disabled=false
    port=23000
    base_path=/fastdfs/storage
    store_path0=/fastdfs/storage
    tracker_server=192.168.4.121:22122 #跟踪服务器地址及端口
    http.server_port=8888
    

    其它参数保留默认配置。

  2. 创建基础数据目录(参考基础目录 base_path 配置)

    mkdir -p /fastdfs/storage
    
  3. 防火墙中打开存储器端口(默认为23000)

    firewall-cmd --zone=public --add-port=23000/tcp --permanent
    firewall-cmd --reload
    firewall-cmd --list-ports #查看端口是否开放成功
    

    CentOS6(iptables防火墙方式)下设置方式

    vi /etc/sysconfig/iptables
    #添加如下端口行:
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT
    重启防火墙:
    service iptables restart
    
  4. 启动Storage存储服务器

    # /etc/init.d/fdfs_storaged start
    

    初次成功启动,会在/fastdfs/tracker 目录下创建 data、logs 两个目录

    查看 FastDFS Tracker 是否已成功启动:

    ps -ef | grep fdfs
    

在这里插入图片描述

  1. 关闭Storage存储服务器

    /etc/init.d/fdfs_storaged stop
    
  2. 设置FastDFS存储服务器开机启动

    # vi /etc/rc.d/rc.local
    

    添加如下行:

    /etc/init.d/fdfs_storaged start
    

9. 文件上传测试

  1. 修改 Tracker 服务器中的客户端配置文件

    cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
    vi /etc/fdfs/client.conf
    
    base_path=/fastdfs/tracker
    tracker_server=192.168.4.121:22122
    
  2. 执行文件上传命令:

    # /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/FastDFS_v5.05.tar.gz
    

    返回 ID 号:group1/M00/00/00/wKgEfVUYNYeAb7XFAAVFOL7FJU4.tar.gz

    能返回以上文件 ID,说明文件上传成功。

10. 在每个存储节点上安装 nginx

  1. fastdfs-nginx-module 作用说明

    FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。假设 Tracker 服务器将文件上传到了 192.168.4.125,上传成功后文件 ID已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.4.126,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.4.126 上取文件,就会出现文件无法访问的错误。而 fastdfs-nginx-module 可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
    

    (解压后的 fastdfs-nginx-module 在 nginx 安装时使用)

  2. 上传 fastdfs-nginx-module_v1.16.tar.gz 到 /usr/local/src

  3. 执行解压

    cd /usr/local/src/
    tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
    
  4. 修改 fastdfs-nginx-module 的 config 配置文件

    # cd fastdfs-nginx-module/src
    # vi config
    CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"
    修改为:
    CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
    (注意:这个路径修改是很重要的,不然在 nginx 编译的时候会报错的)
    
  5. 上传 Nginx(nginx-1.6.2.tar.gz)到/usr/local/src 目录

  6. 安装编译 Nginx 所需的依赖包

    yum install gcc gcc-c++ make automake autoconf libtool pcre* zlib openssl openssl-devel
    
  7. 编译安装 Nginx(添加 fastdfs-nginx-module 模块)

    cd /usr/local/src/
    tar -zxvf nginx-1.6.2.tar.gz
    cd nginx-1.6.2
    ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src
    make && make install
    
  8. 复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录,并修改

    cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
    vi /etc/fdfs/mod_fastdfs.conf
    
    修改以下配置:
    connect_timeout=10
    base_path=/tmp
    tracker_server=192.168.4.121:22122
    storage_server_port=23000
    group_name=group1
    url_have_group_name = true
    store_path0=/fastdfs/storage
    
  9. 复制 FastDFS 的部分配置文件到/etc/fdfs 目录

    cd /usr/local/src/FastDFS/conf
    cp http.conf mime.types /etc/fdfs/
    
  10. 在/fastdfs/storage 文件存储目录下创建软连接,将其链接到实际存放数据的目录

    ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00
    
  11. 配置 Nginx

    简洁版 nginx 配置样例:

    user root;
    worker_processes 1;
    events {
    	worker_connections 1024;
    }
    http {
    	include mime.types;
    	default_type application/octet-stream;
    	sendfile on;
    	keepalive_timeout 65;
    	server {
    		listen 8888;
    		server_name localhost;
    		location ~/group([0-9])/M00 {
    			#alias /fastdfs/storage/data;
    			ngx_fastdfs_module;
    		}
    		error_page 500 502 503 504 /50x.html;
    		location = /50x.html {
    			root html;
    		}
    	}
    }
    

    注意、说明:

    A、8888端口值是要与/etc/fdfs/storage.conf 中的 http.server_port=8888 相对应,因为 http.server_port 默认为 8888,如果想改成 80,则要对应修改过来。
    
    B、Storage 对应有多个 group 的情况下,访问路径带 group 名,如/group1/M00/00/00/xxx,
    对应的 Nginx 配置为:
    location ~/group([0-9])/M00 {
    	ngx_fastdfs_module;
    }
    
    C、如查下载时如发现404错误,将 nginx.conf 第一行 user nobody 修改为 user root 后重新启动
    
  12. 防火墙中打开 Nginx 的 8888 端口

    firewall-cmd --zone=public --add-port=8888/tcp --permanent
    firewall-cmd --reload
    firewall-cmd --list-ports #查看端口是否开放成功
    

    CentOS6(iptables防火墙方式)下设置方式

    vi /etc/sysconfig/iptables
    #添加如下端口行:
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 8888 -j ACCEPT
    重启防火墙:
    service iptables restart
    
  13. 启动 Nginx

    /usr/local/nginx/sbin/nginx
    

    (重启 Nginx 的命令为:/usr/local/nginx/sbin/nginx -s reload)

  14. 通过浏览器访问测试时上传的文件

    http://192.168.4.125:8888/group1/M00/00/00/wKgEfVUYNYeAb7XFAAVFOL7FJU4.tar.gz

注意:千万不要使用 kill -9 命令强杀 FastDFS 进程,否则可能会导致 binlog 数据丢失

11. FastDFS Java客户端使用

在这里插入图片描述
如果配置文件放置在最终的jar包中,不能使用文件的绝对路径来对去文件(类:File/FileRead),要使用InputStream来读取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值