什么是FastDFS

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。 特别适合以文件为载体的在线服务,如相册网站、视频网站等等。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。 FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。 存储节点存储文件,完成文件管理的所有功能:就是这样的存储、同步和提供存取接口,FastDFS同时对文件的metadata进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value)方式表示,如:width=1024,其中的key为width,value为1024。文件metadata是文件属性列表,可以包含多个键值对。 跟踪器和存储节点都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。 为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。 在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。 当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

FastDFS架构

null

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

  2. Tracker server作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。

  3. Storage server作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器。

常见术语

  • tracker:追踪者服务器,主要用于协调调度,可以起到负载均衡的作用,记录storage的相关状态信息。

  • storage:存储服务器,用于保存文件以及文件的元数据信息。

  • group:组,同组节点提供冗余备份,不同组用于扩容。

  • mata data:文件的元数据信息,比如长宽信息,图片后缀,视频的帧数等。

FastDFS上传过程

  1. Storage会定时的向Tracker发送心跳,告诉Tracker自己还还活着,这样Fastdfs就可以工作了

  2. 客户端发送上传请求给Tracker,Tracker会检查是否有可用Storage

  3. 如果有可用的,客户端就可以上传文件数据到Storage上

  4. Storage将文件写入磁盘后,会返回路径信息给客户端

  5. 客户端就可以根据这个路径信息找到上传的文件

null

FastDFS下载过程

  1. Storage会定时的向Tracker发送心跳,告诉Tracker自己还还活着,这样Fastdfs就可以工作了

  2. 客户端发送下载请求到Tracker上,Tracker查找到存储的Storage地址后返回给客户端

  3. 客户端拿到Storage地址后,去Storage上找到文件

  4. 把文件返回给客户端

null

FastDFS部署

注:一定要先启动Tracker,在启动Storage

Fastdfs_v5.11下载:https://github.com/happyfish100/fastdfs/tags

libfastcommon_1.0.36下载:https://github.com/happyfish100/libfastcommon/tags

fastdfs-nginx-module1.20下载:https://github.com/happyfish100/fastdfs-nginx-module/tags

nginx-1.12.2下载:https://nginx.org/en/download.html

基础环境安装

yum install -y gcc gcc-c++ 
yum -y install libevent
yum -y install zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net-tools wget

安装libfatscommon函数

mkdir /usr/local/fastDfs/
tar -zxvf libfastcommon-1.0.36.tar.gz -C /usr/local/fastDfs/
#进入libfastcommon目录
cd /usr/local/fastDfs/libfastcommon-1.0.36/
#编译安装
./make.sh
./make.sh install

安装Fastdfs

tar -zxvf fastdfs-5.11.tar.gz -C /usr/local/fastDfs/
进入fastdfs-5.11
cd /usr/local/fastDfs/fastdfs-5.11/
#编译
./make.sh
./make.sh install

编译成功之后会在/etc/fdfs目录下生成四个文件:

null

进行拷贝,以备用

cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp storage_ids.conf.sample storage_ids.conf
cp tracker.conf.sample tracker.conf

再将/usr/local/fastDfs/fastdfs-5.11/conf文件夹中的http.conf和mime.types拷贝到 /etc/fdfs/中

cp http.conf /etc/fdfs/
cp mime.types /etc/fdfs/

配置Tracker

创建文件夹:即用于存储Tracker的数据文件和日志文件等。此路径在后续的Tracker文件配置中都用到

mkdir /data/fastdfs/tracker -p

修改/etc/fdfs目录下的tracker.conf配置文件,修改Tracker的数据文件和日志文件等的存储路径

vim tracker.conf
base_path=/data/fastdfs/tracker

配置完毕后,启动tracker服务器

service fdfs_trackerd start

启动成功后,可以在刚创建的文件夹中(/data/fastdfs/tracker)找到两个新文件

ls /data/fastdfs/tracker
data  logs

配置Storage

创建文件夹:创建Storage服务器的文件目录storage和存储路径目录storage_data

mkdir /data/fastdfs/storage
mkdir /data/fastdfs/storage_data

修改storage的配置文件:

cd /etc/fdfs/
vim storage.conf
base_path=/data/fastdfs/storage  #日志存放目录
store_path0=/data/fastdfs/storage_data #文件存储路径
tracker_server=100.100.137.13:22122 tracker的地址

配置完成后,开始启动Storage。注意:必须要开启Tracker

service fdfs_storaged start

启动成功后,可以在storage_data中看到生成的data文件夹

[root@fastdfs fdfs]# cd /data/fastdfs/storage_data/
[root@fastdfs storage_data]# ls
data
[root@fastdfs storage_data]# cd data/
[root@fastdfs data]# ls
00  08  10  18  20  28  30  38  40  48  50  58  60  68  70  78  80  88  90  98  A0  A8  B0  B8  C0  C8  D0  D8  E0  E8  F0  F8
01  09  11  19  21  29  31  39  41  49  51  59  61  69  71  79  81  89  91  99  A1  A9  B1  B9  C1  C9  D1  D9  E1  E9  F1  F9
02  0A  12  1A  22  2A  32  3A  42  4A  52  5A  62  6A  72  7A  82  8A  92  9A  A2  AA  B2  BA  C2  CA  D2  DA  E2  EA  F2  FA
03  0B  13  1B  23  2B  33  3B  43  4B  53  5B  63  6B  73  7B  83  8B  93  9B  A3  AB  B3  BB  C3  CB  D3  DB  E3  EB  F3  FB
04  0C  14  1C  24  2C  34  3C  44  4C  54  5C  64  6C  74  7C  84  8C  94  9C  A4  AC  B4  BC  C4  CC  D4  DC  E4  EC  F4  FC
05  0D  15  1D  25  2D  35  3D  45  4D  55  5D  65  6D  75  7D  85  8D  95  9D  A5  AD  B5  BD  C5  CD  D5  DD  E5  ED  F5  FD
06  0E  16  1E  26  2E  36  3E  46  4E  56  5E  66  6E  76  7E  86  8E  96  9E  A6  AE  B6  BE  C6  CE  D6  DE  E6  EE  F6  FE
07  0F  17  1F  27  2F  37  3F  47  4F  57  5F  67  6F  77  7F  87  8F  97  9F  A7  AF  B7  BF  C7  CF  D7  DF  E7  EF  F7  FF
[root@fastdfs data]#

查看一下这两个服务状态

[root@fastdfs ~]# netstat -lntup |grep fdfs
tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      17494/fdfs_trackerd
tcp        0      0 0.0.0.0:23000           0.0.0.0:*               LISTEN      17891/fdfs_storaged

确定了storage服务器启动成功后,还有一项工作就是看看storage服务器是否已经登记到 tracker服务器(也可以理解为tracker与storage是否整合成功),运行以下命令:

[root@fastdfs ~]# /usr/bin/fdfs_monitor /etc/fdfs/storage.conf
[2025-02-10 00:22:29] DEBUG - base_path=/data/fastdfs/storage, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0

server_count=1, server_index=0

tracker server is 100.100.137.13:22122   #tracker地址

group count: 1

Group 1:
group name = group1
disk total space = 102349 MB
disk free space = 97714 MB
trunk free space = 0 MB
storage server count = 1
active server count = 1
storage server port = 23000
storage HTTP port = 8888
store path count = 1
subdir count per path = 256
current write server index = 0
current trunk file id = 0

    Storage 1:
        id = 100.100.137.13
        ip_addr = 100.100.137.13 (fastdfs)  ACTIVE  看到这里说明整合成功
        http domain =
        version = 5.11
        join time = 2025-02-10 00:19:11
        up time = 2025-02-10 00:19:11
        total storage = 102349 MB
        free storage = 97714 MB
        upload priority = 10
        store_path_count = 1
        subdir_count_per_path = 256
        storage_port = 23000
        storage_http_port = 8888
        current_write_path = 0
        source storage id =
        if_trunk_server = 0
        connection.alloc_count = 256
        connection.current_count = 0
        connection.max_count = 0
        total_upload_count = 0
        success_upload_count = 0
        total_append_count = 0
        success_append_count = 0
        total_modify_count = 0
        success_modify_count = 0
        total_truncate_count = 0
        success_truncate_count = 0
        total_set_meta_count = 0
        success_set_meta_count = 0
        total_delete_count = 0
        success_delete_count = 0
        total_download_count = 0
        success_download_count = 0
        total_get_meta_count = 0
        success_get_meta_count = 0
        total_create_link_count = 0
        success_create_link_count = 0
        total_delete_link_count = 0
        success_delete_link_count = 0
        total_upload_bytes = 0
        success_upload_bytes = 0
        total_append_bytes = 0
        success_append_bytes = 0
        total_modify_bytes = 0
        success_modify_bytes = 0
        stotal_download_bytes = 0
        success_download_bytes = 0
        total_sync_in_bytes = 0
        success_sync_in_bytes = 0
        total_sync_out_bytes = 0
        success_sync_out_bytes = 0
        total_file_open_count = 0
        success_file_open_count = 0
        total_file_read_count = 0
        success_file_read_count = 0
        total_file_write_count = 0
        success_file_write_count = 0
        last_heart_beat_time = 2025-02-10 00:22:14
        last_source_update = 1969-12-31 19:00:00
        last_sync_update = 1969-12-31 19:00:00
        last_synced_timestamp = 1969-12-31 19:00:00

配置客户端client

cd /etc/fdfs/
vim client.conf
base_path=/data/fastdfs/tracker #tracker的路径
tracker_server=100.100.137.13:22122 #tracker的地址

配置完成后,进行初步测试:编写一个文件

echo 123456 > /root/test.txt

执行客户端上传命令进行测试

[root@fastdfs fdfs]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/test.txt
group1/M00/00/00/ZGSJDWepjhSABhUTAAAAByXX7BE205.txt
组名   磁盘  目录    文件名

返回的路径就是文件的存储目录,在/data/fastdfs/storage_data/目录下 至此,测试成功 想在web段查看上次存储的文件,需要安装nginx和fastdfs-nginx-module

安装fastdfs-nginx-module

tar -zxvf fastdfs-nginx-module-1.20.tar.gz -C /usr/local/fastDfs/
cd /usr/local/fastDfs/fastdfs-nginx-module-1.20/
cp src/mod_fastdfs.conf /etc/fdfs/
修改mod_fastdfs.conf的内容
vim /etc/fdfs/mod_fastdfs.conf
tracker_server=100.100.137.13:22122 #tracker地址
url_have_group_name = true
store_path0=/data/fastdfs/storage_data #storage存储路径目录

修改fastdfs-nginx-module-1.20/src/config文件,修改如下:(为了解决后面Nginx编译失败)

ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

null

插件配置完毕

安装NGINX

tar -xf nginx-1.12.2.tar.gz -C /usr/local/fastDfs/
cd /usr/local/fastDfs/nginx-1.12.2/
对Nginx重新config(就是把上面的nginx插件加入到Nginx中)
先查询插件的解压路径(我的在/usr/local/fastDfs/fastdfs-nginx-module-1.20/src)
查询后填写在module=后面
./configure --add-module=/usr/local/fastDfs/fastdfs-nginx-module-1.20/src
make
make install

编辑nginx.conf

#location放在server里面
location ~/group1/M00 {
            root /data/fastdfs/storage_data;
            ngx_fastdfs_module;
        }

重新启动nginx

访问域名或者ip加上后缀group1/M00/00/00/ZGSJDWepjhSABhUTAAAAByXX7BE205.txt

[root@fastdfs nginx]# curl 127.0.0.1/group1/M00/00/00/ZGSJDWepjhSABhUTAAAAByXX7BE205.txt
123456

至此,全部完成

results matching ""

    No results matching ""