實現分佈式文件系統FastDFS

分佈式文件系統

分佈式文件系統指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網絡與節點相連組成一個文件系統。分佈式文件系統解決了海量文件存儲及傳輸、訪問速度的瓶頸問題,對海量視頻、圖片的管理。

主流的分佈式文件系統有NFS、GFS、HDSF

NFS
  • 在客戶端上映射NFS服務器的驅動器
  • 客戶端通過網絡訪問NFS服務器的硬盤完全透明
GFS
  • GFS採用主從結構,一個GFS集羣由一個master和大量的chunkserver組成
  • master存儲了數據文件的元數據,一個文件被分成了若干塊存儲在多個chunkserver中
  • 用戶從master中獲取數據元信息,從chunkserver存儲數據

即文件分塊存儲在多個chunkserver服務器中,文件的記錄信息在master服務器中。

HDFS
  • HDFS採用主從結構,一個HDFS集羣由一個名稱結點和若干數據結點組成
  • 名稱結點存儲數據的元信息,一個完整的數據文件分成若干塊存儲在數據結點
  • 客戶端從名稱結點獲取數據的元信息及數據分塊的信息,然後就可從數據塊來存取數據

HDFS和GFS類似,都是將文件分塊存儲在多個服務節點上,由主節點記錄文件信息。

FastDFS

FastDFS是用c語言編寫的一款開源的分佈式文件系統。FastDFS專爲互聯網量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,使用FastDFS很容易搭建一套高性能的文件服務器集羣提供文件上傳、下載等服務。FastDFS不對文件進行分塊,所以它沒有分塊合併的開銷,很適合存儲小文件。FastDFS網絡通信採用socket,通信速度很快。

FastDFS架構

FastDFS架構包括 Tracker server和Storageserver。客戶端請求Tracker server進行文件上傳、下載,通過Trackerserver調度最終由Storage server完成文件上傳和下載。
在這裏插入圖片描述
Tracker
Tracker Server作用是負載均衡和調度,通過Tracker server在文件上傳時可以根據一些策略找到Storage server提供文件上傳服務。可以將tracker稱爲追蹤服務器或調度服務器。
Storage
Storage Server作用是文件存儲,客戶端上傳的文件最終存儲在Storage服務器上,Storage server沒有實現自己的文件系統而是使用操作系統的文件系統來管理文件。可以將storage稱爲存儲服務器。
Storage狀態收集
Storage server會連接集羣中所有的Tracker server,定時向他們報告自己的狀態,包括磁盤剩餘空間、文件同步狀況、文件上傳下載次數等統計信息。

Tracker調度算法

在Tracker的配置文件tracker.conf中(稍後會安裝),有三種調度策略:

# which storage server to upload file
# 0: round robin (default)
# 1: the first server order by ip address
# 2: the first server order by priority (the minimal)
  • 0表示輪詢,依次輪詢每個組返回給客戶端上傳文件
  • 1表示指定具體的組
  • 2表示負載均衡(默認),通過負載均衡算法,將當前比較空閒的storage組返回給客戶端上傳文件
文件上傳流程

在這裏插入圖片描述
file_id即文件ID,用於訪問文件的索引信息,文件索引信息包括:組名、虛擬磁盤路徑、數據兩級目錄、文件名

FastDFS安裝

https://www.cnblogs.com/yufeng218/p/8111961.html

注意:

  1. 在storage的配置文件中配置tracker_server時,不要用127.0.0.1,要用服務器的外網ip(如果用的是雲服務器,tracker_server設置的是外網ip會導致在本服務器上測試上傳會報錯,沒關係,因爲只有設置爲外網ip,才能通過windows上的java程序上傳、下載圖片)
  2. 同時,不要忘了開放tracker和storage監聽的端口

Spring Boot項目中使用FastDFS

fastdfs的java客戶端依賴包:

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

resources/config/fastdfs-client.properties配置文件:

#http連接超時時間
fastdfs.connect_timeout_in_seconds = 5
#tracker與storage網絡通信超時時間
fastdfs.network_timeout_in_seconds = 30
#字符編碼
fastdfs.charset = UTF-8
fastdfs.tracker_servers = tracker服務器的ip:tracker監聽的端口

上傳文件和下載文件測試:

@SpringBootTest
@RunWith(SpringRunner.class)
public class TestFastDFS {
    //上傳文件
    @Test
    public void testUpload(){
        try {
            //加載fastdfs-client.properties配置文件
            ClientGlobal.initByProperties("config/fastdfs-client.properties");
            //定義TrackerClient,用於請求TrackerServer
            TrackerClient trackerClient = new TrackerClient();
            //連接tracker
            TrackerServer trackerServer = trackerClient.getConnection();
            //獲取Stroage
            StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
            //創建stroageClient
            StorageClient1 storageClient1 = new StorageClient1(trackerServer,storeStorage);
            //向stroage服務器上傳文件
            //本地文件的路徑
            String filePath = "xxx/1.png";
            //上傳成功後拿到文件Id
            String fileId = storageClient1.upload_file1(filePath, "png", null);
            System.out.println(fileId);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    //下載文件
    @Test
    public void testDownload(){
        try {
            //加載fastdfs-client.properties配置文件
            ClientGlobal.initByProperties("config/fastdfs-client.properties");
            //定義TrackerClient,用於請求TrackerServer
            TrackerClient trackerClient = new TrackerClient();
            //連接tracker
            TrackerServer trackerServer = trackerClient.getConnection();
            //獲取Stroage
            StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
            //創建stroageClient
            StorageClient1 storageClient1 = new StorageClient1(trackerServer,storeStorage);
            //下載文件
            //文件id
            String fileId = "testUpload打印的id";
            byte[] bytes = storageClient1.download_file1(fileId);
            //使用輸出流保存文件
            FileOutputStream fileOutputStream = new FileOutputStream(new File("下載位置"));
            fileOutputStream.write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        }
    }
}
發佈了261 篇原創文章 · 獲贊 102 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章