FastDFS
什么是分布式文件存储系统
随着文件逐渐增多,单台计算机已经存储不下这么多数据,需要用多台计算机存储不同的数据或进行备份,这样就需要有一个管理系统管理不同的计算机节点,这就是分布式管理系统。
使用分布式管理系统的优点
可以存储含量数据
文件数据的高可用(冗余备份)
良好的读写性能和负载均衡
什么是fastDFS
是一款轻量级的分布式文件存储系统,可以对文件进行管理,功能包括文件存储,文件访问,文件同步等,解决了发容量存储和负载均衡的问题。
fastDFS的角色
tracker:追踪者服务器,任务是协调调用,起到负载均衡的作用。
storage:存储节点,提供文件管理的服务。
group:组,相同的组提供冗余备份,不同的组提供扩容
FastDFS上传过程
- Storage会定时的向Tracker发送心跳,让Tracker知道现在有什么服务可以使用
- 客户端向网站服务发送上传请求,网站向Tracker发送请求,Tracker检查有没有可用服务
- 如果有可以用服务,客户端就可以上传数据到Storage
- Storage将文件写入磁盘,返回路径信息给客户端
- 客户端可以工具这个路径找到上传文件
FastDFS的下载流程
- Storage会定时的向Tracker安装发送心跳,告诉Tracker自己还还活着,这样Fastdfs就可以工作了
- 客户端发送下载请求到Tracker上,Tracker查找到存储的Storage地址后返回给客户端
- 客户端拿到Storage地址后,去Storage上找到文件
- 把文件返回给客户端
fastDFS配置文件
connect_timeout=60
network_timeout=60
charset=UTF-8
#Tracker的Http请求端口
http.tracker_http_port=8080
#Tracker的Http通讯端口
tracker_server=192.168.200.99:22122
fastDFS工具类
/**
* @ClassName: FastDFSUtil
* @Description: FastDFS工具类
* @Author: CSH
* @Date: 2025-05-06 15:07
*/
public class FastDFSUtil {
/**
* @Author:CSH
* @Updator:CSH
* @Date 2025/5/6 15:10
* @Description: 加载Tracker连接信息信息
*/
static {
//从classpath下获取文件对象获取路径
try {
String path = new ClassPathResource("fdfs_client.conf").getPath();
ClientGlobal.init(path);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param file
* @return java.lang.String[]
* @Author:CSH
* @Updator:CSH
* @Date 2025/5/6 15:11
* @Description: 文件上传
*/
public static String[] upload(FastDFSFile file) throws Exception {
// 获取trackerServer
TrackerServer trackerServer = getTrackerServer();
// 获取storageClient
StorageClient storageClient = getStorageClient(trackerServer);
//参数1 字节数组
//参数2 扩展名(不带点)
//参数3 元数据( 文件的大小,文件的作者,文件的创建时间戳)
NameValuePair[] meta_list = new NameValuePair[]{new NameValuePair(file.getAuthor()), new NameValuePair(file.getName())};
return storageClient.upload_file(file.getContent(), file.getExt(), meta_list);
}
/**
* @param groupName
* @param remoteFileName
* @return java.io.InputStream
* @Author:CSH
* @Updator:CSH
* @Date 2025/5/6 17:33
* @Description: 文件下载
*/
public static InputStream downFile(String groupName, String remoteFileName) throws Exception {
// 获取trackerServer
TrackerServer trackerServer = getTrackerServer();
// 获取storageClient
StorageClient storageClient = getStorageClient(trackerServer);
// 根据组名 和 文件名 下载图片
byte[] bytes = storageClient.download_file(groupName, remoteFileName);
return new ByteArrayInputStream(bytes);
}
/**
* @param groupName
* @param remoteFileName
* @return void
* @Author:CSH
* @Updator:CSH
* @Date 2025/5/6 17:33
* @Description: 文件删除
*/
public static void deleteFile(String groupName, String remoteFileName) throws Exception {
// 获取trackerServer
TrackerServer trackerServer = getTrackerServer();
// 获取storageClient
StorageClient storageClient = getStorageClient(trackerServer);
int i = storageClient.delete_file(groupName, remoteFileName);
if (i == 0) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
}
/**
* @return java.lang.String
* @Author:CSH
* @Updator:CSH
* @Date 2025/5/6 15:26
* @Description: 获取tracker的ip和端口信息
*/
public static String getTrackerUrl() throws IOException {
// 1. 获取trackerServer
TrackerServer trackerServer = getTrackerServer();
// 2. 获取tracker 的ip的信息
String hostString = trackerServer.getInetSocketAddress().getHostString();
// 3. 获取tracker 的端口的信息
int trackerHttpPort = ClientGlobal.getG_tracker_http_port();
return "http://" + hostString + ":" + trackerHttpPort;
}
/**
* @param groupName
* @param remoteFileName
* @return org.csource.fastdfs.FileInfo
* @Author:CSH
* @Updator:CSH
* @Date 2025/5/6 17:28
* @Description: 根据文件名和组名获取文件的信息
*/
public static FileInfo getFile(String groupName, String remoteFileName) throws IOException, MyException {
// 获取trackerServer
TrackerServer trackerServer = getTrackerServer();
// 获取storageClient
StorageClient storageClient = getStorageClient(trackerServer);
// 根据文件名和组名获取文件的信息
return storageClient.get_file_info(groupName, remoteFileName);
}
/**
* @param groupName
* @return org.csource.fastdfs.StorageServer
* @Author:CSH
* @Updator:CSH
* @Date 2025/5/6 20:01
* @Description: 获取Storages信息
*/
public static StorageServer getStorages(String groupName) throws Exception {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
return trackerClient.getStoreStorage(trackerServer, groupName);
}
/**
* @param groupName
* @param remoteFileName
* @return org.csource.fastdfs.ServerInfo[]
* @Author:CSH
* @Updator:CSH
* @Date 2025/5/6 20:06
* @Description: 获取Storage的ip和端口信息
*/
public static ServerInfo[] getServerInfo(String groupName, String remoteFileName) throws Exception {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
return trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);
}
private static StorageClient getStorageClient(TrackerServer trackerServer) {
return new StorageClient(trackerServer, null);
}
private static TrackerServer getTrackerServer() throws IOException {
// 创建一个tracker客户端
TrackerClient trackerClient = new TrackerClient();
// 通过tracker客户端获取tracker服务信息
return trackerClient.getConnection();
}
}