2021-04-09-分布式文件服务器FastDFS

什么是FastDFS

  • FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
    使用FASTDFS的公司有:
    支付宝,京东商城,赶集网,淘米网,迅雷,UC等等。

FastDFS架构

  • FastDFS架构包括 Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Trackerserver调度最终由Storage server完成文件上传和下载。
  • Trackerserver作用是负载均衡和调度,通过Trackerserver在文件上传时可以根据一些策略找到Storageserver提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。
  • Storageserver作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器。

文件上传流程

在这里插入图片描述

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

FastDFS原理

  • 存储节点采用了分组(group)的方式。存储系统由一个或多个group组成,group与group之间的文件是相互独立的,所有group的文件容量累加就是整个存储系统中的文件容量。一个group可以由一台或多台存储服务器组成,一个group下的存储服务器中的文件都是相同的,group中的多台存储服务器起到了冗余备份和负载均衡的作用。在group中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加group。只需要增加一台或多台服务器,并将它们配置为一个新的group,这样就扩大了存储系统的容量。
  • FastDFS只有两个角色:Tracker server和Storage server。Tracker server作为中心结点,其主要作用是负载均衡和调度。Tracker server在内存中记录分组和Storage server的状态等信息,不记录文件索引信息,占用的内存量很少。

Docker安装FastDFS

  • 用Docker搜索FastDFS相关镜像
    docker search fastdfs
    在这里插入图片描述

  • 拉取相关镜像、
    docker pull ygqygq2/fastdfs-nginx

  • 根据镜像创建容器,运行tracker服务 22122
    docker run -d --network=host --name tracker -v /usr/local/fdfs/tracker:/var/fdfs ygqygq2/fastdfs-nginx tracker
    说明: --network=host表示容器和宿主机共享同一个网络和端口。
    -v:表示容器和宿主机映射一个数据卷
    -d:后台运行

  • 根据镜像创建容器,运行storage服务Nginx服务 23000
    docker run -d --network=host --name storage0 -e TRACKER_SERVER=192.168.189.137:22122 -v /usr/local/fdfs/storage0:/var/fdfs ygqygq2/fastdfs-nginx storage
    因为storage中Nginx默认端口号是8080,我们宿主机中已有一个tomcat启动,所以导致nginx启动失败,解决办法修改Ngxin的端口为80,然后进入到storage容器启动nginx。
    cd /usr/local/nginx/sbin
    ./nginx

  • 第二次启动tracker和srorage服务
    1.先查询以往运行过的所有容器,找到这个两个服务
    docker ps -a
    在这里插入图片描述
    2.找到对应的对应的服务后,根据ID启动
    docker start a8da2539e996
    3.如有需要进入到容器中进行相关操作
    docker exec -i -t a8da2539e996 /bin/bash

SpringBoot整合FastDFS

  • 添加依赖
<dependency>
   <groupId>com.github.tobato</groupId>
   <artifactId>fastdfs-client</artifactId>
   <version>1.26.1-RELEASE</version>
</dependency>
  • 导入配置
@SpringBootApplication(scanBasePackages = "com.qf")
@Import(FdfsClientConfig.class)
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class ShopBackApplication {
   public static void main(String[] args) {
      SpringApplication.run(ShopBackApplication.class, args);
   }
}
  • application.properties中配置
#上传的超时时间
fdfs.connect-timeout=10000
#连接超时时间
fdfs.so-timeout=10000
#缩略图生成参数
fdfs.thumb-image.height=100
fdfs.thumb-image.width=100

#TrackerList参数,支持多个
fdfs.tracker-list[0]=192.168.189.137:22122

#FastDFS服务器的路径
fastdfspath=http://192.168.189.137:8080/
  • 上传文件Controller
@Controller
public class CommonController {

    @Value("${fastdfspath}")
    private String fastdfspath;

    @Autowired
    private FastFileStorageClient ffsc;

    @ResponseBody
    @RequestMapping(value = "/uploadFile")
    public String  uploadFile(MultipartFile file){
        System.out.println(file);
        //截取源图片的后缀
        String originalFilename = file.getOriginalFilename();
        int index = originalFilename.lastIndexOf(".");
        String houzhui = originalFilename.substring(index + 1);
        String uploadFile = "";
        try {
            StorePath storePath = ffsc.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(), houzhui, null);
           uploadFile = storePath.getFullPath();
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("file:"+fastdfspath+uploadFile);
        return fastdfspath+uploadFile;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值