生活随笔
收集整理的這篇文章主要介紹了
FastDFS(分布式文件系统)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Tracker:標準服務端口22122、HTTP端口8080
Storage:標準服務端口23000、HTTP端口8888
文章目錄
一、架構
架構圖:
Client:客戶端。使用java語言編寫的項目屬于客戶端。
Tracker Server:跟蹤服務器,主要做調度工作,在訪問上起負載均衡的作用。在內存中記錄集群中group和storage server的狀態信息,是連接Client和Storage server的樞紐。
Storage Server:存儲服務器,文件和文件屬性(meta data)都保存到存儲服務器上
架構解讀:
只有兩個角色,tracker server和storage server,不需要存儲文件索引信息。
所有服務器都是對等的,不存在Master-Slave關系。
存儲服務器采用分組方式,同組內存儲服務器上的文件完全相同(RAID 1)。
不同組的storage server之間不會相互通信。
由storage server主動向tracker server報告狀態信息,tracker server之間不會相互通信。
二、文件上傳、下載、刪除
1 時序圖
1.1 文件上傳時序圖
1.2 文件下載時序圖
1.3 文件刪除時序圖
2 流程說明
2.1 上傳流程說明
客戶端訪問TrackerTracker 返回Storage的ip和端口客戶端直接訪問Storage,把文件內容和元數據發送過去。Storage返回文件存儲id。包含了組名和文件名
2.2 下載流程說明
client詢問tracker下載文件的storage,參數為文件標識(組名和文件名);tracker返回一臺可用的storage;client直接和storage通訊完成文件下載。
3 代碼實現
3.1 添加依賴
<dependencies><!-- fdfs java客戶端依賴
--><dependency><groupId>cn
.bestwu
</groupId
><artifactId>fastdfs
-client
-java
</artifactId
><version>1.27</version
></dependency
><dependency><groupId>org
.apache
.commons
</groupId
><artifactId>commons
-lang3
</artifactId
><version>3.9</version
></dependency
></dependencies
>
3.2 編寫配置文件
文件名:fdfs_client.conf
修改成自己的tracker服務器ip
connect_timeout
= 10
network_timeout
= 30
charset
= UTF
-8
http
.tracker_http_port
= 8080tracker_server
= 192.168.14.129:22122
3.3 導入工具類
在com.bjsxt.utils.fdfs.FdfsFileSystemUtils下粘貼配置工具類
package com.bjsxt.utils.fdfs;import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;import java.util.Arrays;
public class FdfsFileSystemUtils {private static StorageClient storageClient
;static {try {String path
= Thread.currentThread().getContextClassLoader().getResource("").getPath() + "fdfs_config.conf";ClientGlobal.init(path
);TrackerClient trackerClient
= new TrackerClient();TrackerServer trackerServer
= trackerClient
.getConnection();StorageServer storageServer
= trackerClient
.getStoreStorage(trackerServer
);storageClient
= new StorageClient(trackerServer
, storageServer
);}catch(Exception e
){e
.printStackTrace();throw new ExceptionInInitializerError(e
);}}public static boolean deleteFile(String groupName
, String fileName
){try{int result
= storageClient
.delete_file(groupName
, fileName
);return result
== 0;}catch(Exception e
){e
.printStackTrace();return false;}}public static byte[] downloadFile(String groupName
, String fileName
, NameValuePair[] metaDatas
){try{byte[] datas
= storageClient
.download_file(groupName
, fileName
);if(metaDatas
!= null) {NameValuePair[] tmp
= storageClient
.get_metadata(groupName
, fileName
);for(int i
= 0; i
< tmp
.length
; i
++){metaDatas
[i
] = tmp
[i
];}}return datas
;}catch(Exception e
){e
.printStackTrace();return null; }}public static String[] uploadFile(byte[] datas
, String fileName
, String authName
){try{String extName
= fileName
.substring(fileName
.lastIndexOf(".") + 1);NameValuePair[] metaDatas
= new NameValuePair[3];metaDatas
[0] = new NameValuePair("fileName", fileName
);metaDatas
[1] = new NameValuePair("fileSize", datas
.length
+"");metaDatas
[2] = new NameValuePair("auth", authName
);String[] result
= storageClient
.upload_file(datas
, extName
, metaDatas
);return result
;}catch(Exception e
){e
.printStackTrace();return null; }}
}
3.4 編寫測試代碼
隨意新建一個包含主方法的類。com.bjsxt.test
package com.bjsxt.test;import com.bjsxt.utils.fdfs.FdfsFileSystemUtils;
import org.csource.common.NameValuePair;import java.io.FileOutputStream;
import java.io.InputStream;public class TestFdfs {public static void main(String[] args
) throws Exception {upload();}public static void delete() throws Exception {String groupName
= "group1";String fileName
= "M00/00/00/wKhZjF514maAar2-AAA_UVqBgzQ256.png";boolean flag
= FdfsFileSystemUtils.deleteFile(groupName
,fileName
);System.out
.println(flag
? "刪除文件成功" : "刪除文件失敗");}public static void download() throws Exception {NameValuePair[] metaDatas
= new NameValuePair[3];String groupName
= "group1";String fileName
= "M00/00/00/wKhZjF514maAar2-AAA_UVqBgzQ256.png";byte[] datas
= FdfsFileSystemUtils.downloadFile(groupName
, fileName
, metaDatas
);String localName
= "";for(NameValuePair nvp
: metaDatas
){System.out
.println(nvp
.getName() + " - " + nvp
.getValue());if(nvp
.getName().equals("fileName")){localName
= nvp
.getValue();}}FileOutputStream outputStream
= new FileOutputStream("D:\\" + localName
);outputStream
.write(datas
);outputStream
.flush();outputStream
.close();}public static void upload() throws Exception {String fileName
= "1.png";InputStream inputStream
= TestFdfs.class.getClassLoader().getResourceAsStream(fileName
);byte[] datas
= new byte[inputStream
.available()];inputStream
.read(datas
, 0, datas
.length
);String[] result
= FdfsFileSystemUtils.uploadFile(datas
, fileName
, "老金");System.out
.println("卷名:" + result
[0]);System.out
.println("文件名:" + result
[1]);System.out
.println("返回數組的長度:" + result
.length
);inputStream
.close();}
}
總結
以上是生活随笔為你收集整理的FastDFS(分布式文件系统)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。