什么是FastDFS

原创
小哥 3年前 (2022-10-20) 阅读数 58 #技术教程
文章标签 FastDFS

文章大纲

一、FastDFS介绍
二、FastDFS安装和启动(安装和启动(Linux系统)
三、Java客户端上传图片客户端上传图片客户端上传图片客户端上传图片
四、参考文献四、参考文献

一、FastDFS介绍

1. 什么是FastDFS

FastDFS是用C在开源分布式文件系统中编写的语言。FastDFS为互联网量身定做,充分考虑冗余备份、负载均衡、线性伸缩等机制,重点关注高可用性、高性能等指标,使用FastDFS很容易构建高性能的文件服务器集群,以提供文件上传、下载等功能。

2. FastDFS架构

FastDFS架构包括 Tracker server和Storage server
Tracker server作用是对Storage server负载平衡和调度,在上传文件时发出直接请求Tracker server,然后Tracker server有些策略可以根据某些策略找到,有些策略可以根据某些策略找到Storage server提供文件上传服务。因此,您可以将tracker它被称为跟踪服务器或调度服务器。
Storage server角色是文件存储,客户端上传的文件最终存储在Storage在服务器上。在服务器上。Storage server它没有实现自己的文件系统,而是使用操作系统的文件系统来管理文件。有可能整合成storage它被称为存储服务器。称为存储服务器。称为存储服务器。称为存储服务器。
具体结构如下图所示。具体结构如下所示。

2.1 Tracker 集群
FastDFS集群中的Tracker server可以有多个单元。可以有不止一个。可以有多个单元。可以有多组Tracker server两者之间的关系是相互的,平等的,提供服务的。Tracker server不存在单点故障。客户端请求Tracker server使用轮询方法,如果被请求使用轮询,如果被请求使用轮询,如果被请求tracker如果该服务不可用,请更改为其他服务tracker。

2.2 Storage集群
Storage该群集使用分组存储。该群集使用组存储。对集群进行分组以进行存储。对集群进行分组以进行存储。storage群集由一个或多个组组成,其中一个组由一个或多个存储服务器组成,组Storage server在不同的群体之间有平等的关系Storage server不相互通信,同一组内的Storage server这些文件相互连接以进行文件同步,从而确保每个storage群集上的文件是相同的。组的存储容量是组内存储服务器容量最小的组,集群总存储容量是集群内所有组的存储容量之和,说明组内存储服务器的硬件和软件配置最好是相同的。
使用组存储的优势在于其灵活性和可控性。例如,上载文件时,上载到的组可以由客户端直接指定,也可以由tracker做出日程安排选择。当集群中存储服务器的访问压力较大时,可以通过在集群中增加存储服务器来扩展服务能力(垂直扩展)。当系统容量不足时,可以通过添加组来扩展存储容量(横向扩展)。

2.3 文件上载过程文件上载过程

客户端上传文件后,存储服务器发送文件ID返回到客户端,此文件返回到客户端,此文件返回到客户端,此文件ID索引信息以供以后访问该文件。文件索引信息包括:组名、虚拟磁盘路径、数据两级目录、文件名。

上传说明
(1)组名:上传后文件所在的组名storage组名,文件上传成功后有storage服务器返回,需要由客户端自己保存。
(2)虚拟磁盘路径。)虚拟磁盘路径。)虚拟磁盘路径。storage配置的虚拟路径,使用磁盘选项配置的虚拟路径,使用磁盘选项配置的虚拟路径,使用磁盘选项store_path*通信。如果配置为store_path0则是M00如果您已配置,如果您已配置IF,请使用配置store_path1则是M01诸若此类。以此类推。
(3)数据两级目录。)两级数据目录。)数据两级目录。)数据双层目录。storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
(4)文件名:与上传文件时不同。由存储服务器根据具体信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件扩展名信息。

2.4 文件下载过程文件下载流程文件下载过程

tracker根据请求的文件路径,即文件ID 以快速定义该文件。以快速定义文件。以快速定义文件。要快速定义文件,请执行以下操作。
例如,请求以下文档。例如,请求以下文档。

下载说明
(1按组名)按组名tracker快速定位客户端需要访问的存储服务器组的能力是group1并选择适当的存储服务器以提供客户端访问。
(2存储服务器可以根据文件存储虚拟磁盘路径和数据文件两级目录快速定位文件目录,并根据文件名找到客户端需要访问的文件。

二、FastDFS安装和启动(安装和启动(Linux系统)

1. 安装libfastcommon

(1)获取libfastcommon安装包:

获取libfastcommon安装包:
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.38.tar.gz

(2)解压安装包。)以解压缩安装包。)解压缩安装包。)要解压缩安装包,请执行以下操作:tar -zxvf V1.0.38.tar.gz
(3)访问目录。)才能访问目录。)转到目录:cd libfastcommon-1.0.38
(4)以执行编译。)执行的编译。)执行编译。)执行编译。./make.sh
(5)安装:./make.sh install

(6可能的问题)可能遇到的问题

-bash: make: command not found
-bash: gcc: command not found

解决办法。解决方案。解决方案。
debian通过apt-get install gcc make安装
centos通过yum -y install gcc make安装

2. 安装FastDFS

(1)获取fdfs安装包:
wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz

(2)解压安装包。)以解压缩安装包。)解压缩安装包。)要解压缩安装包,请执行以下操作:tar -zxvf V5.11.tar.gz
(3)访问目录。)才能访问目录。)转到目录:cd fastdfs-5.11
(4)以执行编译。)执行的编译。)执行编译。)执行编译。./make.sh
(5)安装:./make.sh install

(6)查看可执行命令。)以查看可执行命令。)要查看可执行命令,请执行以下操作。)查看可执行命令。ls -la /usr/bin/fdfs*

3. 配置Tracker服务

(1)进入/etc/fdfs目录,有三个目录和三个目录.sample带后缀的文件(自动生成)带后缀的文件(自动生成)fdfs模板配置文件),通过模板配置文件)通过模板配置文件cp命令拷贝tracker.conf.sample,删除.sample作为官方文件的后缀。作为官方文件的后缀。作为正式文件的后缀:。作为官方文件的后缀。

(2)编辑tracker.conf:vi tracker.conf、修改相关参数

base_path=/home/mm/fastdfs/tracker  #tracker存储data和log必须提前创建跟随路径。必须提前创建跟随路径
port=23000 #tracker默认23000 http.server_port=80 #http端口,它需要连接到端口,它需要连接到端口,需要连接到端口,需要连接到nginx相同 

(3)启动tracker(支持start|stop|restart):

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

(4)查看tracker启动日志:转到刚刚指定的启动日志:转到刚刚指定的启动日志:转到启动日志:转到base_path(/home/mm/fastdfs/tracker)中有个logs目录、查看目录、查看tracker.log文件

(5)查看端口状态。)查看端口状态。)查看港口情况。)检查端口状态。netstat -apn|grep fdfs

(6)可能遇到错误)可能的错误报告)可能的错误)可能的错误消息

/usr/bin/fdfs_trackerd: error while loading shared libraries: libfastcommon.so: cannot open shared object file: No such file or directory

解决办法。解决方案。解决方案。建立libfastcommon.so软链接
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so

4. 配置Storage服务

(1)进入/etc/fdfs目录,有cp命令拷贝storage.conf.sample,删除.sample后缀为公文后缀;
(2)编辑storage.conf:vi storage.conf、修改相关参数:

base_path=/home/mm/fastdfs/storage   #storage存储data和log必须提前创建跟随路径。必须提前创建跟随路径
port=23000 #storge默认23000同一组中的同一组storage端口号必须相同端口号必须相同 group_name=group1 #默认组名,根据实际情况更改 store_path_count=1 #要存储的路径数与store_path个数匹配 store_path0=/home/mm/fastdfs/storage #如果为空,则使用If Empty,如果为空,则使用base_path tracker_server=10.122.149.211:22122 #配置该storage监听的tracker的ip和port 

(3)启动storage(支持start|stop|restart)

/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start

(4)查看storage启动日志:转到刚刚指定的启动日志:转到刚刚指定的启动日志:转到启动日志:转到base_path(/home/mm/fastdfs/storage)中有个logs目录、查看目录、查看storage.log文件

(5),然后勾选)此时,然后勾选)此时,勾选tracker日志:发现选举已经开始,并成为唯一tracker当选为,当选为leader

(6)查看端口状态。)查看端口状态。)查看港口情况。)检查端口状态。netstat -apn|grep fdfs

(7)通过monitor来查看storage是否绑定成功绑定是否成功绑定是否成功

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

5. 安装Nginx和fastdfs-nginx-module模块

(1)下载Nginx安装包
wget http://nginx.org/download/nginx-1.15.2.tar.gz

(2)下载fastdfs-nginx-module安装包
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz

(3)解压nginx:tar -zxvf nginx-1.15.2.tar.gz

(4)解压fastdfs-nginx-module:tar -xvf V1.20.tar.gz

(5)进入nginx目录:cd nginx-1.10.1

(6)安装依赖库)安装依赖库)安装依赖库

apt-get update
apt-get install libpcre3 libpcre3-dev openssl libssl-dev libperl-dev

(7)配置,并加载)配置,并加载)配置,并加载fastdfs-nginx-module模块:

./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/fastdfs-nginx-module-1.20/src/ 

(8)编译和安装。)编译和安装。)编译和安装:。

make
make install

(9)查看安装路径。)以查看安装路径。)查看安装路径。)要查看安装路径:。whereis nginx

  1. 开始,停止。开始,停止。开始和停止。

    cd /usr/local/nginx/sbin/ ./nginx ./nginx -s stop #这种方法相当于首先找出nginx进程id再使用kill强制进程终止命令强制终止进程命令 ./nginx -s quit #这样停止的步骤是这样的停止步骤是这样的nginx该进程在处理完任务后停止 ./nginx -s reload

(11)验证启动状态。)验证启动状态。)验证的启动状态。)验证启动状态。wget " http://127.0.0.1 "

(12查看当前)查看当前)查看)查看nginx版本:发现版本:发现fastdfs模块已安装模块已安装

(13)可能错误报告)可能错误报告)可能错误(可能错误)

/usr/include/fastdfs/fdfs_define.h:15:27: fatal error: common_define.h: No such file or directory 解决办法。解决方案。解决方案。修改fastdfs-nginx-module-1.20/src/config文件,然后重做该文件,然后重做7步开始 ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/" CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/" 

6. 配置Nginx和fastdfs-nginx-module模块

(1)配置mod-fastdfs.conf并将其复制到并复制到和复制到并复制到/etc/fdfs在文件目录下的文件目录下,在文件目录下的文件目录下

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

(2)进入/etc/fdfs修改mod-fastdfs.conf

base_path=/home/mm/fastdfs
tracker_server=10.122.149.211:22122 #tracker的地址
url_have_group_name=true #url是否包含group名称
storage_server_port=23000 #需要和storage相同配置的相同配置
store_path_count=1  #要存储的路径数与store_path个数匹配 store_path0=/home/mm/fastdfs/storage #文件存储位置存储文件的位置 

(3)配置nginx,80端口server增加location如图

cd /usr/local/nginx/conf/
vi nginx.conf

(4最后,你需要复制)最后,你需要复制)最后需要复制fastdfs解压缩中的目录解压缩其中http.conf和mime.types

cd /usr/local/src/fastdfs-5.11/conf
cp mime.types http.conf /etc/fdfs/

7. FastDFS通用命令测试通用命令测试通用命令测试

7.1 上传文件
(1)进入/etc/fdfs目录,有cp命令拷贝client.conf.sample,删除.sample后缀为公文后缀;
(2)修改client.conf相关配置。相关配置。

base_path=/home/mm/fastdfs/tracker //tracker服务器文件路径服务器文件路径
tracker_server=10.122.149.211:22122 //tracker服务器IP地址和端口号地址和端口号地址和端口号 http.tracker_server_port=80 # tracker服务器的http端口号,必须与端口号相同,必须与tracker对应的设置对应于的设置对应于的设置 

(3创建新测试文档)创建新测试文件)创建新测试文件1.txt,内容为abc
(4)命令

/usr/bin/fdfs_upload_file   

(5)示例

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

组名:group1 
磁盘:M00 
目录:00/00 
文件名。文档名称。文件的名称。CnqV01trmeyAbAN0AAAABLh3frE677.txt

(6要查看结果,请转到)要查看结果,请转到storage的data目录

(7)通过wget浏览器访问成功,基于浏览器访问成功

wget http://10.122.149.211/group1/M00/00/00/CnqV01trmeyAbAN0AAAABLh3frE677.txt

7.2 下载文件
(1)命令

/usr/bin/fdfs_download_file   [local_filename]

(2)示例

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

(3查看结果查看结果)查看结果

7.3 删除文件
(1)命令

/usr/bin/fdfs_delete_file  

(2)示例

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

(3要查看结果,请转到)要查看结果,请转到storage的data目录文件不存在,并且该文件通过wget再次获取404:

温馨提示:现在温馨提示:现在FastDFS该安装似乎不支持Windows

三、Java客户端上传图片客户端上传图片客户端上传图片客户端上传图片

1. 新建maven项目

2. pom.xml要添加相关依赖项的文件要添加相关依赖项的文件向文件添加依赖项向文件添加依赖项


        
         cn.bestwu fastdfs-client-java 1.27    org.testng testng RELEASE    commons-io commons-io 2.6   

3. 添加配置文件内容添加配置文件内容

connect_timeout = 2
network_timeout = 30
charset = UTF-8
# Tracker在配置文件中配置,在配置文件中配置http端口
http.tracker_http_port = 80
http.anti_steal_token = no
http.secret_key = FastDFS1234567890
# Tracker服务器地址服务器地址
tracker_server = 192.168.105.133:22122
tracker_server = 192.168.105.134:22122

4. 创建Java_Tools类使用单元测试测试文件上载和下载

import org.apache.commons.io.IOUtils;
import org.csource.common.MyException;
import org.csource.fastdfs.*;
import org.testng.annotations.Test; import java.io.FileOutputStream; import java.io.IOException; public class Java_Tools { // 本地文件位置本地文件位置 String local = "C:\Users\XY\Documents\上传.txt"; // 声明跟踪器客户端对象声明跟踪器客户端对象声明跟踪器客户端对象 TrackerClient trackerClient = null; // 声明内存客户端对象声明内存客户端对象声明内存客户端对象 StorageClient1 storageClient1 = null; // 报表跟踪器服务目标报表跟踪器服务接收方报表跟踪器服务目标 TrackerServer trackerServer = null; // 内存服务接收方声明内存服务接收方声明内存服务用户声明内存服务目标声明 StorageServer storageServer = null; // 文件上传 @Test public void testUpload() { try { // 初始化配置文件初始化配置文件初始化配置文件 ClientGlobal.init("fdfs_client.conf"); // 创建跟踪器客户端对象创建跟踪器客户端对象创建跟踪器客户端对象 trackerClient = new TrackerClient(); // 获取跟踪器连接获取跟踪器连接获取跟踪器连接 trackerServer = trackerClient.getConnection(); // 获取内存客户端对象获取内存客户端对象获取内存客户端对象 storageClient1 = new StorageClient1(trackerServer, storageServer); // 上传文件并返回文件标识 String index = storageClient1.upload_file1(local, null, null); // 查看标识 System.out.println(index); } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } } // 文件下载 @Test public void testDownload() { try { ClientGlobal.init("fdfs_client.conf"); trackerClient = new TrackerClient(); trackerServer = trackerClient.getConnection(); storageClient1 = new StorageClient1(trackerServer, storageServer); // 根据文件标识下载文件 byte[] by = storageClient1.download_file1("group1/M00/00/00/wKhphVrxnTeAPEznAANfM1yHJic535.txt"); // 将数据写入输出流 IOUtils.write(by, new FileOutputStream("C:\Users\XY\Documents\下载.txt")); } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } } // 文件删除 @Test public void testDelete() { try { ClientGlobal.init("fdfs_client.conf"); trackerClient = new TrackerClient(); trackerServer = trackerClient.getConnection(); storageClient1 = new StorageClient1(trackerServer, storageServer); // 根据文件的标识符来删除文件,返回0则删除成功,则删除成功 int i = storageClient1.delete_file1("group1/M00/00/00/wKhphVry2QmAXgH2AANfM1yHJic724.txt"); if (i == 0) { System.out.println("删除成功"); } else { System.out.println("删除失败"); } } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } } // 文件信息 @Test public void testGetFileInfo() { try { ClientGlobal.init("fdfs_client.conf"); trackerClient = new TrackerClient(); trackerServer = trackerClient.getConnection(); storageClient1 = new StorageClient1(trackerServer, storageServer); // 基于文档标识获取文档信息 FileInfo fileInfo = storageClient1.get_file_info1("group1/M00/00/00/wKhphVry2QmAXgH2AANfM1yHJic724.txt"); // 文件IP地址 System.out.println(fileInfo.getSourceIpAddr()); // 文件大小 System.out.println(fileInfo.getFileSize()); // 创建时间 System.out.println(fileInfo.getCreateTimestamp()); // 错误校验码错误校验和 System.out.println(fileInfo.getCrc32()); } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } } } 

四、参考文献四、参考文献

  1. https://www.cnblogs.com/handsomeye/p/9451568.html
  2. https://blog.csdn.net/xy_2017chasedream/article/details/80258526
  3. http://yun.itheima.com/course?hm

转载于:https://www.cnblogs.com/WUXIAOCHANG/p/10954475.html

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门