FastDFS集群部署

FastDFS集群部署

1 概述

FastDFS是一款C语言开发的轻量级分布式文件系统。功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等。支持Linux、FreeBSD、MacOS等类Unix系统。FastDFS解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB<file_size<500MB)为载体的在线服务,如相册网站、视频网站等等。

FastDFS属于应用级文件系统,不是通用的文件系统,只能通过专有API访问,目前提供了C、Java和PHP API为互联网应用量身定制,解决大容量文件存储问题,追求高性能和高扩展性。FastDFS开以看作是基于文件的key value pair存储系统,统称做分布式存储服务更为合适。

FastDFS特性:

  • 分组存储,简单灵活
  • 对等结构,不存在单点
  • 文件ID由FastDFS生成,作为文件访问凭证。FastDFS不需要传统的name server或meta server
  • 大、中、小文件均可以很好支持,可以存储海量小文件。
  • 一台storage支持多块磁盘,支持单盘数据恢复
  • 提供nginx扩展模块,可以和ningx无缝衔接
  • 支持多线程方式上传和下载文件,支持断点续传
  • 存储服务器上可以保存文件附加属性

2 FastDFS架构

FastDFS系统由跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)构成。

image

 2.1 跟踪服务器(Tracker server)

Tracker server主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息,但不记录文件索引信息,占用的内存量很少,是客户端和数据服务器交互的枢纽。

Tracker是FastDFS的协调者,负责管理所有的Storage server和group,每个Storage 在启动后会连接Tracker,同步自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表。

Tracker需要管理的元信息很少,会全部存储在内存中。另外tracker上的元信息都是由storage汇报生成的,本身不需要持久任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为Tracker cluster来服务,cluster里每个tracker之间是完全对等的。所有的tracker都接受storage的心跳,生成元数据信息来提供读写服务。

2.2 存储服务器(Storage server)

Storage server主要提供容量和备份服务,文件和文件属性(Meta Data)都保存到存储服务器上,Storage server直接利用OS的文件系统调用管理文件。

Storage server以组(卷,group或volume)为单位,一个group内包含多台storage机器,数据互为备份,存储空间以group内容最小的storage为准,所以建议group内的多个storage尽量配置相同,以避免造成存储空间浪费。

以group为单位组织存储能方便的进行应用隔离、负载均衡、副本数量定制(group内storage server数量即为改group的副本数量),比如将不同应用数据存到不同的group就能隔离应用数据,同时还可以根据应用的访问特性将应用分配到不同的group来做负载均衡;缺点是group的容量受单机存储容量的限制,同时当group内有机器坏掉时,数据恢复只能依赖group内其它机器,使得恢复时间会很长。

group内每个storage的存储依赖于本地文件系统,storage可配置多个数据库存储目录,比如有10块磁盘,分别挂载在/data/disk1~/data/disk10,则可将这10个目录都配置为storage的数据存储目录。

storage接收到写文件请求时,会根据配置好的规则,选择其中一个存储目录来存储文件。为了避免单个目录下的文件太多,在storage第一次启动时,会在每个数据存储目录创建2级子目录,每级256个,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录。

2.3 客户端(Client)

client 作为业务请求的发起方,通过专有接口,使用TCP/IP协议于跟踪器服务器或存储节点进行数据i骄傲胡。FastDFS向使用者提供文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。

2.4 上传流程

首次client客户端请求Tracker服务,Tracker服务获取到存储服务器的IP地址和端口,然后客户端根据返回的IP地址和端口号请求上传文件,存储服务器接收到请求后上传文件,并且将文件内容写入磁盘并返回客户端file_id、路径信息、文件名等信息,客户端保存相关信息,文件上传完毕。

image

 内部机制:

  1. 选择tracker server
    • 当集群不止一个tracker server时,由于tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个tracker,选择存储的group。当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:Round robin(所有的group间轮询)、Specified group(指定某一个确定的group)、Load balance(剩余空间多的group优先)
  2. 选择storage server
    • 当选定group后,tracker汇总group内选择一个storage server给客户端,支持如下选择storage的规则:Round robin(在group内的所有storage间轮询)、Fisrt server ordered by ip(按IP排序)、Fisrt server ordered by priority(按优先级排序,优先级在storage上配置)
  3. 选择storage path
    • 当分配好storage server后,客户端将向storage发送写请求,storage将会为文件分配一个数据存储目录。支持如下规则:Round robin,多个存储目录间轮询、剩余存储空间最多优先
  4. 生成file_id
    • 选定存储目录之后,storage会为文件生成一个FileId,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。选择两级目录,当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid镜像两次hash,路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。
  5. 生成文件名
    • 当文件存储到某个子目录后,即认为该文件存储成功,接下来为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀(由客户端指定,主要用于区分文件类型)拼接而成。

2.5 下载机制

客户端带上文件名信息请求Tracker服务,获取到存储服务器的IP地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后,返回文件给客户端。

image

 跟upload file一样,在download file时,客户端开源选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracker从文件名钟解析出的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。由于group内的文件同步时在后台异步进行的,所以可能出现读到的适合,文件还没有同步到某些storage server上,为了尽量避免访问到这样的storage,tracker安装如下规则选择group内可读的storage。

  • 该文件上传到的源头storage - 源头storage只要存活着,肯定包含这个文件,源头的地址被编码在文件名中。
  • 文件创建时间戳==storage被同步到的时间戳 且(当前时间-文件创建时间戳) > 文件同步最大时间(如5分钟) - 文件创建后,认为经过最大同步时间后,肯定已经同步到其他storage了。
  • 文(当前时间-文件创建时间戳) > 同步延迟阀值(如一天)。 - 经过同步延迟阈值时间,认为文件肯定已经同步了件创建时间戳 < storage被同步到的时间戳。
  • 同步时间戳之前的文件确定已经同步了。

2.6 FastDFS的fileId

FastDFS的FID是客户端上传文件后存储服务器返回给客户端,用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。

image

  •  组名:文件上传后所在的存储组名称,在文件上传成功后有存储服务器返回,需要客户端自行保存。
  • 虚拟磁盘路径:存储服务器配置的虚拟路径,与磁盘选项store_path*对应。
  • 数据两级目录:存储服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
  • 文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

3 部署FastDFS

3.1 环境准备

IP 服务器角色 操作系统
10.32.0.101 tracker ubuntu 24.04 LTS
10.32.0.102 storage ubuntu 24.04 LTS

3.2 安装FastDFS

所有服务器执行。

  • 安装编译工具和依赖
# 1. 更新系统软件包
sudo apt update && sudo apt upgrade -y

# 2. 安装编译工具和依赖
sudo apt install -y git gcc make perl libperl-dev build-essential libevent-dev libpcre3-dev
  • 源码编译FastDFS
# 1. 克隆源码仓库
git clone https://github.com/happyfish100/libfastcommon.git
git clone https://github.com/happyfish100/libserverframe.git
git clone https://github.com/happyfish100/fastdfs.git
[reference:3]

# 2. 编译安装 libfastcommon(公共基础库)
cd libfastcommon
sudo ./make.sh && sudo ./make.sh install
[reference:4]

# 3. 编译安装 libserverframe(网络框架库)
cd ../libserverframe
sudo ./make.sh && sudo ./make.sh install
[reference:5]

# 4. 编译安装 FastDFS
cd ../fastdfs
sudo ./make.sh && sudo ./make.sh install

3.3 配置tracker

IP:10.32.0.101

创建存储暑假和日志的目录

mkdir -p /usr/local/fastdfs/tracker

将/etc/fdfs/tracker.conf.sample文件重命名为tracker.conf

cd /etc/fdfs
cp tracker.conf.sample tracker.conf

然后修改配置文件/etc/fdfs/tracker.conf

vim tracker.conf
base_path=/usr/local/fastdfs/tracker

配置文件中有这几个参数需要注意:

#启用配置文件
disabled=false
#设置tracker的端口号
port=22122
#设置tracker的数据文件和日志目录(需手动创建)
base_path=/usr/local/fastdfs/tracker
#设置http端口号,默认8080
http.server_port=8080

启动tracker服务

sudo service fdfs_trackerd start

查看端口22122是否开始监听,确认启动是否成功

image

 也可以查看tracker的日志是否启动成功

cat /usr/local/fastdfs/tracker/logs/trackerd.log

image

 3.4 配置storage

IP: 10.32.0.102

创建存储数据和日志的目录

mkdir -p /usr/local/fastdfs/storage

将/etc/fdfs/tracker.conf.sample文件重命名为tracker.conf

cd /etc/fdfs
cp storage.conf.sample storage.conf

然后修改配置文件/etc/fdfs/storage.conf的base_path,store_path以及tracker的连接地址以及storage的http服务端口配置等。

主要有如下几个参数:

vim /etc/fdfs/storage.conf

group_name=group1  # 组名(第一组为group1,第二组为group2,依次类推...),主要时在组集群时区分storage组
base_path=/usr/local/fastdfs/storage   # 数据和日志文件存储根目录
store_path0=/usr/local/fastdfs/storage  # 第一个存储目录,第二个存储目录起名为:store_path1=xxx,其它存储目录名依次类推... 
store_path_count=1 # 存储路径个数,需要和store_path个数匹配 
tracker_server=192.168.66.67:22122 # tracker服务器IP和端口 
tracker_server=192.168.66.xx:22122 # 如果是tracker集群就写多个tracker配置

启动storage服务

service fdfs_storaged start

查看端口或日志验证是否启动成功

image

 在任意storage节点使用fdfs_monitor /etc/fdfs/storage.conf,查看storage服务器是否已经登记到tracker服务器。

image

 测试文件上传是否成功

image

 3.5 在storage上安装nignx

 注意:fastdfs-nginx-module模块只需要安装到storage上

安装依赖

sudo apt-get install g++ openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev libgd-dev

下载安装包

wget http://nginx.org/download/nginx-1.24.0.tar.gz
git clone https://github.com/happyfish100/fastdfs-nginx-module.git

编译Nginx

tar -xzvf nginx-1.24.0.tar.gz
cd nginx-1.24.0/
./configure --add-module=/opt/FastDFS/fastdfs-nginx-module/srcmake
sudo make install

查看Nginx版本信息

/usr/local/nginx/sbin/nginx -V

image

 配置fastdfs-nginx-module

进入fastdfs-nginx-module-master的src目录,将md_fastdfs.conf配置文件拷贝到/etc/fdfs/目录中

cd /opt/FastDFS/fastdfs-nginx-module/src
cp mod_fastdfs.conf /etc/fdfs/

修改/etc/fdfs/mod_fastdfs.conf配置一般只需改动以下几个参数即可:

base_path=/usr/local/fastdfs/storage   #保存日志目录
tracker_server=10.32.0.101:22122  # tracker服务ip和端口
#tracker_server=192.168.3.xx:22122  # 如果有多个tracker就配置多个
storage_server_port=23000 #storage服务器的端口号
group_name=group1 #当前服务器的group名
url_have_group_name=true #文件url中是否有group名 
store_path_count=1 #存储路径个数,需要和store_path个数匹配 
store_path0=/usr/local/fastdfs/storage #存储路径 
group_count=1 #组数

在末尾增加组的具体信息

[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/usr/local/fastdfs/storage

配置Nginx

编辑/usr/local/nginx/conf配置文件目录下的nginx.conf,设置添加storage信息并保存。

vim /usr/local/nginx/conf/nginx.conf
将server段中的listen端口号改为8080,并在server段中添加:
location ~/group[0-9]/M00{
    root /usr/local/fastdfs/storage/data;
    ngx_fastdfs_module; 
}

复制 fastdfs-master解压文件目录中的conf下http.conf、mime.types文件到/etc/fdfs

image

 至此,nginx以及FastDFS插件模块设置完成。

启动nginx,查看8080是否开始监听确认启动是否成功。 

/usr/local/nginx/sbin/nginx

image

打开浏览器,直接访问http://10.32.0.102:8080/,查看是否弹出nginx欢迎页面。 

image

 3.6 在tracker上安装nginx

在tracker上安装的nginx主要为了提供http访问的反向代理、负载均衡以及缓存服务。

wget http://nginx.org/download/nginx-1.24.0.tar.gz

编译安装nginx

tar -xzvf nginx-1.24.0.tar.gz
cd nginx-1.24.0/
make
sudo make install

配置nginx,编辑/usr/local/nginx/conf配置文件目录下的nginx.conf,设置负载均衡。

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

修改下面配置

worker_processes  4;                  #根据CPU核心数而定
events {
  worker_connections  65535;        #最大链接数
  use epoll;                        #新版本的Linux可使用epoll加快处理性能
}
http {
    #设置group1的服务器
  upstream fdfs_group1 {
     # ip和port填写storage上部署的nginx信息
     server 192.168.3.66:8080 weight=1 max_fails=2 fail_timeout=30s;
   }
  server {
    #设置服务器端口
       listen       8080;
       #设置group1的负载均衡参数
       location ~/group[0-9]/M00 {
            proxy_pass http://fdfs_group1;
       }
  }
}

启动nginx,查看8080是否开始监听确认启动是否成功。

/usr/local/nginx/sbin/nginx

image

 3.7 上传图片并在浏览器查看图片

在tracker服务器上将/etc/fdfs/client.conf.sample文件重命名为client.conf

cd /etc/fdfs
cp client.conf.sample client.conf

然后修改配置文件/etc/fdfs/client.conf

vim client.conf

base_path=/usr/local/fastdfs/tracker
tracker_server=10.32.0.101:22122  # tracker服务器ip和port
http.tracker_server_port=8080  # 默认80,需修改为tracker.conf配置文件中http.server_port的值

上传文件测试

fdfs_upload_file /etc/fdfs/client.conf 304.jpg

返回类似group1/M00/00/00/CiAAZmpLVIyAQ90RAASR2F-IIW0615.jpg的文件id说明文件上传成功了。

image

 因为tracker的nginx配置了反向代理,使用storage的ip或tracker的ip都可以在浏览器访问图片。

image

 或者

image

 

posted @ 2026-07-03 15:00  钟齐峰  阅读(12)  评论(0)    收藏  举报