FastDFS分布式文件系统(一)

简介

FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

FastDFS开源地址: https://hub.docker.com/r/season/fastdfs/

FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。

  • Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。
  1. 判断有哪些存储服务器(注册中心)
  2. 判断哪个存储服务器的空间较大
  3. 判断资源所在的存储服务器(路由)
  • Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。

  • Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
    FastDFS分布式文件系统(一)_第1张图片

FastDFS环境

  • 操作系统:CentOS7 X64

  • FastDFS: /season/fastdfs

  • 下载

  1. docker pull season/fastdfs
  2. 查看fastdfs的端口是否被占用
netstat -aon | grep 22122
  1. 关闭防火墙
 systemctl stop firewalld

关闭centos 7新防火墙 如下图

find / -name selinux
vi  /etc/sysconfig/selinux

FastDFS分布式文件系统(一)_第2张图片

FastDFS分布式文件系统(一)_第3张图片
4. 执行reboot操作再重启虚拟机重连客户端

创建tracker服务器的容器

docker run -ti -d --name trakcer -v ~/tracker_data:/fastdfs/tracker/data --net=host season/fastdfs tracker

创建storage存储服务器

  • 指定tracker服务器的地址(通过环境变量)
  • storage文件位置 /store_path
docker run -tid --name storage -v ~/storage_data:/fastdfs/storage/data -v ~/store_path:/fastdfs/store_path --net=host -e TRACKER_SERVER:192.168.229.129:22122 season/fastdfs storage

在这里插入图片描述

FastDFS分布式文件系统(一)_第4张图片

  • 指定storage服务器注册到trakcer服务器的ip地址未生效,需要手动设置
  1. 进入storage容器下,将fdfs_conf目录下的storage.conf文件拷贝到root目录下
docker exec -it storage bash
docker cp storage:/fdfs_conf/storage.conf ~/
  1. 编辑storage.conf文件,将地址指上
vi storage.conf

FastDFS分布式文件系统(一)_第5张图片

  • 将编辑好的文件再拷贝回去
docker cp ~/storage.conf  storage:/fdfs_conf/
  • 启动fastdfs客户端
  • 将storage服务器的配置文件拷贝到客户端 fdfs_sh:/fdfs_conf/
docker run -ti --name fdfs_sh --net=host season/fastdfs sh
docker cp ~/storage.conf  fdfs_sh:/fdfs_conf/
  • 重启进入服务
  • 查看配置更改否
fdfs_monitor storage.conf

FastDFS分布式文件系统(一)_第6张图片

  • 这时storage存储服务器已注册到trakcer服务器上,开启8888端口,接下来我们就可以实现上传下载文件

演示上传

  • FastDFS命令行
[root@bogon fdfs]# ls /usr/bin | grep fdfs
fdfs_appender_test
fdfs_appender_test1
fdfs_append_file
fdfs_crc32
fdfs_delete_file
fdfs_download_file
fdfs_file_info
fdfs_monitor
fdfs_storaged
fdfs_test
fdfs_test1
fdfs_trackerd
fdfs_upload_appender
fdfs_upload_file
  • 上传文件必须指定配置文件
    FastDFS分布式文件系统(一)_第7张图片

测试上传下载文件(IDEA篇)

  1. 依赖
  • fastdfs这里引用了私服仓库上的jar包,需指上地址
<repositories>
        <repository>
            <id>sn</id>
            <name>sn</name>
            <url>https://oss.sonatype.org/content/repositories/releases/</url>
        </repository>
    </repositories>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.luhuiguo</groupId>
            <artifactId>fastdfs-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
    </dependencies>
  1. application.yml文件
server:
  port: 8899
fdfs:
#连接世界
  connect-timeout: 10000
  #响应时间
  so-timeout: 3000
  tracker-list:
  - 192.168.229.129:22122
spring:
  datasource:
    url: jdbc:mysql://localhost/accounts
    password: ps123456
    username: root
    driver-class-name: com.mysql.jdbc.Driver
    # 上传文件限制大小(字节)
  http:
    multipart:
      max-file-size: 10485760
  1. 数据库新建myfile表
    FastDFS分布式文件系统(一)_第8张图片

  2. 做一个简单的html 上传、下载

  • HTML静态文件放置在resources目录下的static/public目录
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form method="post" enctype="multipart/form-data" action="fupload">
        文件<input type="file" name="myFile" />
        <input type="submit" value="上传" />
    </form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/fdownload/1">下载</a>
</body>
</html>
  1. main方法
@SpringBootApplication
public class FileMain {
    public static void main(String[] args) {
        SpringApplication.run(FileMain.class);
    }
}
  1. controller层
@RestController
public class Upload {
    @Autowired
    private FastFileStorageClient storageClient;
    @Autowired
    JdbcTemplate jdbcTemplate;

    /** 获取后缀 :FilenameUtils.getExtension()
     *  获取文件名:myFile.getOriginalFilename();
     * @param myFile 从浏览器传过来
     * @return
     */
    //上传
    @PostMapping("fupload")
    public String upload(@RequestParam("myFile") MultipartFile myFile) throws IOException {
        String extName= FilenameUtils.getExtension(myFile.getOriginalFilename());
        StorePath storePath = storageClient.uploadFile("group1",myFile.getInputStream(),myFile.getSize(),extName);
        String sql="insert into myfile(filename,groupName,filepath) values (?,?,?)";
        jdbcTemplate.update(sql,myFile.getOriginalFilename(),storePath.getGroup(),storePath.getPath());
        return storePath.getFullPath();
    }

    //下载
    @GetMapping("/fdownload/{id}")
    public void download(@PathVariable String id, HttpServletResponse httpServletResponse) throws IOException {
        List query = jdbcTemplate.query("select * from myfile where fileid = "+id, new ColumnMapRowMapper());
        Map map= (Map) query.get(0);
        //解决中文乱码
        String fileName=URLDecoder.decode(map.get("filename").toString(),"UTF-8");
        String groupName=map.get("groupName").toString();
        String filePath=map.get("filepath").toString();
        //设置响应头,告诉浏览器下载的文件名
        httpServletResponse.setHeader("Content-Disposition","attachment; filename="+fileName+"");
        //将文件内容输出到浏览器
        byte[] bytes = storageClient.downloadFile(groupName, filePath);
        httpServletResponse.getOutputStream().write(bytes);
    }
}

测试访问 http://localhost:8899/upload.html

你可能感兴趣的:(FastDFS分布式文件系统)