分布式文件系统fastdfs

妖狐艹你老母 2022-04-11 08:16 510阅读 0赞

一。介绍fastdfs及原理

FastDFS是一款轻量级的开源分布式文件系统,它用纯C语言实现,支持Linux、FreeBSD、AIX等UNIX系统。只能通过 专有API对文件进行存取访问,不支持POSIX接口方式,不能mount使用.

原理介绍:

服务分为两大部件Tracker server和Storage server :Tracker server负责调度 计算最适合的存储服务器 ,Storage server负责存储数组 Storage server被分为多个组 ,不同的文件上传分发到不同的组中,同一组之间可以形成高可用的主从备份,同一组之间的服务器之间是互为拷贝,数据完全相同

原理图:
在这里插入图片描述
fastdfs操作顺序

fastdfs 安装
查询:docker search fastdfs
下载:docker pull season/fastdfs
本机方式启动注册中心tracker:docker run -itd —name trakcer -v ~/tracker_data:
/fastdfs/tracker/data —net=host season/fastdfs tracker
默认启动22122端口
禁用防火墙:vi /etc/sysconfig/selinux
重启虚拟机:reboot

防火墙禁用方法

在这里插入图片描述
启动仓库storagedocker run -itd --name storage -v ~/storage_data:/fastdfs/storage/data -v ~/store_path:/fastdfs/store_path --net=host -e TRACKER_SERVER:192.168.1.2:22122 season/fastdfs storage

进入容器
进入容器docker exec -it storage bash
查看配置:more storage.conf
复制出来,修改配置再拷贝回去:docker cp storage.conf:/fdfs_conf ~/
拷贝回去:docker cp ./storage.conf storage:/fdfs_conf/
因为docker是精简版的系统

在这里插入图片描述

将ip修改为Linux系统Ip;
重启storage:docker stop storage → docker start storage
再次进入storage容器: docker exec -it storage bash

确认配置是否修改成功

  1. fdfs_monitor fdfs_conf/storage.conf

下图箭头为组名,默认group1,依次往上加,有组号说明tracker已启动
在这里插入图片描述

》》测试文件上传
查看/usr/bin下的所有fdfs工具

  1. [root@bogon fdfs]# ls /usr/bin | grep fdfs
  2. fdfs_appender_test
  3. fdfs_appender_test1
  4. fdfs_append_file
  5. fdfs_crc32
  6. fdfs_delete_file
  7. fdfs_download_file
  8. fdfs_file_info
  9. fdfs_monitor
  10. fdfs_storaged
  11. fdfs_test
  12. fdfs_test1
  13. fdfs_trackerd
  14. fdfs_upload_appender
  15. fdfs_upload_file //上传文件

启动客户端

  1. docker run -itd --name fdfs_sh --net=host season/fastdfs sh
  2. 创建a.txt文件同时赋值: echo Hello>a.txt
  3. root@localhost:/# cd fdfs_conf
  4. root@localhost:/fdfs_conf# fdfs_upload_file storage.conf /a.txt
  5. group1/M00/00/00/wKiuglwGoJWARxYvAAAACZLaVGU072.txt //上传成功 返回的地址
  6. //组名/地址/保证安全替换后的名字.后缀名
  7. -v 映射路径
  8. 下载文件到本地:(fdfs_download_file <config_file> <file_id> [local_filename])
  9. [root@bogon 00]# fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKg6klmyEG-AWCZjAAAADZDfcRo628.txt ~/bb.txt
  10. [root@bogon 00]# ll ~
  11. total 168836
  12. -rw-------. 1 root root 2913 Apr 5 2016 anaconda-ks.cfg
  13. -rw-r--r-- 1 root root 13 Sep 7 20:35 a.txt
  14. -rw-r--r-- 1 root root 13 Sep 7 20:46 bb.tx

删除文件(fdfs_delete_file

  1. [root@bogon 00]# fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKg6klmyEG-AWCZjAAAADZDfcRo628.txt
  2. #删除了该文件 还可以查看到它的信息
  3. [root@bogon 00]# fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKg6klmyEG-AWCZjAAAADZDfcRo628.txt
  4. source storage id: 0
  5. source ip address: 192.168.58.146
  6. file create timestamp: 2017-09-07 20:37:19
  7. file size: 13
  8. file crc32: 2430562586 (0x90DF711A)
  9. #再次尝试删除 发现报错文件不存在
  10. [root@bogon 00]# fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKg6klmyEG-AWCZjAAAADZDfcRo628.txt
  11. [2017-09-07 20:48:23] ERROR - file: tracker_proto.c, line: 48, server: 192.168.58.146:23000, response status 2 != 0
  12. delete file fail, error no: 2, error info: No such file or directory

上传下载代码:
pom.xml文件:

  1. <repositories>
  2. <repository>
  3. <id>cn</id>
  4. <name>sn</name>
  5. <url>https://oss.sonatype.org/content/repositories/releases/</url>
  6. </repository>
  7. </repositories>
  8. <dependencies>
  9. <dependency>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-web</artifactId>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-data-jpa</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>com.luhuiguo</groupId>
  19. <artifactId>fastdfs-spring-boot-starter</artifactId>
  20. <version>0.2.0</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>mysql</groupId>
  24. <artifactId>mysql-connector-java</artifactId>
  25. </dependency>
  26. </dependencies>

controller层:

  1. @RestController
  2. public class UploadController {
  3. @Autowired
  4. private FastFileStorageClient storageClient;
  5. @Autowired
  6. JdbcTemplate jdbcTemplate;
  7. /**
  8. *
  9. * @param myFile 从浏览器提交过来
  10. * @return
  11. */
  12. @PostMapping("/fupload")
  13. public String uploud(@RequestParam("myFile") MultipartFile myFile) throws IOException {
  14. String extName = FilenameUtils.getExtension(myFile.getOriginalFilename());
  15. StorePath sp=storageClient.uploadFile("group1",myFile.getInputStream(),myFile.getSize(),extName);
  16. String sql ="insert into myfile(filename,groupname,filepath) values(?,?,?)";
  17. jdbcTemplate.update(sql,myFile.getOriginalFilename(),sp.getGroup(),sp.getPath());
  18. return sp.getFullPath();
  19. }
  20. @GetMapping("/fdownload/{id}")
  21. public void download(@PathVariable String id , HttpServletResponse response) throws IOException {
  22. List list = jdbcTemplate.query("select * from myfile where fileid ="+id,new ColumnMapRowMapper());
  23. Map map=(Map)list.get(0);
  24. //中文文件名要转码
  25. String fileName = URLEncoder.encode(map.get("filename").toString(),"UTF-8");
  26. String groupName= map.get("groupName").toString();
  27. String pathName = map.get("filePath").toString();
  28. //告诉浏览器下载的文件名
  29. response.setHeader("Content-Disposition","attachment;filename="+ fileName+"");
  30. //将文件内容输出到浏览器
  31. byte[] bytes = storageClient.downloadFile(groupName, pathName);
  32. response.getOutputStream().write(bytes);
  33. }
  34. }

html页面:
上传:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form method="post" enctype="multipart/form-data" action="fupload">
  9. 文件<input type="file" name="myFile">
  10. <input type="submit" value="上传"/>
  11. </form>
  12. </body>
  13. </html>

下载:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <a href="fdownload/1">下载</a>
  9. </body>
  10. </html>

配置文件application.yml:

  1. #window端口:
  2. server:
  3. port: 8899
  4. fdfs:
  5. #连接超时时间(毫秒):
  6. connect-timeout: 10000
  7. #响应超时时间(毫秒):
  8. so-timeout: 3000
  9. #Linux系统Docker地址:
  10. tracker-list:
  11. - 192.168.85.128:22122
  12. spring:
  13. datasource:
  14. #连接数据库:
  15. url: jdbc:mysql://localhost/factory
  16. password: ps123456
  17. driver-class-name: com.mysql.jdbc.Driver
  18. username: root
  19. http:
  20. # 设置下载文件大小,单位byte
  21. multipart:
  22. max-file-size: 10485760

返回数组 返回两个参数 第一个是存储的组名 第二是 文件的路径

发表评论

表情:
评论列表 (有 0 条评论,510人围观)

还没有评论,来说两句吧...

相关阅读

    相关 分布式文件系统FastDFS

    为什么要使用分布式文件系统呢? 嗯,这个问题问的好,使用了它对我们有哪些好处?带着这个问题我们来往下看: 单机时代        初创时期由于时间紧迫,在各种资源有限