FastDFS

FastDFS介绍

FastDFS(Fast Distributed File System)是一个开源的分布式文件系统,主要用于大规模的分布式存储。它最初是由中国开发者Yu Qiao开发的,旨在提供高性能、可靠性和可扩展性的文件存储解决方案。FastDFS主要用于解决海量文件存储和访问的问题,特别适用于互联网应用中的大规模文件存储需求,如图片、音视频文件等。

以下是FastDFS的一些主要特点和组件:
分布式架构: FastDFS采用分布式架构,文件被分割成若干小块,然后分布式存储在多个存储服务器上,实现了水平扩展,提高了系统的可扩展性和性能。

轻量级协议: FastDFS使用自定义的轻量级协议进行通信,客户端通过这个协议与存储服务器进行交互,实现文件的上传、下载、删除等操作。

Tracker服务器: FastDFS的架构中包含Tracker服务器和Storage服务器。Tracker服务器主要用于协调和管理存储服务器,负责文件的上传、下载请求的调度。

Storage服务器: Storage服务器用于存储实际的文件数据,可以通过横向扩展增加存储容量。每个Storage服务器负责一部分文件的存储和管理。

高性能: FastDFS被设计成高性能的文件存储系统,具有快速的文件上传和下载速度。它采用了一些优化策略,如异步写入、负载均衡等,以提高系统的整体性能。

支持文件同步: FastDFS支持文件的同步功能,可以将文件在多个Storage服务器之间同步,提高文件的可用性和可靠性。

开源: FastDFS是开源的,采用了GPL协议,用户可以根据自己的需求进行定制和扩展。

使用FastDFS的步骤一般包括安装Tracker服务器和Storage服务器,配置客户端,然后通过客户端进行文件的上传和下载操作。由于FastDFS的轻量级设计和分布式存储特性,它在一些需要大规模文件存储和访问的场景中得到了广泛应用。

下载地址

FastDFS:
https://github.com/happyfish100

Nginx:
http://nginx.org/en/download.html

部署的环境

系统环境:Centos 7
gcc:4.8.5

安装运行依赖

yum -y install wget perl gcc gcc-c++ libevent bzip2-devel libxml2 libxslt-devel gd-devel GeoIP-devel

wget下载

wget https://github.com/happyfish100/libfastcommon/archive/refs/tags/V1.0.57.tar.gz
wget https://github.com/happyfish100/libserverframe/archive/refs/tags/V1.1.15.tar.gz
wget https://github.com/happyfish100/fastdfs/archive/refs/tags/V6.08.tar.gz
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/refs/tags/V1.22.tar.gz
wget http://nginx.org/download/nginx-1.18.0.tar.gz

安装 libfastcommon-1.0.57

tar -zxvf V1.0.57.tar.gz
cd libfastcommon-1.0.57
./make.sh clean && ./make.sh && ./make.sh install

查找libfastcommon.so

#/usr/lib存在该文件 则不需要创建软连接 如果没有需要创建
ls -ltr /usr/lib/libfastcommon.so
ls -ltr /usr/lib64/libfastcommon.so

安装 libserverframe-1.1.15

tar -zxvf V1.1.15.tar.gz
cd libserverframe-1.1.15
./make.sh clean && ./make.sh && ./make.sh install

安装 fastdfs-6.08

tar -zxvf V6.08.tar.gz
cd fastdfs-6.08
./make.sh clean && ./make.sh && ./make.sh install

备份fastdfs的配置文件 (一定要做 不可以省略)

cd /etc/fdfs
cp client.conf client.conf.bak
cp storage.conf storage.conf.bak
cp storage_ids.conf storage_ids.conf.bak
cp tracker.conf tracker.conf.bak

fastdfs关联tracker配置

#创建 存储tracker的数据文件和日志文件
mkdir -p /fastdfs/data/fastdfs_tracker
# 设置tracker的数据文件和日志目录
sed -i 's|^base_path = .*|base_path = /fastdfs/data/fastdfs_tracker|' /etc/fdfs/tracker.conf
#启动
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
#检查
netstat -lntup |grep fdfs

fastdfs关联storage配置

#创建storage服务器文件存放路径
mkdir -p /fastdfs/data/fastdfs_storage
mkdir -p /fastdfs/data/fastdfs_storage_data
#编辑安装 fastdfs 软件时产生的storage.conf配置文件
sed -i 's|^base_path = .*|base_path = /fastdfs/data/fastdfs_storage|' /etc/fdfs/storage.conf  #设置storage数据文件和日志目录
sed -i 's|^store_path0 = .*|store_path0 = /fastdfs/data/fastdfs_storage_data|' /etc/fdfs/storage.conf #图片文件实际存储路径
sed -i '0,/^#* *tracker_server =/s/^#* *tracker_server =.*//' /etc/fdfs/storage.conf
sed -i 's|^tracker_server = .*|tracker_server = 10.158.3.76:22122|' /etc/fdfs/storage.conf  #tracker 服务器的 IP地址和端口号
#启动
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
#检查tracker与storage是否整合成功
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

测试fastdfs客户端工具进行文件上传下载

sed -i 's|^base_path = .*|base_path = /fastdfs/data/fastdfs_tracker|' /etc/fdfs/client.conf  # tracker服务器文件路径
sed -i '0,/^#* *tracker_server =/s/^#* *tracker_server =.*//' /etc/fdfs/client.conf 
sed -i 's|^tracker_server = .*|tracker_server = 10.158.3.76:22122|' /etc/fdfs/client.conf #tracker 服务器的 IP地址和端口号
sed -i 's|^http.tracker_server_port = .*|http.tracker_server_port = 8080|' /etc/fdfs/client.conf #tracker 服务的 http.server_port 端口号,必须和tracker配置文件里的设置对应起来

准备需要上传的图片(我的在/root下放了一个123.jpg)

/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/123.jpg

#回显group1/M00/00/00/Cp4DTGWEA-yAXUP-AAFxEz9LpLc848.jpg
如果返回了一个路径,就表示文件已经上传成功了。
组名:group1
磁盘:M00
目录:00/00
文件名称:Cp4DTGWEA-yAXUP-AAFxEz9LpLc848.jpg

查看上传的图片新的信息

/usr/bin/fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/Cp4DTGWEA-yAXUP-AAFxEz9LpLc848.jpg

#回显
GET FROM SERVER: false
file type: normal
source storage id: 0
source ip address: 10.158.3.76
file create timestamp: 2023-12-21 17:22:52
file size: 94483
file crc32: 1061921975 (0x3f4ba4b7)

下载图片

/usr/bin/fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/Cp4DTGWEA-yAXUP-AAFxEz9LpLc848.jpg

查看存储节点状态

/usr/bin/fdfs_monitor /etc/fdfs/client.conf

安装 fastdfs-nginx-module-1.22

tar -zxvf  V1.22.tar.gz 
cd fastdfs-nginx-module-1.22/src

修改fastdfs-nginx-module软件安装包里面的config文件
vim fastdfs-nginx-module-1.22/src/config
删除ngx_module_incs开头的行
删除CORE_INCS开头的行
:wq 保存

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

tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
./configure \
--user=nginxxyz \
--group=nginxxyz \
--with-threads \
--with-file-aio \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_geoip_module=dynamic \
--with-stream_ssl_preread_module \
--with-compat \
--with-pcre-jit \
--prefix=/usr/local/nginx \
--add-module=/opt/fastdfs-nginx-module-1.22/src
如果这里报错 就是 libxml2 libxslt-devel gd-devel GeoIP-devel 依赖没安装成功

#编译 安装
make && make install

编辑修改nginx(nginx.conf)配置文件

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

grep -Ev '#|^$' /usr/local/nginx/conf/nginx.conf
user  root;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    default_type  application/octet-stream;
    include       mime.types;
    sendfile        on;
    keepalive_timeout  65;
server {
        listen      80 ;
        server_name  localhost;

        location / {

        if ($args ~ type=download){
                add_header Content-Disposition "attachment;";
            }
            ngx_fastdfs_module;   #模块名称
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

拷贝fastdfs的配置文件

cp /opt/fastdfs-6.08/conf/http.conf /etc/fdfs/
cp /opt/fastdfs-6.08/conf/mime.types /etc/fdfs/
cp /opt/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/

编辑mod_fastdfs.conf文件 按照我提供的修改 添加

cat /etc/fdfs/mod_fastdfs.conf

#include http.conf
http.default_content_type = application/octet-stream
http.mime_types_filename=/etc/fdfs/mime.types
connect_timeout=2
network_timeout=30
base_path=/fastdfs/data/fastdfs_tracker # 设置storage数据文件和日志目录
load_fdfs_parameters_from_tracker=true
storage_sync_file_max_delay = 86400
use_storage_id = false
storage_ids_filename = storage_ids.conf
tracker_server=10.158.3.76:22122 # tracker服务的IP地址以及端口号
storage_server_port=23000
group_name=group1
url_have_group_name = true
store_path_count=1
store_path0=/fastdfs/data/fastdfs_storage_data # 文件实际存储路径
log_level=info
log_filename=
response_mode=proxy
if_alias_prefix=
flv_support = true
flv_extension = flv
group_count = 2 # 设置组的个数,默认为0,事实上这次只使用了group1
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/fastdfs/data/fastdfs_storage_data
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/fastdfs/data/fastdfs_storage_data

启动nginx

/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#关闭防火墙
systemctl stop firewalld

测试storage的http访问:浏览器访问ip+http端口号

http://10.158.3.76/group1/M00/00/00/Cp4DTGWEA-yAXUP-AAFxEz9LpLc848.jpg

集群 可以后面nginx加上负载均衡

    upstream fdfs_group1 {
      server 127.0.0.1:80; 
    }
    server {
        listen       8080; 
        server_name  localhost;
        location /group1/M00 {
           proxy_pass http://fdfs_group1;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    } 

最后修改:2024 年 02 月 20 日
如果觉得我的文章对你有用,请随意赞赏