Docker部署Fastdfs
大数据: http://hadoop.apache.org/MFS: https://moosefs.com/fastdfs:https://github.com/happyfish100/fastdfs1.介绍fastdfs及原理FastDFS是一款轻量级的开源分布式文件系统,它用纯C语言实现,支持Linux、FreeBSD、AIX等UNIX系统。只能通过 专有API对文件进行存取...
大数据: http://hadoop.apache.org/
MFS: https://moosefs.com/
fastdfs:https://github.com/happyfish100/fastdfs
1.介绍fastdfs及原理
FastDFS是一款轻量级的开源分布式文件系统,它用纯C语言实现,支持Linux、FreeBSD、AIX等UNIX系统。只能通过 专有API对文件进行存取访问,不支持POSIX接口方式,不能mount使用。
原理介绍:
服务分为两大部件Tracker server和Storage server Tracker server负责调度 计算最适合的存储服务器 Storage server负责存储数组 Storage server被分为
运行过程:
1.Client询问Tracker server ,Tracker server通过负载算法 返回一台存储 的Storage server
2.Tracker server 返回的数据为该Storage server的IP地址和端口
3.Client直接和该Storage server建立连接,进行文件上传,Storage server返回新生成的文件ID,文件上传结束
Client客户端
Tracker服务器
1.判断有哪些存储服务器(注册中心)eureka
2.判断哪个存储服务器空间比较大
3.判断资源所在的存储服务器(路由)zuul
Storage服务器
每台Storage服务器都有一个备份Storage服务器
推荐
高可用,不会造成服务器奔溃
编辑模式
文件在文件系统存储的格式
gruop组名 如果有几台stroage服务器是相同的组名表示这些服务器是互为主从(备份)
文件格式
M数字/数字/文件
group1/M00/00/00/wKiuglwGsX-Aa62AAACf_PEcWVI803.png
关闭linux和centos防火墙
linux防火墙:systemctl disable|enable firewalld
搜索:find / -name selinuxfind / -name selinux
编辑:vi /etc/sysconfig/selinux
修改属性:
2.fastdfs的部署
下载fastdfs镜像:docker pull season/fastdfs
创建trakcer容器:docker run -ti -d --name trakcer -v ~/tracker_data:/fastdfs/tracker/data --net=host season/fastdfs tracker
注意:默认端口:22122,容器是关闭状态请设置一下防火墙。
创建storage容器:docker run -tid --name storage -v ~/storage_data:/fastdfs/storage/data -v ~/store_path:/fastdfs/store_path --net=host -e TRACKER_SERVER:192.168.153.133:22122 season/fastdfs storage
查看可用storage服务器在trakcer容器的
进入:docker exec -it trakcer bash 查看:ls
进入:cd fdfs_conf/ 查看ls
查看可用的storage服务器:fdfs_monitor storage.conf
将storag服务器ip注册到trakcer服务器里
进入storag容器:docker exec -it storage bash 查看ls
进入cd fsfs_conf 查看ls
查看ip地址有没有改:more storage.conf
将storage.conf文件拷贝到跟目录:docker cp storage:/fdfs_conf/storage.conf ~/
编辑: vi storage.conf修改为linux的Ip
修改完成后再拷贝回去:docker cp ~/storage.conf storage:/fdfs_conf/
关闭容器:docker stop storage在开启容器:**docker start storage
再次进入storag容器的storage.conf所在目录查看:fdfs_monitor storage.conf
查看22122端口是否可用
是否被占用:netstat -ano | grep 22122
是否能通:telnet localhost 22122 出现以下说明可用
演示上传文件
此容器只能操作文件:docker run -ti --name fdfs_sh --net=host season/fastdfs sh
将storage.conf拷贝到fdfs_sh:/fdfs_conf/目录下:docker cp ~/storage.conf fdfs_sh:/fdfs_conf/
创建一个a.txt文件:echo hello>a.txt
进入cd: fdfs_conf 上传文件:fdfs_upload_file storage.conf /a.txt 出现以下上传成功
group1/M00/00/00/wKiZhVwGlJOAYEPIAAAABncc3SA782.txt
在linux根目录
cd store_path
cd data
cd 00
cd 00
more wKiZhVwGlJOAYEPIAAAABncc3SA782.txt 结果:
hello
3.Windos上传文件与下载文件
1. 创建FASTDFS子模块项目,父模块管理版jar版本
2. pom.xml配置
<!-- 配置sonatype私服仓库仅本项目使用 -->
<repositories>
<repository>
<id>sn</id>
<name>sn</name>
<url>https://oss.sonatype.org/content/repositories/releases/</url>
</repository>
</repositories>
<dependencies>
<!-- 引入SpringMvc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 引入数据源 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 引入fastdfs maven库里没有所以配置了sonatype仓库 -->
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>fastdfs-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
</dependencies>
3. application.yml配置
server:
#设置端口号
port: 9999
fdfs:
#访问时间秒为单位
connect-timeout: 1000
#响应时间秒为单位
so-timeout: 3000
#linux上Tracker的端口
tracker-list:
- 192.168.153.133:22122
spring:
http:
multipart:
#设置上传文件的大小
max-file-size: 1073741824
#数据源连接数据库
datasource:
url: jdbc:mysql://localhost/unit02
username: root
password: ps123456
driver-class-name: com.mysql.jdbc.Driver
4. 程序入口BootFastdfs
package cn.ps;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class BootFastdfs {
public static void main(String[] args) {
SpringApplication.run(BootFastdfs.class);
}
}
5. UploadController测试
package cn.ps;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.ColumnMapRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.luhuiguo.fastdfs.domain.StorePath;
import com.luhuiguo.fastdfs.service.FastFileStorageClient;
@RestController
public class UploadController {
/**
* 用于操作linux上的文件与下载
*/
@Autowired
private FastFileStorageClient storageClient;
/**
* 用于操作sql语句
*/
@Autowired
private JdbcTemplate jt;
/**
* MultipartFile接收上传的文件
* 变量名要跟浏览器传过来的文件名一致myFile
* FilenameUtils用来操作文件比如:截取文件后缀名
* @param multipartFile
* @return
* @throws IOException
*/
@PostMapping("/fupload")
public String upload(@RequestParam("myFile") MultipartFile myFile) throws IOException {
//获取文件后缀名
String extension = FilenameUtils.getExtension(myFile.getOriginalFilename());
//将文件上传到linux上
StorePath uploadFile = storageClient.uploadFile("group1", myFile.getInputStream(), myFile.getSize(), extension);
//sql语句将文件信息插入mysql
String sql = "insert into myfile (fileName,groupName,filePath) values (?,?,?)";
/**
* 参数一:sql语句
* 参数二:文件名称
* 参数三:组名
* 参数四:存文件路径
*/
jt.update(sql, myFile.getOriginalFilename(),uploadFile.getGroup(),uploadFile.getPath());
//整体数据:组名+存文件路径
return uploadFile.getFullPath();
}
@GetMapping("/fdownload/{fileId}")
public void doload(@PathVariable String fileId,HttpServletResponse response) throws IOException, InterruptedException {
//查询下载的信息
List<Map<String, Object>> list = jt.query("select * from myfile where fileId="+fileId, new ColumnMapRowMapper());
//拿出第一条数据
Map map =(Map)list.get(0);
//取出文件名称
String fileName = map.get("fileName").toString();
//取出组名
String groupName = map.get("groupName").toString();
//取出存文件路径
String filePath = map.get("filePath").toString();
//告诉浏览器下载的文件名
response.setHeader("Content-Disposition", "attachment; filename="+fileName);
//去linux上下载对应的图片或文件
byte[] downloadFile = storageClient.downloadFile(groupName, filePath);
//将下载的图片或文件打印在浏览器
response.getOutputStream().write(downloadFile);
}
}
6. upload.html文件上传
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="fupload" method="post" enctype="multipart/form-data">
文件 <input type="file" name="myFile">
<input type="submit" value="上传">
</form>
</body>
</html>
7. 选择好文件后点击上传:注意文件上传不要过大10MB以内,上传成功展示以下
group1/M00/00/00/wKiZhVwGuaiAWUyYADB-zNEmC5k188.mp3
8. 数据库新增成功
9. download.html下载
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="fdownload/2">下载</a>
</body>
</html>
10. 默认下载id为2的文件信息这是会直接去数据库里拿对应信息:点击下载即可 在浏览器左下角弹出以下表示下载成功
更多推荐
所有评论(0)