FastDFS的体系结构
FastDFS 主要包括Tracker Server 和 Storage Server。Tracker server 是 FastDFS 文件系统的协调者,主要作用是负载均衡和调度选择 Storage server 进行文件存储。
FastDFS文件上传
-
Storage Server 定期向Tracker Server 发送状态信息,保持心跳连接。
-
客户端发起文件上传请求。
-
Tracker Server 查询所有与它保持连接的 Storage Server ,调度找到一个合适的 Storage Server。
-
Tracker Server 向客户端返回该 Storage Server 的相关信息,包括 Storage Server 的 ip 和端口号。
-
客户端通过 ip 和端口号与 Storage Server 建立连接,发送文件数据
-
Storage Server 生成唯一的路径名 file_id ,file_id 由分组名(group)和文件路径名(url)拼接而成。
-
Storage Server 将接收到的内容写入当前服务器磁盘中,并向客户端返回 file_id 信息,客户端按需要进行保存相关信息。
java代码实现
/** * 文件上传 * @param file * @return */ public static String[] upload(MyFile file) { try { // 创建TrackerClient客户端对象 TrackerClient trackerClient = new TrackerClient(); // 通过TrackerClient对象获取TrackerServer信息 TrackerServer trackerServer = trackerClient.getConnection(); // 获取StorageClient对象 StorageClient storageClient = new StorageClient(trackerServer,null); NameValuePair[] meta_list = new NameValuePair[]{new NameValuePair(file.getAuthor()), new NameValuePair(file.getName())}; String[] strings = storageClient.upload_file(file.getContent(), file.getExt(), meta_list); return strings; // strings[0]==group1 strings[1]=M00/00/00/wKjThF1aW9CAOUJGAAClQrJOYvs424.jpg } catch (Exception e) { e.printStackTrace(); } return null; }
FastDFS文件下载
-
Storage Server 定期向Tracker Server 发送状态信息,保持心跳连接。
-
客户端发起文件下载请求。
-
Tracker Server 查询所有与它保持连接的 Storage Server ,调度找到一个合适的 Storage Server。
-
Tracker Server 向客户端返回该 Storage Server 的相关信息,包括 Storage Server 的 ip 和端口号。
-
客户端通过 ip 和端口号与 Storage Server 建立连接,客户端向 Storage Server 请求文件数据(携带分组号和文件路径参数)
-
Storage Server 同一组之间同步线程,共享文件数据,因此即便是不同的 Storage Server 仍能找到对应的文件地址。
-
Storage Server 发送给客户端对应的文件数据,客户端通过 io 流下载文件数据到本地
java代码实现
public static InputStream downFile(String groupName,String remoteFileName){ try { //创建TrackerClient对象 TrackerClient trackerClient = new TrackerClient(); //通过TrackerClient对象创建TrackerServer TrackerServer trackerServer = trackerClient.getConnection(); //通过TrackerServer创建StorageClient StorageClient storageClient = new StorageClient(trackerServer,null); //通过StorageClient下载文件 byte[] fileByte = storageClient.download_file(groupName, remoteFileName); //将字节数组转换成字节输入流 return new ByteArrayInputStream(fileByte); } catch (Exception e) { e.printStackTrace(); } return null; }