FastDFS 安装及部署

版本说明:

  1. Centos 7.5
  2. Nginx-1.15.6
  3. FastDFS-6.0.6
  4. FastDFS-module-1.22
  5. libfastcommon-1.0.43

一、将Centos的iso文件挂载到服务器上,并连接成yum源

  1. 将centos*.iso文件考入到服务器

  2. 替换源

cd /etc/yum.repos.d
mkdir bak
mv ./*.repo bak
vi cdrom .repo

  1. 在vi中写入yum源地址

[cdrom]
name=cdrom
baseurl=file:///mnt
gpgcheck=0
enabled=1

  1. 挂载iso文件

mount /x/Centos*.iso /mnt

  1. 清空yum源

yum cleanup

  1. 加载CenOS中的yum源

yum makecache

二、安装需要的lib

  1. 安装gcc

yum -y install gcc

  1. 安装perl

yum -y install perl

  1. 安装net-tools

yum -y install net-tools

如需要安装nginx则进行下面lib的安装,否则可以跳过

  1. 安装perl-devel

yum -y install pcre-devel

  1. 安装zlib-devel

yum -y install zlib-devel

三、安装libfastcommon

1.下载安装包,并解压

wget https://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz

或从互联网下载该包后考入服务器

解压:

tar -zxvf V1.0.43.tar.gz

2.编译安装

1
2
cd libfastcommon-1.0.43
./make.sh && ./make.sh install

四、安装FastDFS

  1. 下载fastdfs V6.0.6

wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz

或将下载好的包考入服务器

  1. 编译、安装

cd fastdfs-6.0.6

./make.sh && ./make.sh install

  1. 检验是否安装成功

ls -la /usr/bin/fdfs*

安装成功后的截图

可能会出现的问题:

1
2
3
4
5
6
/root/fastdfs-6.06/storage/fdfs_storaged.c:151: undefined reference to `g_exe_name'
storage_dump.o: In function `fdfs_dump_global_vars':
/root/fastdfs-6.06/storage/storage_dump.c:44: undefined reference to `g_exe_name'
collect2: error: ld returned 1 exit status
make: *** [fdfs_storaged] Error 1
make: Nothing to be done for `all'.

解决方法:

1
./make.sh clean

五、配置Tracker服务

  1. 修改tracker.conf

    1
    2
    3
    cd /etc/fdfs
    cp tracker.conf.sample tracker.conf
    vim tracker.conf

    需要修改tracker.conf的内容为:

    base_path=/x/fastdfs/tracker #设置tracker文件存储位置,注意需要提前创建好该目录

    port=22122 #tracker 端口

    http.server_port=80 #http访问端口

  2. 启动tracker(命令支持start|stop|restart)

/user/bin/fdfs_trackerd /etc/fdfs/tracker.conf start

在安装fastdfs的时候会将fdfs的基础命令注册到shell里可以直接调用:

fdfs_trackerd /etc/fdfs/tracker.conf start

  1. 查看日志

cat /x/fastdfs/tracker/logs/tracker.log

image-20200427210050171

  1. 查看端口

netstat -apn | grep fdfs

image-20200427210147891

六、配置Storage服务

  1. 创建storage.conf
1
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
  1. 修改storage.conf

base_path=/usr/local/fastdfs/stroage #storage文件路径 需要提前创建路径文件夹

port=23000 #storage端口

group_name=group1 #配置group名

store_path_count=1

store_path0=/usr/local/fastdfs/storage/file # storage存储路径,需提前创建文件夹

tracker_server=192.168.0.1:22122 #配置tracker地址 如有多个tracker就写几个

  1. 启动storage(命令支持start|stop|restart)
1
fdfs_storage /etc/fdfs/storage.conf start
  1. 查看日志
1
cat /usr/local/fastdfs/storage/logs/storage.log

image-20200427211152712

  1. 查看端口
1
netstat -apn|grep fdfs

image-20200427211256593

  1. 通过monitor查看storage是否与tracker连接成功

[root@FastDFS1 ~]# fdfs_monitor /etc/fdfs/storage.conf
[2020-04-24 12:09:02] DEBUG - base_path=/usr/local/fastdfs/storage, connect_timeout=5, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=1, 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 10.211.55.7:22122

group count: 1

Group 1:
group name = group1
disk total space = 41,947 MB
disk free space = 40,193 MB
trunk free space = 0 MB
storage server count = 2
active server count = 2
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 = 10.211.55.7
ip_addr = 10.211.55.7 ACTIVE
http domain =
version = 6.06
join time = 2020-04-12 01:54:08
up time = 2020-04-24 12:04:20
total storage = 41,947 MB
free storage = 40,193 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 = 1
connection.max_count = 1
total_upload_count = 29
success_upload_count = 29
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 = 29
success_download_count = 29
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 = 21855103
success_upload_bytes = 21855103
total_append_bytes = 0
success_append_bytes = 0
total_modify_bytes = 0
success_modify_bytes = 0
stotal_download_bytes = 26501695
success_download_bytes = 26501695
total_sync_in_bytes = 19704008
success_sync_in_bytes = 19704008
total_sync_out_bytes = 0
success_sync_out_bytes = 0
total_file_open_count = 84
success_file_open_count = 84
total_file_read_count = 113
success_file_read_count = 113
total_file_write_count = 191
success_file_write_count = 191
last_heart_beat_time = 2020-04-24 12:06:21
last_source_update = 2020-04-23 09:01:43
last_sync_update = 2020-04-22 19:55:17
last_synced_timestamp = 2020-04-22 19:56:15 (0s delay)

七、安装Nginx和fastdfs-nginx-module模块

  1. 下载安装包,并解压
    执行下载命令

wget http://nginx.org/download/nginx-1.16.1.tar.gz
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.22.tar.gz
解压 tar -zxvf nginx-1.16.1.tar.gz
解压 tar -zxvf V1.22.tar.gz

  1. 编译、安装
    依次执行以下命令
nginx-1.16.1
1
2
./configure --prefix=/usr/local/nginx --add-module=/root/fastdfs-nginx-module-1.22/src
make && make install

注:- -add-module的值为fastdfs-nginx-module的路径
3、启动、验证是否启动成功
查看nginx的安装路径

1
whereis nginx

切换到nginx的sbin目录

1
cd /usr/local/nginx/sbin/ 

启动命令

1
./nginx

停止命令

1
./nginx -s quit

验证启动状态

1
wget "http://127.0.0.1"

4、查看fastdfs模块是否安装成功

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

问题1:
执行wget “http://127.0.0.1"未响应
查看nginx目录下的log文件

解决方案

1
2
3
cp /root/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/
cp /root/fastdfs-6.06/conf/http.conf /etc/fdfs/
cp /root/fastdfs-6.06/conf/mime.types /etc/fdfs/

修改/etc/fdfs/mod_fastdfs.conf

base_path=/tmp
tracker_server=192.168.0.1:22122
url_have_group_name=true
storage_server_port=23000
store_path_count=1
store_path0=/usr/local/fastdfs/storage/file

注:

base_path 默认为/tmp
tracker_server 为tracker的地址
url_have_group_name url 是否包含group名称
storage_server_port 需要和storage配置的相同
store_path_count 存储路径个数,需要和store_path个数匹配
store_path0 文件存储的位置

八、配置Nginx

切换到nginx目录

1
cd /usr/local/nginx/conf/

编辑nginx.conf文件,增加一个location

location ~/M00{
root /usr/local/fastdfs/storage/file;
ngx_fastdfs_module;
}

九、fastdfs常用命令测试

1、上传文件
(1). 进入/etc/fdfs目录,cp一个client.conf.sample,去掉.sample后缀作为正式文件
(2).修改client.conf配置

base_path=/usr/local/fastdfs/client
tracker_server=192.168.0.1:22122
http.tracker_server_port=80

注:

base_path client的日志文件存储位置
tracker_server tracker的IP和port
http.tracker_server_port tracker服务器的http端口号,必须和tracker的设置对应起来
(3)上传文件

/usr/bin/fdfs_upload_file /etc/fdfs/client.conf a.txt

2、下载文件

/usr/bin/fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKgggF6NiFOAUhYsAAAADwjU0j8530.txt a.txt

3、删除文件

/usr/bin/fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKgggF6NiFOAUhYsAAAADwjU0j8530.txt

FastDFS组成原理

架构

  • FastDFS采用了分布式架构,包含跟踪服务器(Tracker Server)和存储服务器(Storage Server)。跟踪服务器负责管理存储服务器,而存储服务器负责实际的文件存储。

文件上传

  • 当客户端上传文件时,首先与跟踪服务器通信。跟踪服务器返回一个可用的存储服务器地址。
  • 客户端直接与存储服务器建立连接,将文件上传到存储服务器。

文件存储

  • 文件在存储服务器上以分组(Group)和文件名(File ID)的形式存储。
  • 存储服务器将文件按照一定规则分布在多个存储组中,每个存储组中包含多个存储节点,实现文件的分布式存储。

文件元数据

  • FastDFS存储文件的元数据(例如文件名、创建时间等)在跟踪服务器上。
  • 跟踪服务器通过元数据来管理文件的存储位置和状态。

负载均衡

  • FastDFS通过跟踪服务器实现负载均衡,它会将文件上传请求分发给多个存储服务器,确保系统的吞吐量和性能。

文件访问

  • 客户端通过文件的Group和File ID来访问文件。这两个标识符唯一确定一个文件在FastDFS中的位置。

高可用性

  • FastDFS具有高可用性,当一个存储节点发生故障时,跟踪服务器会将文件上传请求重定向到其他可用的存储节点,确保系统的稳定性。

分布式策略

  • FastDFS支持多种分布式策略,例如按照文件名散列、轮询等方式将文件分布在不同的存储节点上,以实现负载均衡。

FastDFS的使用(Java)

FastDFS Java客户端

在Java中使用FastDFS需要引入相应的Java客户端库,例如 fastdfs-client-java。可以通过 Maven 进行依赖管理:

1
2
3
4
5
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.27.0</version> <!-- 替换成最新版本 -->
</dependency>

上传文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;

public class FastDFSUploader {

public static void main(String[] args) {
try {
// 初始化 FastDFS 客户端
ClientGlobal.init("fastdfs-client.properties"); // 配置文件路径,内容见下面说明
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();

// 获取 Storage 服务器信息
StorageServer storageServer = null;
StorageClient1 client = new StorageClient1(trackerServer, storageServer);

// 上传文件
String fileId = client.upload_file1("your local file path", "file extension", null);

// fileId 返回的是文件的 group 和 filename,可以保存在数据库中以便后续访问
System.out.println("File ID: " + fileId);
} catch (Exception e) {
e.printStackTrace();
}
}
}

下载文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import org.csource.fastdfs.*;

public class FastDFSDownloader {

public static void main(String[] args) {
try {
// 初始化 FastDFS 客户端
ClientGlobal.init("fastdfs-client.properties"); // 配置文件路径,内容见下面说明
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();

// 获取 Storage 服务器信息
StorageServer storageServer = null;
StorageClient1 client = new StorageClient1(trackerServer, storageServer);

// 下载文件
byte[] content = client.download_file1("your file id");

// 处理下载的文件内容,可以保存到本地文件或进行其他处理
// ...

} catch (Exception e) {
e.printStackTrace();
}
}
}

配置文件

在项目的资源路径下创建 fastdfs-client.properties 文件,配置 FastDFS 服务器地址等信息:

1
2
3
4
5
propertiesCopy code
fastdfs.tracker_servers=tracker_server_ip:tracker_server_port
fastdfs.connect_timeout=5
fastdfs.network_timeout=300
fastdfs.charset=UTF-8

替换 tracker_server_iptracker_server_port 为你的 FastDFS Tracker 服务器地址和端口。

这样,你就可以使用Java客户端上传和下载文件到FastDFS分布式文件存储系统。确保 FastDFS 服务器正常运行,并能够在 Java 项目中访问到相应的客户端库。