fastDFS分布式文件系统搭建和使用

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题,FastDFS 架构包括 Tracker server 和 Storage server。客户端请求 Tracker server 进行文件上传、下载,通过Tracker server 调度最终由 Storage server 完成文件上传和下载,

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

group1
M00/00/00/wKgAymBwGkeAOsWxAABNfRLJrkw840.jpg

 FastDFS搭建

使用ducker容器安装fastDFS

安装环境:
centos7

安装docker命令:
yum install docker

设置开机自动启动:
chkconfig docker on或者systemctl enable docker.service
启动命令:service docker start

查看版本:
docker version

修改docker仓库地址:
命令:
vi /etc/docker/daemon.json

内容:

{"registry-mirrors": ["https://z0sfllvk.mirror.aliyuncs.com"]}或者{"registry-mirrors": ["https://registry.docker-cn.com"]}

然后重新加载配置文件systemctl daemon-reload

然后重启Docker      systemctl restart docker

拉取镜像

docker pull morunchang/fastdfs

运行tracker

docker run -d --name tracker --net=host morunchang/fastdfs sh tracker.sh

运行storage

docker run -d --name storage --net=host -e TRACKER_IP=192.168.0.202:22122 -e GROUP_NAME=group1 morunchang/fastdfs sh storage.sh
  • 使用的网络模式是–net=host, 192.168.0.202是宿主机的IP
  • group1是组名,即storage的组
  • 如果想要增加新的storage服务器,再次运行该命令,注意更换 新组名

1.2.2 配置Nginx

Nginx在这里主要提供对FastDFS图片访问的支持,Docker容器中已经集成了Nginx,我们需要修改nginx的配置,进入storage的容器内部,修改nginx.conf

docker exec -it storage  /bin/bash

进入后

vi /etc/nginx/conf/nginx.conf

添加以下内容

1564792264719

上图配置如下:

location ~ /M00 {
     root /data/fast_data/data;
     ngx_fastdfs_module;
}

禁止缓存:

add_header Cache-Control no-store;

退出容器

exit

重启storage容器

docker restart storage

查看启动容器docker ps

9f2391f73d97 morunchang/fastdfs "sh storage.sh" 12 minutes ago Up 12 seconds storage
e22a3c7f95ea morunchang/fastdfs "sh tracker.sh" 13 minutes ago Up 13 minutes tracker

开启启动设置

docker update --restart=always tracker

docker update --restart=always storage

查询文件存储位置

/etc/fdfs/storage.conf  fastDfs配置文件所在地

查询fastDfs文件存储路径

例如:find / -name  wKgAymBv_wqALq9UAABNfRLJrkw560.jpg

文件所在地:cd /data/fast_data/data/00/00 

代码测试

坐标:
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>

代码:
@RestController
@RequestMapping("/file")
public class TestFileController {



@PostMapping("/upload")
public void testUpload() throws Exception {
// 使用全局对象加载配置文件
ClientGlobal.init("D:/yiweiyingtu/daima2/fasdfs/src/main/resources/fdfs_client.conf");
// 创建 TrackerClient 对象,直接 new 就可以了
TrackerClient trackerClient = new TrackerClient();
// 通过 TrackerClient 获得一个 TrackerServer 对象
TrackerServer trackerServer = trackerClient.getConnection();
// 创建一个 StorageServer 的引用,可以是 null
StorageServer storageServer = null;
// 创建一个 StorageClient,参数需要 TrackerServer,StorageServer。相当于拿到服务器的 IP 和端口号
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
// 使用 StorageClient 上传文件,返回保存信息。upload_file 方法中的三个参数,分别是文件路径,文件后缀名以及元数据
String[] strings = storageClient.upload_file("D:/tupian/op.jpg","jpg",null);
// 打印结果
for (String string : strings) {
System.out.println(string);
}
}
//删除
@PostMapping("/delect")
public void testDelect() throws Exception {
// 使用全局对象加载配置文件
ClientGlobal.init("D:/yiweiyingtu/daima2/fasdfs/src/main/resources/fdfs_client.conf");
// 创建 TrackerClient 对象,直接 new 就可以了
TrackerClient trackerClient = new TrackerClient();
// 通过 TrackerClient 获得一个 TrackerServer 对象
TrackerServer trackerServer = trackerClient.getConnection();
// 创建一个 StorageServer 的引用,可以是 null
StorageServer storageServer = null;
// 创建一个 StorageClient,参数需要 TrackerServer,StorageServer。相当于拿到服务器的 IP 和端口号
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
// 使用 StorageClient 上传文件,返回保存信息。upload_file 方法中的三个参数,分别是文件路径,文件后缀名以及元数据
int group = storageClient.delete_file("group1", "M00/00/00/wKgAymBwEkyEF6FbAAAAABLJrkw5144.op");
// 打印结果
System.out.println(group);
}
//下载
@PostMapping("/download")
public void testDownload() throws Exception {
// 使用全局对象加载配置文件
ClientGlobal.init("D:/yiweiyingtu/daima2/fasdfs/src/main/resources/fdfs_client.conf");
// 创建 TrackerClient 对象,直接 new 就可以了
TrackerClient trackerClient = new TrackerClient();
// 通过 TrackerClient 获得一个 TrackerServer 对象
TrackerServer trackerServer = trackerClient.getConnection();
// 创建一个 StorageServer 的引用,可以是 null
StorageServer storageServer = null;
// 创建一个 StorageClient,参数需要 TrackerServer,StorageServer。相当于拿到服务器的 IP 和端口号
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
// 使用 StorageClient 上传文件,返回保存信息。upload_file 方法中的三个参数,分别是文件路径,文件后缀名以及元数据
byte[] bytes = storageClient.download_file("group1", "M00/00/00/wKgAymBwCHuAfcZEAABNfRLJrkw772.jpg");

File file = new File("D:\\ceshi\\1234.jpg");

FileOutputStream fileOutputStream = new FileOutputStream(file);

BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);

bufferedOutputStream.write(bytes);

bufferedOutputStream.close();

fileOutputStream.close();
}
配置文件设置  文件名为(fdfs_client.conf) 放在resource下面
connect_timeout=60
network_timeout=60
charset=UTF-8
http.tracker_http_port=8080
tracker_server=192.168.0.202:22122
关闭防火墙或者打开端口22122和23000,阿里云同样开发这两个端口

 不解可以评论留言或者加微信(yswsxf1314)讨论

posted @ 2021-04-09 17:23  心愿路自平  阅读(235)  评论(0)    收藏  举报