分布式文件系統minIo

分布式文件系統

什么是分布式文件系統

一個計算機無法存儲海量的文件,通過網絡將若干計算機組織起來共同去存儲海量的文件,去接收海量用戶的請求,這些組織起來的計算機通過網絡進行通信,如下圖:

image-20240523134957661

好處:

1、一臺計算機的文件系統處理能力擴充到多臺計算機同時處理。

2、一臺計算機掛了還有另外副本計算機提供數據。

3、每臺計算機可以放在不同的地域,這樣用戶就可以就近訪問,提高訪問速度。

Minlo

介紹

MinIO構建分布式文件系統,MinIO 是一個非常輕量的服務,可以很簡單的和其他應用的結合使用,它兼容亞馬遜 S3 云存儲服務接口,非常適合于存儲大容量非結構化的數據,例如圖片、視頻、日志文件、備份數據和容器/虛擬機鏡像等。

它一大特點就是輕量,使用簡單,功能強大,支持各種平臺,單個文件最大5TB,兼容 Amazon S3接口,提供了 Java、Python、GO等多版本SDK支持。

官網:https://min.io

中文:https://www.minio.org.cn/,http://docs.minio.org.cn/docs/

MinIO集群采用去中心化共享架構,每個結點是對等關系,通過Nginx可對MinIO進行負載均衡訪問。

去中心化有什么好處?

在大數據領域,通常的設計理念都是無中心和分布式。Minio分布式模式可以幫助你搭建一個高可用的對象存儲服務,你可以使用這些存儲設備,而不用考慮其真實物理位置。

它將分布在不同服務器上的多塊硬盤組成一個對象存儲服務。由于硬盤分布在不同的節點上,分布式Minio避免了單點故障。如下圖:

image-20240523135956440

Minio使用糾刪碼技術來保護數據,它是一種恢復丟失和損壞數據的數學算法,它將數據分塊冗余的分散存儲在各各節點的磁盤上,所有的可用磁盤組成一個集合,上圖由8塊硬盤組成一個集合,當上傳一個文件時會通過糾刪碼算法計算對文件進行分塊存儲,除了將文件本身分成4個數據塊,還會生成4個校驗塊,數據塊和校驗塊會分散的存儲在這8塊硬盤上。

使用糾刪碼的好處是即便丟失一半數量(N/2)的硬盤,仍然可以恢復數據。 比如上邊集合中有4個以內的硬盤損害仍可保證數據恢復,不影響上傳和下載,如果多于一半的硬盤壞了則無法恢復。

SDK

上傳文件

MinIO提供多個語言版本SDK的支持,下邊找到java版本的文檔:

地址:https://docs.min.io/docs/java-client-quickstart-guide.html

最低需求Java 1.8或更高版本:

maven依賴如下:

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.4.3</version>
</dependency>
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.8.1</version>
</dependency>

參數說明:

需要三個參數才能連接到minio服務。

參數說明
Endpoint對象存儲服務的URL
Access KeyAccess key就像用戶ID,可以唯一標識你的賬戶。
Secret KeySecret key是你賬戶的密碼。

然后我們來看官方示例

import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.UploadObjectArgs;
import io.minio.errors.MinioException;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
public class FileUploader {public static void main(String[] args)throws IOException, NoSuchAlgorithmException, InvalidKeyException {try {// Create a minioClient with the MinIO server playground, its access key and secret key.MinioClient minioClient =MinioClient.builder().endpoint("https://play.min.io").credentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG").build();// Make 'asiatrip' bucket if not exist.boolean found =minioClient.bucketExists(BucketExistsArgs.builder().bucket("asiatrip").build());if (!found) {// Make a new bucket called 'asiatrip'.minioClient.makeBucket(MakeBucketArgs.builder().bucket("asiatrip").build());} else {System.out.println("Bucket 'asiatrip' already exists.");}// Upload '/home/user/Photos/asiaphotos.zip' as object name 'asiaphotos-2015.zip' to bucket// 'asiatrip'.minioClient.uploadObject(UploadObjectArgs.builder().bucket("asiatrip").object("asiaphotos-2015.zip").filename("/home/user/Photos/asiaphotos.zip").build());System.out.println("'/home/user/Photos/asiaphotos.zip' is successfully uploaded as "+ "object 'asiaphotos-2015.zip' to bucket 'asiatrip'.");} catch (MinioException e) {System.out.println("Error occurred: " + e);System.out.println("HTTP trace: " + e.httpTrace());}}
}

image-20240523142727132

那么基于這個我們來創建個測試類,測試是否能夠上傳文件

public class MinioTest {MinioClient minioClient =MinioClient.builder().endpoint("http://192.168.101.65:9001").credentials("minioadmin", "minioadmin").build();@Testpublic void test_upload() throws Exception{//上傳參數設置UploadObjectArgs testbucket = UploadObjectArgs.builder().bucket("testbucket") //桶.filename("F:\\BaiduNetdiskDownload\\2023新版JavaWeb開發教程\\視頻\\day01-HTML-CSS\\1.mp4") //指定本地文件路徑.object("test/01/1.mp4") //存放的文件名 放在子目錄下 直接寫文件名是放在根目錄下.build();//上傳文件minioClient.uploadObject(testbucket);}
}

注意這里我們需要在網頁控制臺設置桶,并給它改成公共屬性

image-20240523144919304

image-20240523144936355

image-20240523144948586

image-20240523145014928

然后我們運行測試樣例,看看是否上傳到我們的minio中

image-20240523145111582

可以看到已經上傳到minio中了,我們可以點擊2進行預覽

刪除文件

然后我們來進行文件刪除測試

    //刪除文件@Testpublic void test_delete() throws Exception{//刪除參數構建RemoveObjectArgs testbucket1 = RemoveObjectArgs.builder().bucket("testbucket").object("1.mp4").build();//上傳文件minioClient.removeObject(testbucket1);}

image-20240523145722627

查詢文件

查詢文件的意思就是下載文件

    //查詢文件@Testpublic void test_getFile() throws Exception{//根據擴展名取出mimeTypeContentInfo extensionMatch = ContentInfoUtil.findExtensionMatch(".mp4");String mimeType = MediaType.APPLICATION_OCTET_STREAM_VALUE;//通用mimeType,字節流if (extensionMatch!=null){mimeType = extensionMatch.getMimeType();}//查詢參數構建GetObjectArgs testbucket = GetObjectArgs.builder().bucket("testbucket").object("test/01/1.mp4").build();//下載文件 遠程流FilterInputStream inputStream = minioClient.getObject(testbucket);//指定輸出流  FileOutputStream outputStream = new FileOutputStream(new File("F:\\BaiduNetdiskDownload\\2023新版JavaWeb開發教程\\視頻\\day01-HTML-CSS\\2.mp4"));//拷貝到輸出流IoUtils.copy(inputStream,outputStream);}

這樣我們就可以從桶中下載文件下來,然后我們看是否成功

image-20240523152202367

補充-文件校驗問題

我們在上傳和下載的時候由于分布式文件系統是基于網絡傳輸,萬一用戶正在處于網絡波動狀態,造成文件丟包,那么我們怎么判斷下載下來的內容和上傳上去的內容是否完整

這里沒找到以后補充,我沒搜索到資料

補充-拿取擴展名

一般情況,我們需要指定媒體文件的類型,那么我們怎么能知道要傳什么呢

可以參考這個源碼

image-20240523150628749

這里面就有很么枚舉類型 例如我傳圖片

image-20240523150653314

這些東西我們可以根據擴展名得到,所以可以調用工具類

設置contentType可以通過com.j256.simplemagic.ContentType枚舉類查看常用的mimeType(媒體類型)

               <!--根據擴展名取mimetype--><dependency><groupId>com.j256.simplemagic</groupId><artifactId>simplemagic</artifactId><version>1.17</version></dependency>
        //根據擴展名取出mimeTypeContentInfo extensionMatch = ContentInfoUtil.findExtensionMatch(".mp4");String mimeType = MediaType.APPLICATION_OCTET_STREAM_VALUE;//通用mimeType,字節流

那么我們就可以修改上傳文件的代碼來試一下

    public void test_upload() throws Exception{//根據擴展名取出mimeTypeContentInfo extensionMatch = ContentInfoUtil.findExtensionMatch(".mp4");String mimeType = MediaType.APPLICATION_OCTET_STREAM_VALUE;//通用mimeType,字節流if (extensionMatch!=null){mimeType = extensionMatch.getMimeType();}//上傳參數設置UploadObjectArgs testbucket = UploadObjectArgs.builder().bucket("testbucket") //桶.filename("F:\\BaiduNetdiskDownload\\2023新版JavaWeb開發教程\\視頻\\day01-HTML-CSS\\1.mp4") //指定本地文件路徑.object("test/01/1.mp4") //存放的文件名 放在子目錄下 直接寫文件名是放在根目錄下.contentType(mimeType) //設置文件類型.build();//上傳文件minioClient.uploadObject(testbucket);}

image-20240523151532295

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13441.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13441.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13441.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

怎么ai思維導圖自動生成?推薦這三個工具

怎么ai思維導圖自動生成&#xff1f;隨著人工智能&#xff08;AI&#xff09;技術的不斷發展&#xff0c;其在各個領域的應用也日益廣泛。在思維導圖這一領域&#xff0c;AI技術的引入不僅極大地提高了制圖效率&#xff0c;還為用戶提供了更多樣化、個性化的制圖體驗。本文將為…

JavaScript身份三要素認證API、身份證二要素實名認證接口

996這種工作模式&#xff0c;試問有多少人愿意接受&#xff1f;然而這種工作制度在程序員的圈子里早已成為不成文的“規定”。網絡段子也有不少調侃程序員的&#xff0c;比如&#xff1a;一程序員去面試&#xff0c;面試官問&#xff1a;“你畢業才兩年&#xff0c;這三年工作經…

基于消息中間件的異步通信機制在系統解耦中的優化與實現

??謝謝大家捧場&#xff0c;祝屏幕前的小伙伴們每天都有好運相伴左右&#xff0c;一定要天天開心哦&#xff01;?? &#x1f388;&#x1f388;作者主頁&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ?? 帥哥美女們&#xff0c;我們共同加油&#xff01;一起進步&am…

【只會for循環? 來看下, Nodejs中典型的5種循環方式】

Nodejs中的&#xff0c;除了經典的for循環 , 其實還有幾種好用的循環方式&#xff0c; 并有典型的使用場景。下面來一起看下&#x1f447;&#x1f3fb; 5種循環用法 For Loop&#xff1a;這是最常見的循環方式&#xff0c;適用于你知道循環次數的情況。 for (let i 0; i &…

GPT-SoVITS語音克隆部署與使用

GPT-SoVITS是一款強大的少量樣本語音轉換與語音合成開源工具。當前&#xff0c;GPT-SoVITS實現了如下幾個方面的功能&#xff1a; 由參考音頻的情感、音色、語速控制合成音頻的情感、音色、語速可以少量語音微調訓練&#xff0c;也可不訓練直接推理可以跨語種生成&#xff0c;…

【AI】試用 ai 提取文章內容嘗試

電梯產業面臨這樣一個問題&#xff0c;因為太多的品牌&#xff0c;將近 400 多個&#xff0c;甚至有寶馬&#xff0c;奧迪&#xff0c;你敢相信&#xff0c;一家造汽車的造過電梯?不過好像想想也是&#xff0c;電梯是第二大交通工具&#xff0c;電梯從某種意義上來說&#xff…

無網環境禁止 WPS 提示登錄,且基本功能按鈕可用

目前 WPS 升級后&#xff0c;每次打開都會提示你登錄 WPS&#xff0c;并且在未登錄之前所有基本功能按鈕是置灰狀態&#xff0c;無法使用。 如此一來&#xff0c;在內網或無網環境&#xff0c;我們無法登陸 WPS &#xff0c;就給我們的使用帶來了極大的不便&#xff0c;那么有沒…

全網最全面的由淺到深的Kotlin基礎教程(七)

前言 本篇文章接著上一篇文章全網最全面的由淺到深的Kotlin基礎教程&#xff08;六&#xff09;繼續進階學習kotlin&#xff0c;建議看完上一篇文章&#xff0c;再來看本篇文章。本篇主要分析一些常用的kotlin函數源碼&#xff0c;以及用kotlin簡單實現Rxjava的幾個操作符。堅…

卡梅德生物噬菌體展示多肽庫

噬菌體展示多肽文庫在新藥發現領域展現出巨大的潛力和應用價值。卡梅德生物的噬菌體展示肽庫通過將大量肽序列插入到噬菌體基因組中&#xff0c;并在噬菌體表面展示這些肽&#xff0c;構建了一個多樣性的肽庫。 在新藥發現過程中&#xff0c;噬菌體展示多肽文庫可以用于篩選具有…

全志A133 android10 調試vibrator震動馬達

一&#xff0c;前提條件 全志使用的馬達配置為上電震動&#xff0c;下電停止&#xff0c;需測試硬件是否正常。馬達供電最好為獨立供電&#xff0c;避免干擾。 二&#xff0c;適配步驟 1. dts中增加馬達配置 motor_para {compatible "allwinner,sunxi-vibrator";…

java工廠模式示例代碼

工廠模式是一種創建型設計模式&#xff0c;它提供了一種將對象的創建與使用分離的方法。在工廠模式中&#xff0c;我們通過工廠類來創建對象&#xff0c;而不是直接在客戶端代碼中使用 new 關鍵字來創建對象。以下是一個簡單的Java工廠模式示例代碼&#xff1a; 產品接口 首先…

BGP實驗:聯邦和發射器實驗

BGP實驗&#xff1a;聯邦和發射器實驗 一、實驗拓撲 二、實驗要求及分析 實驗要求&#xff1a; 1、AS1存在兩個環回&#xff0c;一個地址為192.168.1.0/24&#xff0c;該地址不能再任何協議中宣告&#xff1b; ? AS3存在兩個環回&#xff0c;一個地址為192.168.2.0/24&…

解決ModuleNotFoundError: No module named ‘open_clip‘問題

在使用stable diffusion大模型時&#xff0c;添加一些模型后啟動df頁面報錯&#xff1a;ModuleNotFoundError: No module named open_clip 使用 pip install open_clip命令下載失敗&#xff0c;報錯&#xff1a; Looking in indexes: https://mirrors.aliyun.com/pypi/simple…

Redis【B站面試題】

前言 2023-07-27 22:44:59 出自B站 灰灰的Java面試 Redis Redis為什么快&#xff1f; 1.純內存KV操作 Redis的操作都是基于內存的&#xff0c;CPU不是 Redis性能瓶頸,&#xff0c;Redis的瓶頸是機器內存和網絡帶寬。 在計算機的世界中&#xff0c;CPU的速度是遠大于內存的速…

Java技術深度解析:高級面試問題與精粹答案(二)

Java 面試問題及答案 1. 什么是Java的垃圾回收機制&#xff1f;它是如何工作的&#xff1f; 答案&#xff1a; Java的垃圾回收機制&#xff08;Garbage Collection&#xff0c;GC&#xff09;是Java運行時環境&#xff08;JRE&#xff09;中的一個功能&#xff0c;用于自動管…

[CocosCreator]Android的增加AndroidX的動態權限

歡迎喜歡或者從事CocosCreator開發的小伙伴請加入我的大家庭CocosCreator游戲開發Q群:26855530 1.首先增加你需要申請的權限,修改:AndroidManifest.xml: <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas…

深度學習之基于TensorFlow人臉表情識別

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景 人臉表情識別是計算機視覺領域的重要研究方向之一&#xff0c;它在人機交互、情感分析、安全監控等領…

代碼隨想錄35期Day48-Java

Day48題目 LeetCode121買股票的最佳時機1 核心思想:可以使用貪心,選擇左邊最小的和右邊最大的,也可以動態規劃,需要保存是否持有股票的狀態,dp[i][0]表示第i天,不持有股票,dp[i][1]表示第i天持有 class Solution {public int maxProfit(int[] prices) {int[][] dp new int[…

python中異步io簡單樣例

目錄 一、異步IO簡單說明 二、代碼樣例 一、異步IO簡單說明 當進行異步 IO 操作時&#xff0c;程序不會因為等待 IO 操作完成而阻塞&#xff0c;而是可以在等待過程中繼續執行其他任務&#xff0c;從而提高了程序的并發性能和響應速度。這是因為異步 IO 操作利用了操作系統底層…

Java 變量和作用域:理解變量的聲明、初始化及其作用域

在Java編程語言中&#xff0c;變量和作用域是兩個核心概念。理解變量的聲明、初始化以及它們的作用域對于編寫健壯且高效的代碼至關重要。 變量的聲明與初始化 變量的聲明 在Java中&#xff0c;變量的聲明指的是定義變量的名稱和類型。在Java中&#xff0c;變量聲明的一般語…