一、概述
1.1 Fastdfs介绍
FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、横向扩展等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
1.2 Fastdfs架构
FastDFS架构包括 Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。
Tracker server:负责负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。
Storage server:负责文件存储。客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将storage称为存储服务器。
1.3 搭建文件服务器
1.3.1 文件服务器架构图
1.3.2 软件安装
(1)安装libfastcommon
libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS运行所需要的一些基础库。
第一步:下载libfastcommon压缩包。
链接:https://pan.baidu.com/s/1l5OMoE6R6E11IXyNbV_4YQ
提取码:vz08
第二步:解压缩文件。
$ unzip libfastcommon-1.36.zip
第三步:编译和安装。
# 进入安装目录
$ cd libfastcommon-master
# 编译
$ ./make.sh
# 安装
$ sudo ./make.sh install
(2)安装fastdfs
第一步:下载fastdfs压缩包。
链接:https://pan.baidu.com/s/13dUvr7zCbZ04GoDOrnC7ng
提取码:bo4v
第二步:解压缩文件。
$ tar zxvf fastdfs-5.10.tar.gz
第三步:编译和安装。
# 进入安装目录
$ cd fastdfs-5.10
# 编译
$ ./make.sh
# 安装
$ sudo ./make.sh install
(3)配置Tracker
第一步:复制tracker.conf.sample一份,并改名为tracker.conf。
$ cd /etc/fdfs
$ cp tracker.conf.sample tracker.conf
第二步:修改tracker.conf文件,配置Tracker服务器参数。
(4)配置Storage
第一步:复制storage.conf.sample一份,并改名为storage.conf。
$ cd /etc/fdfs
$ cp storage.conf.sample storage.conf
第二步:修改storage.conf文件,配置Storage服务器参数。
(4)配置client
第一步:复制client.conf.sample一份,并改名为client.conf。
$ cd /etc/fdfs
$ cp client.conf.sample client.conf
第二步:修改client.conf文件,配置客户端参数。
(5)测试
- 启动Tracker
# 启动
$ fdfs_trackerd /etc/fdfs/tracker.conf
# 停止
$ fdfs_trackerd /etc/fdfs/tracker.conf stop
# 重启
$ fdfs_trackerd /etc/fdfs/tracker.conf restart
启动成功后,可以看到22122端口已经被Tracker占用了。
- 启动Storage
# 启动
$ fdfs_storaged /etc/fdfs/storage.conf
# 停止
$ fdfs_storaged /etc/fdfs/storage.conf stop
# 重启
$ fdfs_storaged /etc/fdfs/storage.conf restart
启动成功后,可以看到23000端口已经被Storage占用了。
- 文件上传测试:
$ fdfs_upload_file /etc/fdfs/client.conf 文件
例如:
- 文件下载:
$ fdfs_download_file /etc/fdfs/client.conf 文件ID
例如:
二、文件上传
2.1 文件上传流程
客户端上传文件后,存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。
文件索引信息包括:组名+虚拟磁盘路径+数据两级目录+文件名,如下图所示:
组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。
虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。
数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。两级目录的范围都是 00~FF。
文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
2.2 实现文件上传
第一步:在maven工程中引入坐标。
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.25-RELEASE</version>
</dependency>
第二步:在src/main/resources目录中创建配置文件。
第三步:修改配置文件,配置Tracker服务器的地址。
tracker_server=192.168.31.20:22122
第四步:编写测试类。
public class FastdfsTest {
@Test
public void upload_file() throws Exception {
// 配置文件路径
String conf_file = this.getClass().getResource("/fastdfs_client.conf").getPath();
// 初始化客户端全局信息
ClientGlobal.init(conf_file);
// 创建StorageClient对象
StorageClient storageClient = new StorageClient();
// 上传文件,并返回文件在服务器上的文件ID和组名
String[] arr = storageClient.upload_file(".jpg", "jpg", null);
// 输出返回值([group1, M00/00/00/wKgfFF0n-R6AIQXpAABQk5CwJ0k986.jpg])
System.out.println(Arrays.toString(arr));
}
}
运行效果:
三、文件下载
3.1 文件下载流程
tracker根据请求的文件路径即文件ID 来快速定义文件。比如请求下面文件:
通过组名tracker能够很快的定位到客户端需要访问的存储服务器组是group1,并选择合适的存储服务器提供客户端访问。 存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。
3.2 实现文件下载
@Test
public void download_file() throws Exception {
// 配置文件路径
String conf_file = this.getClass().getResource("/fastdfs_client.conf").getPath();
// 初始化客户端全局信息
ClientGlobal.init(conf_file);
// 创建StorageClient对象
StorageClient storageClient = new StorageClient();
// 下载文件,返回文件字节数组数据
byte[] data = storageClient.download_file("group1", "M00/00/00/wKgfFF0oH2yAXZo8AABQk5CwJ0k418.jpg");
// 把数据写入文件中
FileOutputStream fos = new FileOutputStream("d:/1.jpg");
fos.write(data);
fos.close();
}
四、SpringBoot项目整合Fastdfs
第一步:加入fastdfs-client-java依赖。
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27-SNAPSHOT</version>
</dependency>
第二步:配置文件上传传参数。
第三步:在src/main/resources目录下新建fastdfs_client.conf配置文件,然后添加tracker_server参数。该参数的值是tracker服务器地址。
第四步:在控制器类中实现文件上传。
@RestController
public class PictrueController {
@Value("${fastdfsUrl}")
private String fastdfsUrl;
@PostMapping(path="/pic/upload")
public Map<String,Object> upload(@RequestParam("pic")MultipartFile multipartFile) throws Exception {
Map<String,Object> data = new HashMap<>();
data.put("error", 1);
try{
// 加载配置文件得到文件绝对地址
String conf_filename = this.getClass().getResource("/fastdfs_client.conf").getPath();
// 调用客户端全局类的初始化方法加载配置文件
ClientGlobal.init(conf_filename);
// 创建FastDFS存储客户端对象
StorageClient storageClient = new StorageClient();
// 上传图片
String[] arr = storageClient.upload_file(multipartFile.getBytes(),"jpg", null);
// 拼接服务图片的URL地址
StringBuilder url = new StringBuilder(fastdfsUrl);
for (String str : arr){
url.append("/" + str);
}
// 上传图片的服务器地址
data.put("url", url.toString());
// 上传成功后设置error为0
data.put("error", 0);
}catch(Exception ex){
ex.printStackTrace();
}
return data;
}
}
第五步:测试(略)。
五、整合Nginx
如果要通过浏览器访问FDFS上的文件,可以借助Nginx来实现。
5.1 Nginx下载和安装
(1)下载fastdfs-nginx-module。
链接:https://pan.baidu.com/s/1bdTDVG6wTmbZdTbFKf-XYA
提取码:xdky
下载完成后直接解压缩。
$ tar zxvf fastdfs-nginx-module_v1.16.tar.gz
(2)配置nginx
# 进入nginx安装目录
$ cd ~/nginx-1.10.1/
# 运行配置
$ .configure –add-module= fastdfs-nginx-module/src
# 进入objs目录
$ cd ~/nginx-1.10.1/objs/
# 修改makefile文件
$ vim makefile
修改MakeFile文件的ALL_INCS参数如下:
执行编译和安装:
# 编译
$ cd ~/nginx-1.10.1/
$ make
# 安装
$ sudo make install
5.2 配置
(1)配置mod_fastdfs.conf
# 进入fastdfs-nginx-module目录下的src子目录
$ cd ~/fastdfs-nginx-module/src/
# 拷贝mod_fastdfs.conf文件
$ sudo cp ./mod_fastdfs.conf /etc/fdfs
# 修改配置文件
$ sudo vim /etc/fdfs/mod_fastdfs.conf
修改内容如下:
修改完成后保存退出编辑器,然后拷贝http.conf和mime.types文件到/etc/fdfs目录下。
# 进入fastdfs-master目录下的conf子目录下
cd ~/fastdfs-master
# 拷贝http.conf和mime.types文件到/etc/fdfs目录下
sudo cp http.conf /etc/fdfs
sudo cp mime.types /etc/fdfs
(2)配置nginx.conf
# 进入/usr/local/nginx/conf目录
$ cd /usr/local/nginx/conf
# 编辑nginx.conf
$ sudo vim nginx.conf
文件配置内容如下所示:
5.3 测试
启动nginx,然后在浏览器上访问文件服务器上的图片。