Linux(Ubuntu)搭建FastDFS文件管理系统

别裁伪体亲风雅,转益多师是汝师。这篇文章主要讲述Linux(Ubuntu)搭建FastDFS文件管理系统相关的知识,希望能为你提供帮助。




文章目录


  • ??1 前言??

  • ??1.1 `FastDFS`是什么??
  • ??1.2 `FastDFS`结构??
  • ??1.3 `FastDFS`的存储策略??
  • ??1.4 `FastDFS`的上传过程??
  • ??1.5 `FastDFS`的文件同步??
  • ??1.6 `FastDFS`的文件下载??

  • ??2 搭建`FastDFS`文件服务器??

  • ??2.1 准备??
  • ??2.2 安装C/C++编译环境??
  • ??2.3 下载安装libfastcommon??
  • ??2.4 下载安装FastDFS??
  • ??2.5 配置FastDFS跟踪器(Tracker)??
  • ??2.6 配置FastDFS存储(Storage)??
  • ??2.7 文件上传测试??

  • ??3 安装Nginx??

  • ??3.1 安装Nginx所需环境??
    • ??3.2 安装Nginx??
  • ??3.2 访问文件??

  • ??4 FastDFS配置Nginx模块??
  • ??4.1 安装配置Nginx模块??




1 前言??FastDFS??开源地址: https://github.com/happyfish100
1.1 ??FastDFS??是什么??FastDFS???是阿里余庆用??C语言???编写的一款开源的分布式文件系统。??FastDFS???为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用??FastDFS??很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
1.2 ??FastDFS??结构??FastDFS???系统有三个角色: 跟踪服务器(??Tracker Server???)、存储服务器(??Storage Server???)和客户端(??Client???)。客户端请求??Tracker server???进行文件上传、下载,通过??Tracker Server???调度最终由??Storage Server??完成文件上传和下载。


Tracker Server作用是负载均衡和调度,负责管理所有的??Storage Server??和??group??,每个??Storage??在启动后会连接??Tracker Server??,告知自己所属??group??等信息,并保持周期性心跳。通过??Tracker Server??在文件上传时可以根据一些策略找到??Storage Server??提供文件上传服务。可以将Tracker`称为追踪服务器或调度服务器。


Storage Server作用是文件存储,主要提供容量和备份服务;以??group??为单位,每个??group??内可以有多台 ??Storage Server??,数据互为备份。客户端上传的文件最终存储在??Storage??服务器上,??Storage Server??没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将??Storage??称为存储服务器。


Client是上传下载数据的服务器,也就是我们自己的项目所部署在的服务器,称为客户端。
Linux(Ubuntu)搭建FastDFS文件管理系统

文章图片



1.3 ??FastDFS??的存储策略为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
1.4 ??FastDFS??的上传过程??FastDFS??向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。
Storage Server会定期的向Tracker Server发送自己的存储信息。当Tracker Server Cluster中的Tracker Server不止一个时,各个Tracker之间的关系是对等的,所以客户端上传时可以选择任意一个Tracker。
当Tracker收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group,当选定了group后就要决定给客户端分配group中的哪一个Storage Server。当分配好Storage Server后,客户端向Storage发送写文件请求,Storage将会为文件分配一个数据存储目录。然后为文件分配一个file_id,最后根据以上的信息生成文件名存储文件。
【Linux(Ubuntu)搭建FastDFS文件管理系统】
Linux(Ubuntu)搭建FastDFS文件管理系统

文章图片

1.5 ??FastDFS??的文件同步写文件时,客户端将文件写至group内一个Storage Server即认为写文件成功,Storage Server写完文件后,会由后台线程将文件同步至同group内其他的Storage Server。
每个Storage写文件后,同时会写一份bin_log,bin_log里不包含文件数据,只包含文件名等元信息,这份bin_log用于后台同步,Storage会记录向group内其他Storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
Storage的同步进度会作为元数据的一部分汇报到tracker上,tracker在选择读Storage的时候会以同步进度作为参考。
1.6 ??FastDFS??的文件下载客户端upload file成功后,会拿到一个Storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。
Linux(Ubuntu)搭建FastDFS文件管理系统

文章图片

跟upload file一样,在download file时客户端可以选择任意Tracker Server。tracker发送download请求给某个tracker,必须带上文件名信息,tracker从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个Storage用来服务读请求。
2 搭建??FastDFS??文件服务器 2.1 准备

  • 操作环境:Ubuntu20 X64,以下操作都是单机环境。
  • 修改hosts,将文件服务器的IP与域名映射(单机Tracker Server环境),因为后面很多配置里面都需要去配置服务器地址,IP变了,就只需要修改hosts即可。

vim /etc/hosts

# 增加如下一行,这是我的IP,如果是云端服务器,需要填写公网IP地址
192.168.137.1 file.toplabs.com

# 如果要本机访问虚拟机,在C:\\Windows\\System32\\drivers\\etc\\hosts中同样增加一行

2.2 安装C/C++编译环境
sudo apt install g++
sudo apt install make

2.3 下载安装libfastcommon??libfastcommon???是从??FastDFS???和??FastDHT???中提取出来的公共??C函数??库,基础环境,安装即可。
  1. 下载??libfastcommon??
cd /usr/local/fastdfs # fastdfs是自己创建的目录
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz

  1. 解压
tar -zxvf V1.0.43.tar.gz

  1. 编译、安装
cd libfastcommon-1.0.43
./make.sh
./make.sh install

2.4 下载安装FastDFS
  1. 下载FastDFS
cd /usr/local/fastdfs
wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz

  1. 解压
tar -zxvf V6.06.tar.gz

  1. 编译、安装
cd fastdfs-6.06
./make.sh
./make.sh install

  1. 复制??FastDFS???的部分配置文件到??/etc/fdfs??目录
cd conf/
cp http.conf mime.types /etc/fdfs/

2.5 配置FastDFS跟踪器(Tracker)
  1. 进入??/etc/fdfs???,复制??FastDFS???跟踪器样例配置文件??tracker.conf.sample???,并重命名为??tracker.conf??。
cd /etc/fdfs
cp tracker.conf.sample tracker.conf
vim tracker.conf

  1. 编辑??tracker.conf??,修改如下配置,其它的默认即可。
# 提供服务的端口
port=22122
# Tracker 数据和日志目录地址(根目录必须存在,子目录会自动创建)
base_path=/toplabs/fastdfs/tracker
# HTTP 服务端口
http.server_port=80

  1. 创建tracker基础数据目录,即base_path对应的目录
mkdir -p /toplabs/fastdfs/tracker

  1. 防火墙中打开跟踪端口(默认的22122)
ufw allow 22122

  1. 启动Tracker
/etc/init.d/fdfs_trackerd start

查看 Tracker 是否已成功启动,22122端口正在被监听,则算是Tracker服务安装成功。
[root@localhost ~]# netstat -unltp | grep fdfs
tcp00 0.0.0.0:221220.0.0.0:*LISTEN140436/fdfs_tracker

关闭Tracker命令:
/etc/init.d/fdfs_trackerd stop

  1. 设置Tracker开机启动
vim /etc/rc.local

# 加入配置:
/etc/init.d/fdfs_trackerd start

  1. tracker server 目录及文件结构
Tracker服务启动成功后,会在base_path下创建data、logs两个目录。目录结构如下:
/toplabs/fastdfs/tracker/
├── data
│├── fdfs_trackerd.pid
│└── storage_changelog.dat
└── logs
└── trackerd.log

2.6 配置FastDFS存储(Storage)
  1. 进入??/etc/fdfs???目录,复制??FastDFS???存储器样例配置文件??storage.conf.sample???,并重命名为??storage.conf??
cd /etc/fdfs
cp storage.conf.sample storage.conf
vim storage.conf

  1. 编辑??storage.conf??,修改如下配置,其它的默认即可。
# storage server 服务端口
port=23000

# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)
base_path=/toplabs/fastdfs/storage

# 如果不配置 store_path0,那它就和 base_path 对应的路径一样。
store_path0=/toplabs/fastdfs/file

# tracker_server 的列表 ,会主动连接 tracker_server
# 有多个 tracker server 时,每个 tracker server 写一行
tracker_server=file.toplabs.com:22122

# 访问端口
http.server_port=80

  1. 创建Storage基础数据目录,对应base_path目录
mkdir -p /toplabs/fastdfs/storage

# 这是配置的store_path0路径
mkdir -p /toplabs/fastdfs/file

  1. 防火墙中打开存储器端口(默认23000)
ufw allow 23000

  1. 启动 Storage
/etc/init.d/fdfs_storaged start

查看Storage是否成功启动,23000端口正在被监听,就算Storage启动成功。
[root@localhost ~]# netstat -unltp | grep fdfs
tcp00 0.0.0.0:221220.0.0.0:*LISTEN140436/fdfs_tracker
tcp00 0.0.0.0:230000.0.0.0:*LISTEN140457/fdfs_storage

关闭Storage命令:
/etc/init.d/fdfs_storaged stop

查看Storage和Tracker是否在通信:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

Linux(Ubuntu)搭建FastDFS文件管理系统

文章图片

6. 设置 Storage 开机启动
vim /etc/rc.local

# 加入配置:
/etc/init.d/fdfs_storaged start

  1. Storage 目录
同 Tracker,Storage启动成功后,在base_path下创建了data、logs目录,记录着Storage Server 的信息。
/toplabs/fastdfs/storage/
├── data
│├── fdfs_storaged.pid
│├── storage_stat.dat
│└── sync
│├── binlog.000
│└── binlog_index.dat
└── logs
└── storaged.log

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

2.7 文件上传测试
  1. 进入??/etc/fdfs???目录,复制??FastDFS???存储器样例配置文件??client.conf.sample???,并重命名为??client.conf??
cd /etc/fdfs
cp client.conf.sample client.conf
vim client.conf

  1. 编辑??client.conf??,修改如下配置,其它的默认即可。
# Client 的数据和日志目录
base_path=/toplabs/fastdfs/client

# Tracker端口
tracker_server=file.toplabs.com:22122

  1. 创建Storage基础数据目录,对应base_path目录
mkdir -p /toplabs/fastdfs/client

  1. 上传测试
在Linux内部执行如下命令上传??/usr/local/fastdfs/fastdfs-6.06/images/architect.png??图片
fdfs_upload_file /etc/fdfs/client.conf /usr/local/fastdfs/fastdfs-6.06/images/architect.png

上传成功后返回文件ID号: ??group1/M00/00/00/wKgALl_DpGeAOoAyAAYB1ymW77M906.png??
返回的文件ID由group、存储目录、两级子目录、file_id、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
文件存在了哪里呢?这里??/toplabs/fastdfs/file/data/00/00??
其实到这一步,这个上传的文件的路径已经出来了。
??http://file.toplabs.com/group1/M00/00/00/wKgALl_DpGeAOoAyAAYB1ymW77M906.png??
但是在浏览器中还不能够直接访问文件。
3 安装nginx上面将文件上传成功了,但我们无法访问。因此安装Nginx作为服务器以支持Http方式访问文件。
Nginx只需要安装到Storage Server所在的服务器即可,用于访问文件。我这里由于是单机,Tracker Server和Storage Server在一台服务器上。
3.1 安装Nginx所需环境
sudo apt install g++# 前面已经安装过的,可以跳过
sudo apt install openssl libssl-dev
sudo apt install libpcre3 libpcre3-dev
sudo apt install zlib1g-dev

3.2 安装Nginx
  1. 下载??nginx??
wget https://nginx.org/download/nginx-1.19.5.tar.gz

  1. 解压
tar -zxvf nginx-1.19.5.tar.gz

  1. 使用默认配置
cd nginx-1.19.5
./configure

  1. 编译、安装
make
make install

  1. 启动??nginx??
cd /usr/local/nginx/sbin/
./nginx

# 有可能会报错,上面显示找不到logs文件
mkdir ../logs

# 其它命令
./nginx -s stop
./nginx -s quit
./nginx -s reload

  1. 设置开机启动
vim /etc/rc.local

# 添加一行:
/usr/local/nginx/sbin/nginx

  1. 防火墙中打开Nginx端口(默认80)
ufw allow 80

3.2 访问文件简单的测试访问文件
  1. 修改??nginx.conf??
vim /usr/local/nginx/conf/nginx.conf

# 添加如下行,将 /group1/M00 映射到 /toplabs/fastdfs/file/data
location /group1/M00
alias /toplabs/fastdfs/file/data;

#重启nginx
/usr/local/nginx/sbin/nginx -s reload

  1. 在浏览器访问之前上传的图片、成功。
?http://file.toplabs.com/group1/M00/00/00/wKgALl_DpGeAOoAyAAYB1ymW77M906.png"> ?http://file.toplabs.com/group1/M00/00/00/wKgALl_DpGeAOoAyAAYB1ymW77M906.png??
4 FastDFS配置Nginx模块 4.1 安装配置Nginx模块
  1. ??fastdfs-nginx-module??模块说明
??FastDFS??通过Tracker服务器,将文件放在Storage服务器存储,但是同组存储服务器之间需要进行文件复制,有同步延迟的问题。
假设Tracker服务器将文件上传到了??192.168.137.1??,上传成功后文件ID已经返回给客户端。
此时??FastDFS???存储集群机制会将这个文件同步到同组存储??192.168.137.2???,在文件还没有复制完成的情况下,客户端如果用这个文件ID在??192.168.137.2??上取文件,就会出现文件无法访问的错误。
而??fastdfs-nginx-module??可以重定向文件链接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
  1. 下载??fastdfs-nginx-module??、解压、重命名
# 下载
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.22.tar.gz

# 解压
tar -zxvf V1.22.tar.gz

# 重命名
mv fastdfs-nginx-module-1.22/ fastdfs-nginx-module

  1. 配置??nginx???,在??nginx??中添加模块
# 先停掉nginx服务
/usr/local/nginx/sbin/nginx -s stop
# 进入nginx目录
cd /usr/local/nginx/

# 添加模块,后面填写自己的解压路径
./configure --add-module=/usr/local/fastdfs/fastdfs-nginx-module/src

# 重新编译、安装
make & & make install

  1. 查看Nginx的模块
[root@localhost ~]# usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.19.5
built by gcc 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)
# 有下面这个就说明添加模块成功
configure arguments: --add-module=/usr/local/fastdfs/fastdfs-nginx-module/src

  1. 复制??fastdfs-nginx-module???源码中的配置文件到??/etc/fdfs??目录
cd /usr/local/fastdfs/fastdfs-nginx-module/src
cp mod_fastdfs.conf /etc/fdfs/
cd /etc/fdfs
vim mod_fastdfs.conf

  1. 修改如下配置,其它默认
# 连接超时时间
connect_timeout=10

# Tracker Server
tracker_server=file.toplaabs.com:22122

# StorageServer 默认端口
storage_server_port=23000

# 如果文件ID的uri中包含/group**,则要设置为true
url_have_group_name = true

# Storage 配置的store_path0路径,必须和storage.conf中的一致
store_path0=/toplabs/fastdfs/file

  1. 配置??nginx???,修改??nginx.conf??
vim /usr/local/nginx/conf/nginx.conf

修改配置,其它的默认
在80端口下添加??fastdfs-nginx??模块
location ~/group([0-9])/M00
ngx_fastdfs_module;


注意:
listen 80端口值是要与??/etc/fdfs/storage.conf???中的??http.server_port=80??相对应。如果改成其它端口,则需要统一,同时在防火墙中打开该端口。
location的配置,如果有多个group则配置location ~/group([0-9])/M00,没有则不用配group。
  1. 启动??nginx??
/usr/local/nginx/sbin/nginx

打印处如下就算配置成功??ngx_http_fastdfs_set pid=xxx??
  1. 在地址栏访问
能下载文件就算安装成功。注意和第三点中直接使用??nginx??路由访问不同的是,这里配置??fastdfs-nginx-module??模块,可以重定向文件链接到源服务器取文件。
?http://file.toplabs.com/group1/M00/00/00/wKgALl_DpGeAOoAyAAYB1ymW77M906.png"> ? http://file.toplabs.com/group1/M00/00/00/wKgALl_DpGeAOoAyAAYB1ymW77M906.png??





    推荐阅读