# FastDFS
:一个文件服务器,不提供 Web UI 。
- GitHub (opens new window)
- 2008 年,由中国工程师余庆开源,采用 C 语言开发。
- 基于 TCP 通信。
- 特点:
- 提供了文件存储、上传、下载等功能,适合存储大量的小型文件。
- 支持分布式部署。
# 原理
FastDFS 的服务器分为两种角色:
- tracker server
- :负责处理客户端的访问请求,并将请求经过负载均衡之后重定向到某个 storage 。
- 当客户端发出下载文件的请求时,tracker 会回复该文件存储在哪个 storage 上的哪个路径。然后,客户端再访问相应的 storage ,下载文件。
- 可以部署多个 tracker 实例,提高可用性。
- 部署了多个 tracker 时,应该再部署一个 Nginx 对它们进行反向代理、负载均衡,让客户端统一访问该 Nginx 。
- storage server
- :负责存储文件,并提供上传文件、下载文件的 HTTP API 。
- 基于操作系统本身的文件系统,将文件直接存储到主机的某个目录下。
- 可以部署一组或多组 storage 实例,组成 storage 集群。
- 每组存储集群的一部分文件。因此增加组的数量,就可以横向扩展集群的存储容量。
- 组内的每个实例都存储该组文件的一个副本,从而实现冗余备份,还可以分担用户的访问流量,提高负载能力。
- 往某组加入一个新实例时,它会自动与同组的其它 storage 通信,同步文件。
- 可以部署 Nginx 代理 storage 的 store_path 目录下的文件,从而允许客户端以文件的 path 作为 URI ,直接通过 Nginx 下载文件。
# 部署
用 Docker 运行 tracker server :
docker run -d --name tracker \ -p 22122:22122 \ # -v /opt/fdfs/tracker.conf:/etc/fdfs/tracker.conf \ # 挂载配置文件 delron/fastdfs tracker
用 Docker 运行 storage server :
docker run -d --name storage \ -p 23000:23000 -p 8888:8888 \ -e TRACKER_SERVER=10.0.0.1:22122 \ # 声明 tracker server 的地址,该配置会保存到配置文件中 # -v /opt/fdfs:/var/fdfs \ # 挂载数据目录 # -v /opt/fdfs/storage.conf:/etc/fdfs/storage.conf \ # 挂载配置文件 # -v /opt/fdfs/nginx.conf:/usr/local/nginx/conf/nginx.conf \ # 挂载 Nginx 的配置文件 delron/fastdfs storage
storage.conf 的配置示例:
bind_addr=0.0.0.0 port=23000 group_name=group1 # 该 storage 属于哪个组 base_path=/var/fdfs # 工作目录,用于存储数据和日志 store_path0=/var/fdfs # 存储文件的目录。该参数可以设置多个,从 0 开始编号 # store_path1=/var/fdfs2 tracker_server=10.0.0.1:22122 # tracker 的地址。该参数可以配置多个 # tracker_server=10.0.0.2:22122
nginx.conf 的配置示例:
server { listen 8888; location ~ /group[0-9]/ { ngx_fastdfs_module; # 该模块用于对 storage 进行代理,其配置文件是 /etc/fdfs/mod_fastdfs.conf } }
# 用法
# 上传文件
进入 fastdfs 容器,执行
vi /etc/fdfs/client.conf
,修改配置文件:tracker_server=10.0.0.1:22122
通过客户端上传文件:
[root@CentOS ~]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf test.txt group1/M00/00/00/lRyeml-QA76AWkC1AAAAAAAAAAA357.txt
上传成功之后会返回该文件的逻辑存储路径 path ,其格式为:
group1
:表示 storage 所属组。M00
:表示 store_path 的编号。00/00/
: 表示 store_path 之下的子目录,总共有两级,取值为十六进制的 00~FF 。lRyeml-QA76AWkC1AAAAAAAAAAA357.txt
:按特定规则生成的文件名。
storage 不支持文件去重,重复上传同一个文件时,会存储到不同的 path 。
可以查看文件信息:
[root@CentOS ~]# /usr/bin/fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/lRyeml-QA76AWkC1AAAAAAAAAAA357.txt source storage id: 0 source ip address: 10.0.0.1 file create timestamp: 2020-10-30 12:42:49 file size: 49 file crc32: 1050033651 (0x3E963DF3)
# 下载文件
通过客户端下载文件:
/usr/bin/fdfs_download_file /etc/fdfs/client.conf <path>
也可以直接通过 Nginx 下载:
wget http://10.0.0.1:8888/<path> -O test.txt
# 常用命令
fdfs_trackerd <config_file> # 启动 tracker server
fdfs_storaged <config_file> [start|stop|restart] # 启动或停止 storage server
fdfs_monitor <config_file> # 查询服务器的状态信息
fdfs_upload_file <config_file> <filename> [storage_ip:port] [store_path_index] # 上传文件
fdfs_append_file <config_file> <path> <filename> # 追加上传文件
fdfs_download_file <config_file> <path> [filename] [<download_offset> <download_bytes>] # 下载文件
fdfs_delete_file <config_file> <path> # 删除文件
fdfs_file_info <config_file> <path> # 查询文件的信息