日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

FastDFS(分布式文件系统)

發布時間:2023/12/3 windows 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FastDFS(分布式文件系统) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Tracker:標準服務端口22122、HTTP端口8080
Storage:標準服務端口23000、HTTP端口8888

文章目錄

    • 一、架構
    • 二、文件上傳、下載、刪除
        • 1 時序圖
        • 2 流程說明
          • 3 代碼實現

一、架構

架構圖:

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 上傳流程說明

  • 客戶端訪問Tracker
  • Tracker 返回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 {// 通過static初始化代碼塊,讀取配置文件,初始化客戶端連接對象。// 客戶端連接對象,用于實現文件讀寫操作使用。private static StorageClient storageClient;static {try {// 讀取配置文件// 獲取文件名稱String path = Thread.currentThread().getContextClassLoader().getResource("").getPath() + "fdfs_config.conf";// 加載配置文件ClientGlobal.init(path);// 創建Tracker客戶端對象TrackerClient trackerClient = new TrackerClient();// 創建Tracker服務器對象TrackerServer trackerServer = trackerClient.getConnection();// 創建Storage服務器對象StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);// 創建Storage客戶端對象storageClient = new StorageClient(trackerServer, storageServer);}catch(Exception e){e.printStackTrace();// 初始化代碼塊出錯,一定要拋出錯誤,停止虛擬機。throw new ExceptionInInitializerError(e);}}/*** 文件刪除,FastDFS會自動刪除這個文件對應的metaData。就是文件名-m這個文件。*/public static boolean deleteFile(String groupName, String fileName){try{// storageClient.delete_file(String groupName, String fileName);// groupName - 要刪除的文件的卷名,就是保存文件的storage服務配置中的groupName// fileName - 要刪除的文件的文件名,包含路徑地址。格式:M00/目錄/目錄/文件名.后綴名// M00代表保存文件的目錄, store_path0 。 目錄/目錄 - 保存文件的具體位置。int result = storageClient.delete_file(groupName, fileName);// 返回結果為0,代表刪除成功,其他是刪除失敗。return result == 0;}catch(Exception e){e.printStackTrace();return false;}}/*** 文件下載* @param metaDatas - 傳入一個數組,用于保存下載文件的擴展信息。如果傳入null,則不需要文件擴展信息。* 如果傳入的數組不是null,則需要文件的擴展信息。* @return 下載的文件內容*/public static byte[] downloadFile(String groupName, String fileName, NameValuePair[] metaDatas){try{/** byte[] storageClient.download_file(String groupName, String fileName);* groupName - 卷名 | 組名* fileName - 文件名,是文件保存在fdfs中的目錄和文件名。*/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; // 下載失敗,返回null}}/*** 使用StorageClient對象,實現文件的上傳。*/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[] storageClient.upload_file(byte[] datas, String extName, NameValuePair[] metaDatas)* datas - 要上傳的文件的內容* extName - 上傳的文件的擴展名* metaDatas - 上傳的文件的擴展信息是什么。 如:文件的原始名稱、文件的容量大小、文件的上傳者等。*/String[] result = storageClient.upload_file(datas, extName, metaDatas);// 上傳成功,無異常。返回字符串數組。// 字符串數組長度為2。 0下標位置是 卷名|組名。 1下標位置是 文件名(目錄/文件)// fdfs為了解決上傳的文件原始名稱沖突內容不沖突而覆蓋的問題,存儲文件的時候,會提供一個uuid文件名稱。return result;}catch(Exception e){e.printStackTrace();return null; // 異常發生,返回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 ? "刪除文件成功" : "刪除文件失敗");}// 文件下載。下載的文件保存在D盤根目錄下。 文件名稱是文件的原始名稱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(分布式文件系统)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。