分布式文件存儲--FastDFS
分布式文件存儲--FastDFS
FastDFS 下載: https://sourceforge.net/projects/fastdfs/
簡介:
FastDFS是一款開源的輕量級分布式文件系統純C實現,支持Linux、FreeBSD等UNIX系統類google FS,不是通用的文件系統,只能通過專有API訪問,目前提供了C、Java和PHP API為互聯網應用量身定做,解決大容量文件存儲問題,追求高性能和高擴展性FastDFS可以看做是基于文件的key value pair存儲系統,稱作分布式文件存儲服務更為合適。
FastDFS由 跟 蹤服務器(Tracker Server)、存儲服務器(Storage Server)和客戶端(Client)構成。
Tracker server 追蹤服務器
- 跟蹤服務器, 主要做調度工作, 起負載均衡的作用。 在內存中記錄集群中所有存儲組和存儲服務器的狀態信息, 是客戶端和數據服務器交互的樞紐。追蹤服務器負責接收客戶端的請求,選擇合適的組合storage server ,tracker server 與 storage server之間也會用心跳機制來檢測對方是否活著。
- Tracker需要管理的信息也都放在內存中,并且里面所有的Tracker都是對等的(每個節點地位相等),很容易擴展
- 客戶端訪問集群的時候會隨機分配一個Tracker來和客戶端交互。
Storage server 儲存服務器
存儲服務器( 又稱:存儲節點或數據服務器) , 文件和文件屬性( metadata) 都保存到存儲服務器上。 Storage server直接利用OS的文件系統調用管理文件。實際存儲數據,分成若干個組(group),實際traker就是管理的storage中的組,而組內機器中則存儲數據,group可以隔離不同應用的數據,不同的應用的數據放在不同group里面,
group
組, 也可稱為卷。 同組內服務器上的文件是完全相同的 ,同一組內的storage server之間是對等的(同一組內的文件服務器相互備份), 文件上傳、 刪除等操作可以在任意一臺storage server上進行
客戶端Client
- 主要是上傳下載數據的服務器,也就是我們自己的項目所部署在的服務器。每個客戶端服務器都需要安裝Nginx
上傳交互過程
- 1. client詢問tracker上傳到的storage,不需要附加參數;
- 2. tracker返回一臺可用的storage;
- 3. client直接和storage通訊完成文件上傳。
下載交互過程
- 1. client詢問tracker下載文件的storage,參數為文件標識(卷名和文件名);
- 2. tracker返回一臺可用的storage;
- 3. client直接和storage通訊完成文件下載。
- 需要說明的是,client為使用FastDFS服務的調用方,client也應該是一臺服務器,它對tracker和storage的調用均為服務器間的調用。
java整合FastDFS
<!--FastDFS java客戶端-->
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
Utils
/**
* FastDFS 文件存取Utils
*/
public class FastDFSClient {
static {
//從classpath下獲取文件對象獲取路徑
String path = new ClassPathResource("fdfs_client.conf").getPath();
try {
ClientGlobal.init(path);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 圖片上傳
*
* @param file
* @return
*/
public static String[] upload(FastDFSFile file) {
try {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
StorageClient storageClient = new StorageClient(trackerServer, null);
//參數1 字節數組
//參數2 擴展名(不帶點)
//參數3 元數據( 文件的大小,文件的作者,文件的創建時間戳)
NameValuePair[] meta_list = new NameValuePair[]{new NameValuePair(file.getAuthor()), new NameValuePair(file.getName())};
String[] strings = storageClient.upload_file(file.getContent(), file.getExt(), meta_list);
// strings[0]==group1 strings[1]=M00/00/00/wKjThF1aW9CAOUJGAAClQrJOYvs424.jpg
return strings;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 圖片下載
*
* @param groupName
* @param remoteFileName
* @return
*/
public static InputStream downFile(String groupName, String remoteFileName) {
ByteArrayInputStream byteArrayInputStream = null;
try {
//3.創建trackerclient對象
TrackerClient trackerClient = new TrackerClient();
//4.創建trackerserver 對象
TrackerServer trackerServer = trackerClient.getConnection();
//5.創建stroageserver 對象
//6.創建storageclient 對象
StorageClient storageClient = new StorageClient(trackerServer, null);
//7.根據組名 和 文件名 下載圖片
//參數1:指定組名
//參數2 :指定遠程的文件名
byte[] bytes = storageClient.download_file(groupName, remoteFileName);
byteArrayInputStream = new ByteArrayInputStream(bytes);
return byteArrayInputStream;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (byteArrayInputStream != null) {
byteArrayInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
/**
* 圖片刪除
*
* @param groupName
* @param remoteFileName
*/
public static void deleteFile(String groupName, String remoteFileName) {
try {
//3.創建trackerclient對象
TrackerClient trackerClient = new TrackerClient();
//4.創建trackerserver 對象
TrackerServer trackerServer = trackerClient.getConnection();
//5.創建stroageserver 對象
//6.創建storageclient 對象
StorageClient storageClient = new StorageClient(trackerServer, null);
int i = storageClient.delete_file(groupName, remoteFileName);
if (i == 0) {
System.out.println("刪除成功");
} else {
System.out.println("刪除失敗");
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根據組名獲取組的信息
*
* @param groupName
* @return
*/
public static StorageServer getStorages(String groupName) {
try {
TrackerClient trackerClient = new TrackerClient();
//4.創建trackerserver 對象
TrackerServer trackerServer = trackerClient.getConnection();
//參數1 指定traqckerserver 對象
//參數2 指定組名
StorageServer group1 = trackerClient.getStoreStorage(trackerServer, groupName);
return group1;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 根據文件名和組名獲取文件的信息
*
* @param groupName
* @param remoteFileName
* @return
*/
public static FileInfo getFile(String groupName, String remoteFileName) {
try {
TrackerClient trackerClient = new TrackerClient();
//4.創建trackerserver 對象
TrackerServer trackerServer = trackerClient.getConnection();
StorageClient storageClient = new StorageClient(trackerServer, null);
//參數1 指定組名
//參數2 指定文件的路徑
FileInfo fileInfo = storageClient.get_file_info(groupName, remoteFileName);
return fileInfo;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 根據文件名和組名 獲取組信息的數組信息
*
* @param groupName
* @param remoteFileName
* @return
*/
public static ServerInfo[] getServerInfo(String groupName, String remoteFileName) {
try {
//3.創建trackerclient對象
TrackerClient trackerClient = new TrackerClient();
//4.創建trackerserver 對象
TrackerServer trackerServer = trackerClient.getConnection();
ServerInfo[] group1s = trackerClient.getFetchStorages(trackerServer, groupName, remoteFileName);
return group1s;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 獲取tracker 的ip和端口的信息,
* http://192.168.211.132:8080
*
* @return
*/
public static String getTrackerUrl() {
try {
//3.創建trackerclient對象
TrackerClient trackerClient = new TrackerClient();
//4.創建trackerserver 對象
TrackerServer trackerServer = trackerClient.getConnection();
//tracker 的ip的信息
String hostString = trackerServer.getInetSocketAddress().getHostString();
//http://192.168.211.132:8080/group1/M00/00/00/wKjThF1aW9CAOUJGAAClQrJOYvs424.jpg img
int g_tracker_http_port = ClientGlobal.getG_tracker_http_port();
return "http://" + hostString + ":" + g_tracker_http_port;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
FastDFSFile
/**
* 文件存取Bean
*/
public class FastDFSFile implements Serializable {
//文件名字
private String name;
//文件內容
private byte[] content;
//文件擴展名
private String ext;
//文件MD5摘要值
private String md5;
//文件創建作者
private String author;
public FastDFSFile(String name, byte[] content, String ext, String md5, String author) {
this.name = name;
this.content = content;
this.ext = ext;
this.md5 = md5;
this.author = author;
}
public FastDFSFile(String name, byte[] content, String ext) {
this.name = name;
this.content = content;
this.ext = ext;
}
public FastDFSFile() {
}
}
fdfs_client.conf
#連接超時的世界 s
connect_timeout=60
#網絡超時時間
network_timeout=60
#字符編碼
charset=UTF-8
# tracker的http通信協議的端口
http.tracker_http_port=8080
# 22122 trackerserver的tcp 端口
tracker_server=192.168.211.132:22122

浙公網安備 33010602011771號