FastDFS

FastDFS

解决海量数据存储问题。适合存储中小型文件(建议范围:4KB < file_size <500MB)

分布式文件系统

解决单机下单点故障问题

优点

  • 扩展能力: 毫无疑问,扩展能力是一个分布式文件系统最重要的特点;
  • 高可用性: 在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的完整和一致性;
  • 弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行。

缺点:系统复杂度稍高,需要更多服务器

fastDFS特性:不分块存储,相同内容保存一份,支持在线扩容、主从文件。

分布式文件服务提供商:百度云,阿里云等。

fastDFS服务端三个角色

FastDFS服务端有三个角色:跟踪服务器(tracker)、存储服务器(storage)和客户端(client)。

上传机制

下载机制

客户端带上文件名信息请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端。

FastDFS环境搭建_Linux

opt中下载

yum install gcc-c++ perl-devel pcre-devel openssl-devel zlib-devel wget

上传文件 到opt目录

解压

tar -zxvf V1.0.43.tar.gz -C /usr/local
tar -zxvf  V6.06.tar.gz-C /usr/local

进入local中查看解压文件,进入文件并编译并安装libfastcommon

 cd /usr/local/libfastcommon-1.0.43/
 ./make.sh
 ./make.sh install

编译并安装FastDFS

cd /usr/local/fastdfs-6.06
./make.sh 
./make.sh install

  进入etc目录下复制配置文件

cd /etc/fdfs/
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf

创建tracker服务(真正存储数据的服务)

创建tracker目录mkdir -p  /data/fastdfs/tracker

修改配置文件

vim /etc/fdfs/tracker.conf
disabled=false          #启用配置文件
port=22122            #设置 tracker 的端口号
base_path=/data/fastdfs/tracker #设置 tracker 的数据文件和日志目录(需预先创建)
http.server_port=8888      #设置 http 端口号
http.server_port=8888      #指的是在tracker服务器上启动http服务进程,如:apache或者nginx 启动时所监听的端口

 设置http的端口号为8888,利用搜索快速查询位置

启动tracker服务:/etc/init.d/fdfs_trackerd start

查看是否启动

netstat -lntup |grep fdfs

创建storage服务

创建storage目录

mkdir -p /data/fastdfs/base
mkdir -p /data/fastdfs/storage

修改配置文件

vim /etc/fdfs/storage.conf
disabled=false             #启用配置文件
group_name=group1           #组名,根据实际情况修改
port=23000               #设置 storage 的端口号
base_path=/data/fastdfs/base      #设置 storage 的日志目录(需预先创建)
store_path_count=1           #存储路径个数,需要和 store_path 个数匹配
store_path0=/data/fastdfs/storage     #存储路径
tracker_server=192.168.202.100:22122    #tracker 服务器的 IP 地址和端口号
http.server_port=8888         #设置storage上启动的http服务的端口号,如安装的nginx的端口号

启动storage服务:/etc/init.d/fdfs_storaged start

查看storage服务:netstat -lntup |grep fdfs

修改Client配置文件

vim /etc/fdfs/client.conf
connect_timeout=30
network_timeout=60
base_path=/data/fastdfs/client      # 日志路径
tracker_server=192.168.202.100:22122    # 追踪服务器的IP,有多个服务器可以另一行

fastDFS指令

上传指令:

fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index]

参数含义:

  1. <config_file> :配置文件路径
  2. <local_filename> :本地文件路径
  3. [storage_ip:port] :(可选参数)
  4. [store_path_index] :(可选参数)

在fastdfs中创建client文件夹:mkdir client

得到group1/M00/00/00/wKjKZGT2owWAAAr1AAXKAuP0f7M780.png

上传文件后会返回文件在FastDFS中的唯一文件标识,即卷名+文件名

下载指令:

fdfs_download_file <config_file> <file_id> [local_filename] [<download_offset> <download_bytes>]

参数含义:

  1. <config_file> :配置文件路径
  2. <file_id> :文件在FastDFS中的唯一文件标识,即卷名+文件名
  3. [local_filename] :文件下载地址
  4. <download_offset> :(可选参数)文件下载开始时间
  5. <download_bytes> :(可选参数)文件下载的字节数

删除opt中的图片: rm -rf 公子.png

利用文件串下载图片到opt

查看文件信息指令

fdfs_file_info <config_file> <file_id>

参数含义:

  1. <config_file> :配置文件路径
  2. <file_id> :文件在FastDFS中的唯一文件标识,即卷名+文件名

删除指令

fdfs_delete_file <config_file> <file_id>

参数含义:

  1. <config_file> :配置文件路径
  2. <file_id> :文件在FastDFS中的唯一文件标识,即卷名+文件名

删除指令使用后,文件在该卷中的所有备份都会被删除,因为卷内的存储节点会相互同步,故慎用。

再次下载图片时将报错

SpringBoot整合FastDFS

通过java客户端操作系统

构建SpringBoot项目

暂时不写入组件

引入依赖

<dependency>
  <groupId>com.github.tobato</groupId>
  <artifactId>fastdfs-client</artifactId>
  <version>1.26.5</version>
</dependency>

修改配置文件为yum文件的形式

针对分布式文件进行配置

===================================================================
# 分布式文件系统FDFS配置
===================================================================
fdfs:
#连接时间
  so-timeout: 1501
#超时时间
  connect-timeout: 601
#TrackerList参数,支持多个
#注意-与ip之间有空格!!!
  tracker-list:       
   - 192.168.202.100:22122



在测试类中进行编写

//创建对象,fasrdfs存储节点的客户端对象
@Autowired
private FastFileStorageClient fastFileStorageClient;

//测试Springboot环境下javaapi对分布式文件系统上传文件的操作
@Test
public void testUpload(){
    //1.获取本地文件
    File file = new File("d:\\公子.png");
    //2.创建传输文件的输入流
    FileInputStream fileInputStream = new FileInputStream(file);
    //3.文件上传
//第一个参数:输入文件内容的输入流
//第二个参数:文件大小
//第三个参数:文件拓展名   
//第四个参数:描述文件的元数据
     StorePath storePath = fastFileStorageClient.uploadFile(fileInputStream,file.length(),"png",null);
    //4.将卷名和文件名一起打印
    System.out.println(storePath.getFullPath());
    System.out.println("+++++++++++++++++++++++");
    //5.将卷名和文件分开打印
    System.out.println(storePath.getPath());

}

 执行成功显示相关信息

在虚拟机中查看图片是否成功上传

测试文件下载,d盘中删除原图片(即公子.png)

/**
   * 测试springboot环境下的javaAPI对分布式文件系统的下载文件的操作
   * @throws IOException
   */
   @Test
   public void testDownload() throws IOException {
     //1.下载文件:参数一:文件处于存储节点的卷名;参数二:文件在存储节点的文件名;参数三:下载的回调函数;返回值:文件内容的字节数组
     byte[] bytes = fastFileStorageClient.downloadFile("group1", "文件名.png", new DownloadByteArray());
     //2.创建文件输出流,指定输出位置及文件名
     FileOutputStream fileOutputStream = new FileOutputStream("d:\\公子.png");
     //3.使用文件输出流将文件内容字节数组写出
     fileOutputStream.write(bytes);
     //4.刷新输出流
     fileOutputStream.flush();
     //5.关闭输出流
     fileOutputStream.close();
   }

执行后d盘显示文件表明下载成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值