fastdfs 分布式文件系统(高可用)linux系统上操作
yum install net-tools -y (安装)查看端口进程插件
编程模型:
文件在文件系统存储的格式
先进行分组 组名:group,(如果不给group名字,他会按照group1,gruop2…来分)
如果某几个storage服务器是相同的组名 表示这些服务器是互为主从(备份)
每一个Storage服务器都有一个主从,用来备份
文件格式:
M数字/数字/文件
分布式系统的概念用多台机器存储文件
Tracker服务器(Storage服务器会自动注册到Tracker服务器上)
功能:
1.判断有哪些存储服务器(借鉴注册中心的思路)
2.判断哪个存储服务器空间较大
3.判断资源文件所在的存储服务器(路由)
Storage服务器
建立Tracker服务器和Storage服务器的关联
docker pull season/fastdfs
systemctl stop firewalld
vi /etc/sysconfig/selinux
reboot
docker run -ti -d --name trakcer -v ~/tracker_data:/fastdfs/tracker/data --net=host
season/fastdfs tracker
docker run -tid --name storage -v ~/storage_data:/fastdfs/storage/data -v
~/store_path:/fastdfs/store_path --net=host -e TRACKER_SERVER:192.168.115.130:22122
-e GROUP_NAME=mygroup season/fastdfs storage
docker cp storage:/fdfs_conf/storage.conf ~/
vi ~/storage.conf
docker cp ~/storage.conf storage:/fdfs_conf/
docker stop storage
docker start storage
docker exec -it storage bash
cd fdfs_conf
fdfs_monitor storage.conf
docker
容器启动
默认端口:22122
1.hub.docker.com
2.搜索fastdfs
docker search fastdfs
3.选择第一个
4.进入linux,命令:docker pull season/fastdfs
5.systemctl stop firewalld 关闭防火墙
6.find / -name selinux
7.vi /etc/sysconfig/selinux
8.更改为disabled,然后保存退出
9.reboot 重启
10.service docker start
11.docker run -ti -d --name trakcer -v ~/tracker_data:/fastdfs/tracker/data
–net=host season/fastdfs tracker
12.netstat -aon | grep 22122 查看端口
13.docker run -tid --name storage -v ~/storage_data:/fastdfs/storage/data -v
~/store_path:/fastdfs/store_path --net=host -e TRACKER_SERVER:192.168.115.130:22122
-e GROUP_NAME=group2 season/fastdfs storage
测试
1.docker exec -it trakcer bash
2.ls
3.cd fdfs_conf
4.ls
5.fdfs_monitor storage.conf
6.会发现刚才开启的两个容器没有关联
7.exit
8.docker exec -it storage bash
9.ls
10.cd fdfs_conf
11.ls
12.more storage.conf
13.exit
14.docker cp storage:/fdfs_conf/storage.conf ~/
15.cd ~
16 vi storage.conf 更改为自己的linux系统的ip
17。docker cp ~/storage.conf storage:/fdfs_conf/
18.docker stop storage
19.docker start storage
20.docker exec -it storage bash
21.cd fdfs_conf
22.fdfs_monitor storage.conf
上传文件
1.docker run -ti --name fdfs_sh --net=host season/fastdfs sh
开启一个客户端
2.echo hello>a.txt
3.cd fdfs_conf
4.ls
5.more storage.conf
6.exit
7.docker cp ~/storage.conf fdfs_sh:/fdfs_conf/
8.docker start fdfs_sh
9.docker exec -it fdfs_sh bash
10.ls
11.cd fdfs_conf
12.fdfs_upload_file storage.conf /a.txt
13.exit
14.cd store_path
15.cd data
16.ls
根据地址来进入:group1/M00/00/00/wKhzg1wGc8eANAXqAAAABncc3SA635.txt
17.cd 00
18.cd 00
19.ls
会发现:wKhzg1wGc8eANAXqAAAABncc3SA635.txt
cd ~/store_path/data/
group1/M00/00/00/wKhzg1wGc8eANAXqAAAABncc3SA635.txt
3.fdfs_upload_file
语法:首先指定一个配置文件 然后是本地要上传的文件
java代码上传
1.网址:https://github.com/search?q=fastdfs_client
2.网址:https://github.com/luhuiguo/fastdfs-client
1.创建模块 SPRINGCLOUD_FASTDFS
2.加入依赖
org.springframework.boot
spring-boot-starter-web
com.luhuiguo
fastdfs-spring-boot-starter
0.2.0
3.添加资源文件 application.yml
server:
port: 8899
fdfs:
连接Tracker服务器超时时间:
connect-timeout: 10000
响应的超时时间
so-timeout: 3000
storage服务器的元素
tracker-list:
- 192.168.115.131:22122
4.模拟一个文件上传
创建一个upload.html文件
创建一个controller层
5.建立一张表
6.配置数据的依赖和四要素
@RestController
public class Upload {
@Autowired
protected FastFileStorageClient storageClient;
@Autowired
JdbcTemplate jdbc;
@PostMapping("/fuload")//上传
public String upload(@RequestParam("myFile1")MultipartFile myFile) throws IOException {
String ext= FilenameUtils.getExtension(myFile.getOriginalFilename());
StorePath sp=storageClient.uploadFile("mygroup",myFile.getInputStream(),myFile.getSize(),ext);
String sql="insert into file(filename,groupname,filepath) values (?,?,?)";
jdbc.update(sql,myFile.getOriginalFilename(),sp.getGroup(),sp.getPath());
return sp.getFullPath();
}
@GetMapping("/fdown")//下载
public void download( @RequestParam("id") String id, HttpServletResponse response) throws IOException {
List list = jdbc.query("select * from file where fileid="+id,new ColumnMapRowMapper());
Map map=(Map)list.get(0);
String fileName= URLEncoder.encode(map.get("filename").toString(),"UTF-8");
String group=map.get("groupname").toString();
String path=map.get("filepath").toString();
response.setHeader("Content-Disposition","attachment;filename="+fileName+"");
byte[] bytes = storageClient.downloadFile(group, path);
response.getOutputStream().write(bytes);
}
}
// MultipartFile是用来接收上传的文件
// myFile的名字必须和上传的表单的名字一样
// group1:指组名
// myFile.getInputStream():指这个文件中的输入流
// myFile.getSize():文件的大小
// myFile.getOriginalFilename():取到文件的名字
// FilenameUtils.getExtension(""):取到一个文件的后缀名