& FastDFS快速入门
fastDFS快速入门
1. 为什么使用FastDFS
Fast DFS(最快的分布式文件系统)
使用FASTDFS的公司有:
支付宝,京东商城,赶集网,淘米网,迅雷,UC等等。
目前规模最大的一家:集群中存储的group数有200个,存储容量达到3PB,文件数接近1亿个,目前处于持续增长中。
2. FastDFS简介
FastDFS是淘宝的余庆先生所开发,是一款开源的轻量级分布式文件系统,采用纯C实现,目前提供了C,Java和PHP的API,主要用它来对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。同类的分布式文件系统有谷歌的GFS、HDFS(Hadoop)、TFS(淘宝)等。
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。
跟踪器主要做调度工作,在访问上起负载均衡的作用。
存储节点主要的工作:存储、同步和提供存取接口。
整体来说:FastDFS主要有以下两个主要特点:
高可靠性:无单点故障;
高吞吐量:只要 Group 足够多,数据流量是足够分散的。
FastDFS系统结构如下图所示:
工作原理说明:
跟踪器和存储节点都可以由一台多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷 的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起 到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。
当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
3. 上传文件流程
4. 下载文件流程
5. 安装搭建FastDFS
5.1 安装依赖环境
5.2 上传安装文件
5.3.安装libfastcommon
libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS运行所需要的一些基础库。
- 安装步骤(命令)
- cd /usr/local
- tar -zxvf libfastcommonV1.0.7.tar.gz
- cd libfastcommon-1.0.7/
- ./make.sh
- ./make.sh install
注意:libfastcommon安装好之后会将库文件拷贝至/usr/lib64下,由于FastDFS程序引用/usr/lib/目录,所以需要将/usr/lib64下的库文件拷贝至/usr/lib/目录下
- 查找当前目录下是否包含指定文件
- find -name libfastcommon.so
- 查找/usr/lib/目录下是否包含指定文件
- find /usr/lib/ -name libfastcommon.so
5.4 安装FastDFS_v5.05(tracker + storage)
5.4.1 tracker
tar -zxvf FastDFS_v5.05.tar.gz
./make.sh
./make.sh install
将/usr/local/fastdfs/FastDFS/conf 路径下的文件 copy到/etc/fdfs/目录下
cp * /etc/fdfs/
修改配置文件,上传资源文件存储位置
vi /etc/fdfs/tracker.conf
启动FastDFS
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
重启命令:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
配置自启动
5.4.2 storage
-
修改storage配置文件
-
修改base_path为:/user/local/fastdfs/FastDFS/storage
-
修改store_path0为:/user/local/fastdfs/FastDFS/storage
-
修改tracker_server为:tracker服务器IP+端口port,此处为192.168.136.128:222122
-
启动
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
配置自启动
5.5 配置客户端
- 将/usr/local/FastDFS/client 里面的 libfdfsclient.so 拷贝到 /usr/lib 目录下 (这一步非常重要 nginx)
- 修改配置文件 /etc/fdfs/client.conf
- 修改base_path为 /usr/local/fastdfs/FastDFS/client
- 修改tracker_server为 192.168.136.128::22122
- 测试
- 在/root下创建hi.html(测试专用无实际意义)
- 上传hi.html
- /usr/bin/fdfs_test /etc/fdfs/client.conf upload /root/hi.html
- 此时在服务器已经实现了文件上传,但是外部无法访问
5.6 安装Nginx和nginx插件
5.6.1 Nginx环境依赖
nginx需要的一些环境
- gcc (前面已经安装)
- yum install gcc-c++
- PCRE
- yum install -y pcre pcre-devel
- zlib
- yum install -y zlib zlib-devel
- openssl
- yum install -y openssl openssl-devel
5.6.2 fastdfs-nginx-module
安装nginx 和 nginx插件,两者结合
可以使用官方提供的nginx插件。要使用nginx插件需要重新编译
fastdfs-nginx-module_v1.16.tar.gz
- 解压插件压缩包
- 修改/usr/local/fastdfs/fastdfs-nginx-module/src目录下config文件,把其中的local去掉
- vi config :%s/local///g 全局替换
- 把/usr/local/fastdfs/fastdfs-nginx-module/src/mod_fastdfs.conf 文件复制到/etc/fdfs目录下。并编辑该文件:
- 修改
- tracker_server 表示tracker主机地址
- url_have_group_name 表示文件路径是否含有group
- store_path0 资源文件存储路径
5.6.3 Nginx安装
如果nginx之前已经安装
https://blog.csdn.net/wangjia55/article/details/91961569
如果nginx没有安装 则安装正常nginx
- ./configure --add-module=/usr/local/fastdfs/fastdfs-nginx-module/src
- make
- make install
- 省略
修改nginx配置文件
启动nginx
./nginx
刷新页面
6. 与SpringBoot的整合
pom.xml
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.26.1-RELEASE</version>
</dependency>
application.yml
fdfs:
connect-timeout: 600
so-timeout: 1500
pool:
jmx-enabled: false
thumb-image:
width: 100
height: 100
tracker-list: 192.168.136.128:22122
BootFastdfsApplicationTests测试类
package com.lhx.bootfastdfs;
import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@RunWith(SpringRunner.class)
@SpringBootTest
class BootFastdfsApplicationTests {
@Autowired
private FastFileStorageClient fastFileStorageClient;
@Test
void contextLoads() throws FileNotFoundException {
File file = new File("d://image.jpg");
FileInputStream fileInputStream = new FileInputStream(file);
String extName = file.getName().substring(file.getName().lastIndexOf(".") + 1);
StorePath storePath = fastFileStorageClient.uploadFile(fileInputStream, file.length(), extName, null);
System.out.println(storePath.getGroup());
System.out.println(storePath.getPath());
System.out.println(storePath.getFullPath());
}
}
控制台
浏览器