[ 云計算 | AWS 實踐 ] 基于 Amazon S3 協議搭建個人云存儲服務

在這里插入圖片描述

本文收錄于【#云計算入門與實踐 - AWS】專欄中,收錄 AWS 入門與實踐相關博文。

本文同步于個人公眾號:【云計算洞察

更多關于云計算技術內容敬請關注:CSDN【#云計算入門與實踐 - AWS】專欄。

本系列已更新博文:

  • [ 云計算 | AWS 實踐 ] Java 應用中使用 Amazon S3 進行存儲桶和對象操作完全指南
  • [ 云計算 | AWS 實踐 ] Java 如何重命名 Amazon S3 中的文件和文件夾
  • [ 云計算 | AWS 實踐 ] 使用 Java 列出存儲桶中的所有 AWS S3 對象
  • [ 云計算 | AWS 實踐 ] 使用 Java 更新現有 Amazon S3 對象
  • [ 云計算 | AWS 實踐 ] 基于 Amazon S3 協議搭建個人云存儲服務

文章目錄

    • 一、前言
    • 二、關于 MinIO
      • 2.1 什么是 MinIO
      • 2.2 對象存儲的工作原理
    • 三、安裝 MinIO
      • 3.1 使用 Docker 安裝 MinIO
      • 3.2 測試訪問 MinIO
    • 四、使用 MinIO 相關配置及操作
      • 4.1. MinIO 客戶端相關配置操作
        • 4.1.1 部署安裝MinIO Client可執行程序
        • 4.1.2 MinIO 客戶端相關配置操作
      • 4.2 MiniIO 控制臺相關配置操作
    • 五、使用 Java 操作 MinIO 對象(原生操作與亞馬遜 Java SDK操作)
      • 5.1 原生操作 MinIO
      • 5.2 使用亞馬遜 Java API 操作 MinIO
    • 六、文末總結

一、前言

MinIO 是一個高性能的對象存儲系統。它被設計為云原生存儲系統的替代方案。事實上,其 API 與 Amazon S3 完全兼容;MinIO 也提供兼容阿里云等國內云廠商的 API,由于本文篇幅問題,在本博文中,只介紹亞馬遜 AWS 與其關聯的案例以及如何快速使用 MinIO。

二、關于 MinIO

2.1 什么是 MinIO

Minio 是 GlusterFS 創始人之一 Anand Babu Periasamy 發布新的開源項目。MinIO 從一開始就被設計為完全兼容 Amazon S3 存儲 API 的替代方案。

傳說是最兼容的 S3 替代方案,同時還提供可比的性能和可擴展性。

MinIO 還提供多種部署選項。它可以作為本機應用程序在大多數流行的架構上運行,也可以使用 Docker 或 Kubernetes 部署為容器化應用程序。

此外,MinIO 是開源軟件。 組織可以根據 AGPLv3 許可證(許可協議點擊這里)的條款免費使用它。請注意,除了在線文檔和 MinIO 用戶社區之外,此選項不提供任何支持。對于大型企業,還可以提供帶有專門支持的付費訂閱。

MinIO 的 GitHub 地址:https://github.com/minio/minio

由于其 S3 API 兼容性、在各種部署中運行的能力以及開源特性,MinIO 是一款出色的開發和測試以及 DevOps 工具場景。

2.2 對象存儲的工作原理

對象存儲的概念與標準 Linux 文件系統類似,但我們使用存儲桶和對象來代替目錄和文件.

存儲桶可以像目錄一樣嵌套到層次結構中,而對象可以被認為只是字節的集合。這些集合可以是任意字節數組或普通文件,例如圖像、PDF 等。

一個示例對象存儲系統可能如下所示:

/
/images/imge1.pngimage2.jpg
/videos/video1.mp4
/users//bluetata/status-report.docx

就像目錄和文件一樣,存儲桶和對象也可以擁有權限。 這允許對數據進行細粒度的訪問控制,特別是在擁有許多用戶的大型組織中。

三、安裝 MinIO

3.1 使用 Docker 安裝 MinIO

如前所述,MinIO 幾乎適用于所有平臺。有適用于 Windows、Linux 和 MacOS 的獨立安裝程序。然而,出于開發和測試目的,最簡單的入門方法是使用容器化發行版。

MinIO 需要一個持久卷來存儲配置和應用程序數據。但是,出于測試目的,可以通過簡單地傳遞一個目錄(/data在下面的示例中)來啟動 MinIO 。該目錄是在容器啟動時在容器文件系統中創建的。但是容器退出后所有的數據都丟失了。如果打算持久化,進行掛載即可。

docker run \-p 9000:9000 \-p 9001:9001 \-e "MINIO_ROOT_USER=MINIO_ROOT_USER" \-e "MINIO_ROOT_PASSWORD=MINIO_ROOT_PASSWORD" \minio/minio server /data --console-address ":9001"

執行狀態截圖如下

在這里插入圖片描述

雖然容器化部署非常適合評估 MinIO,但需要注意一些限制。

具體來說,一些高級功能(例如版本控制、對象鎖定和存儲桶復制)將不起作用。這些功能需要MinIO的分布式部署,這在單服務器部署中是不可用的。

另外注意上述的命令已經設置了 MinIO 的用戶名和密碼。如果此處沒有設置也可以按照后文客戶端在設置一次。

3.2 測試訪問 MinIO

可以直接訪問:http://你的ip地址:9001/login 來訪問你的 MinIO

在這里插入圖片描述

四、使用 MinIO 相關配置及操作

可以通過多種不同的方式與 MinIO 服務器交互以及管理存儲桶和對象。下面,我們就來一一講解。

4.1. MinIO 客戶端相關配置操作

4.1.1 部署安裝MinIO Client可執行程序

首先要在自己的系統中部署 MinIO Client 可執行程序,不然所有的 mc 命令都會不識別,會出現如下錯誤:

-bash: mc: command not found

解決辦法是:

wget https://dl.minio.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin
4.1.2 MinIO 客戶端相關配置操作

MinIO 客戶端 提供與 Linux 文件管理命令相同的命令,例如cpls等,但專為本地和遠程存儲系統而設計。它與 AWS S3 完全兼容,其語法模仿 AWS 客戶端工具的語法。

使用 MinIO 客戶端的第一步是將其配置為與云存儲系統通信。讓我們將其指向上面的容器化部署:

mc alias set docker_minio http://127.0.0.1:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD

這個命令是使用 MinIO Client(mc)設置一個別名(alias)。具體來說,它創建了一個名為 docker_minio 的別名,連接到地址為 http://127.0.0.1:9000 的 MinIO 實例,并使用用戶名 MINIO_ROOT_USER 和密碼 MINIO_ROOT_PASSWORD 進行身份驗證。
這里是單獨的為客戶端配置,如果已經按照上述的在安裝過程中設置了用戶名與密碼,可以直接訪問即可。

我們可以使用admin子命令驗證連接:

[root@aliyun-bluetata-hub-01 user1]# mc admin info docker_minio127.0.0.1:9000Uptime: 1 hourVersion: 2023-11-20T22:40:07ZNetwork: 1/1 OKDrives: 1/1 OKPool: 1Pools:1st, Erasure sets: 1, Drives per erasure set: 125 KiB Used, 1 Bucket, 1 Object
1 drive online, 0 drives offline

執行的截圖如下:

在這里插入圖片描述

現在,我們可以開始執行創建存儲桶和對象等基本操作。許多 MinIO 客戶端子命令模仿熟悉的 Linux 命令:

  • cp:在文件系統之間復制文件或對象。
  • ls:列出存儲桶中的文件或對象。
  • mb:創建存儲桶(類似于 Linux 上的 mkdir)。
  • mv:將文件或對象從一個文件系統移動/重新定位到另一個文件系統。
  • rb:刪除存儲桶(類似于 Linux 上的 rmdir)。
  • rm:刪除文件或對象。

大多數子命令都適用于本地文件系統和云存儲。例如,我們可以使用以下命令序列創建新的存儲桶,將文件復制到該存儲桶中,在存儲桶之間移動對象,然后刪除存儲桶:

mc mb user1
mc cp ~/test.pdf prattm
mc mb user2
mc cp user1/test.pdf user2
mc rb user1
mc ls user2
[2023-11-22 21:39:10 MDT]     491K test.pdf

4.2 MiniIO 控制臺相關配置操作

在 MinIO 部署中管理數據的另一種方法是使用基于 Web 的管理控制臺。通過容器化部署,我們首先在 Web 瀏覽器中打開地址 http://127.0.0.1:9001。我們使用默認憑據登錄MINIO_ROOT_USER/ MINIO_ROOT_PASSWORD

如果你是遠程服務器,那么 ip 就換成你的遠程服務器公網 ip 即可。

我們可以創建我們的第一個存儲桶:

在這里插入圖片描述

進入到創建存儲桶頁面后,直接輸入所要創建的名稱后,點擊創建存儲桶。

在這里插入圖片描述

在這之前我們有講過:并非所有選項(例如版本控制)都適用于我們的容器化部署。

現在,我們可以導航到對象瀏覽器并單擊我們的新存儲桶。首先,我們可以使用創建新路徑按鈕創建子存儲桶:

在這里插入圖片描述

另外我們還可以將文件作為新對象上傳到存儲桶中:

在這里插入圖片描述
上傳成功后,后臺服務器存儲文件的位置:

在這里插入圖片描述

一般來說,MinIO 管理控制臺的功能與命令行客戶端的功能相同。然而,它確實有一些細微的差別。

首先,客戶端不可能像命令行客戶端那樣在存儲桶之間移動對象。

另外,命令行客戶端還有許多子命令在管理控制臺中并不存在。例如,diff、du 和 pipe 子命令都模仿了標準的 Linux 命令,在管理控制臺中沒有相應的命令。

五、使用 Java 操作 MinIO 對象(原生操作與亞馬遜 Java SDK操作)

5.1 原生操作 MinIO

我們將介紹的使用 MinIO 的最后一種方法是使用 Java SDK。首先,我們在應用程序中包含所需的依賴項:

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.2</version>
</dependency>

使用 Java SDK 的第一步是創建客戶端實例:

MinioClient minioClient =MinioClient.builder().endpoint("http://127.0.0.1:9000").credentials("minioadmin", "minioadmin").build();

此客戶端可以使用命令行工具和管理控制臺執行我們之前看到的所有相同操作。例如我們可以創建一個Bucket:

minioClient.makeBucket(MakeBucketArgs.builder().bucket("user1").build());

然后,我們可以將文件作為對象上傳到該存儲桶中:

minioClient.putObject(PutObjectArgs.builder().bucket("user1").object("Resume.pdf").stream(new FileInputStream("/tmp/Resume.pdf").build());

最后,讓我們看看如何從存儲桶中獲取對象:

try (InputStream stream =minioClient.getObject(GetObjectArgs.builder().bucket("user2").object("Resume.pdf").build())) {// Read the stream
}

5.2 使用亞馬遜 Java API 操作 MinIO

同樣的在使用之前先要引入依賴包

<dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId><version>2.21.0</version>
</dependency>

下面直接貼出使用 Amazon JDK 操作對象的相關代碼:

public class S3Test {public static void main(String[] args) throws Exception{AmazonS3 s3Client= S3Utils.getS3Client("MINIO_ROOT_USER","MINIO_ROOT_PASSWORD","http://172.0.0.1:9000");List<Bucket> bucketList=s3Client.listBuckets();List<Bucket> myBuckets=bucketList.stream().filter(bucket -> bucket.getName().equals("bucket01")).collect(Collectors.toList());if(myBuckets.size() < 1){s3Client.createBucket("bucket01");}putObject(s3Client);S3Object s3Object = s3Client.getObject("bucket01","test2.jpg");downLoadObject(s3Object);System.out.println(bucketList);ListObjectsV2Result result = s3Client.listObjectsV2("bucket01");List<S3ObjectSummary> objects = result.getObjectSummaries();for (S3ObjectSummary os : objects) {System.out.println("含有的文件:" + os.getKey());}// 共享文件generatePresignedUrl(s3Client,"bucket01", "test2.jpg");}public static void putObject(AmazonS3 s3Client) throws Exception{File localFile=new File("D:\\bluetata\\test1.txt");ObjectMetadata metadata  = new ObjectMetadata();metadata.setContentType("text/plain");//metadata.setContentLength(5);String s3FileFullPath = UUID.randomUUID()+"a.txt";PutObjectResult putResult = s3Client.putObject("bucket01", s3FileFullPath, new FileInputStream(localFile), metadata);System.out.println(putResult);}public static void downLoadObject(S3Object s3Object) throws Exception{File targetFile=new File("D:\\bluetata\\test2.jpg");OutputStream out=new FileOutputStream(targetFile);try(BufferedInputStream bufferedInputStream = new BufferedInputStream(s3Object.getObjectContent())){int len  ;byte[] buffer = new byte[1024];while((len=bufferedInputStream.read(buffer))!=-1){out.write(buffer, 0, len);}out.flush();}catch (IOException e){GlobalException.throwException(e.getMessage());}out.close();}public static String generatePresignedUrl(AmazonS3 s3Client,String bucketName, String key){GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(bucketName, key);Date expirationDate = null;try {expirationDate = new SimpleDateFormat("yyyy-MM-dd").parse("2021-09-19");} catch (Exception e) {e.printStackTrace();}//設置過期時間urlRequest.setExpiration(expirationDate);URL url =s3Client.generatePresignedUrl(urlRequest);System.out.println(url);return url.getPath();}}

六、文末總結

文章探討了 MinIO 這一高性能對象存儲系統的重要性和功能。它具備兼容 Amazon S3 API、多種部署選項以及開源特性等優勢,適用于各種場景,從開發測試到 DevOps 工具應用。

文中詳細介紹了 MinIO 的安裝、配置和操作方式,涵蓋了使用 Docker 安裝、命令行客戶端操作、控制臺管理、以及使用 Java 原生操作和亞馬遜 Java SDK 操作 MinIO 對象的方法。這些方法不僅幫助用戶理解 MinIO 的基本操作,還展示了其與其他系統的兼容性和靈活性,使其成為一個強大而多功能的存儲解決方案。

[ 本文作者 ]   bluetata
[ 原文鏈接 ]   https://bluetata.blog.csdn.net/article/details/134566027
[ 最后更新 ]   11/23/2023 2:15
[ 版權聲明 ]   如果您在非 CSDN 網站內看到這一行,
說明網絡爬蟲可能在本人還沒有完整發布的時候就抓走了我的文章,
可能導致內容不完整,請去上述的原文鏈接查看原文。

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

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

相關文章

Redis-Redis緩存高可用集群

1、Redis集群方案比較 哨兵模式 在redis3.0以前的版本要實現集群一般是借助哨兵sentinel工具來監控master節點的狀態&#xff0c;如果master節點異常&#xff0c;則會做主從切換&#xff0c;將某一臺slave作為master&#xff0c;哨兵的配置略微復雜&#xff0c;并且性能和高可…

深信服技術認證“SCSA-S”劃重點:信息收集

為幫助大家更加系統化地學習網絡安全知識&#xff0c;以及更高效地通過深信服安全服務認證工程師考核&#xff0c;深信服特別推出“SCSA-S認證備考秘笈”共十期內容&#xff0c;“考試重點”內容框架&#xff0c;幫助大家快速get重點知識~ 劃重點來啦 深信服安全服務認證工程師…

前端相關免查整合-vue、es、工具類等

知識 工具篇 網頁 取色器 F12 之后&#xff0c; style里面選一個顏色&#xff0c;然后點擊鉛筆&#xff0c;復制值 dayjs 用法 const date dayjs(2021-09-01); const formattedDate dayjs(2021-09-01).format(YYYY-MM-DD); console.log(formattedDate); // 輸出&#…

SEO從業人員提問常用的ChatGPT通用提示詞模板

如何提高網站在搜索引擎中的排名&#xff1f; 如何評估網站的SEO效果和優化潛力&#xff1f; 如何運用關鍵詞研究和競爭對手分析來制定SEO策略&#xff1f; 如何優化網站的內容、結構和元數據來提高SEO效果&#xff1f; 如何運用外部和內部鏈接來提高網站的權威性和排名&am…

OpenCvSharp從入門到實踐-(02)圖像處理的基本操作

目錄 圖像處理的基礎操作 1、讀取圖像 1.1、讀取當前目錄下的圖像 2、顯示圖像 2.1、Cv2.ImShow 用于顯示圖像。 2.2、Cv2.WaitKey方法用于等待用戶按下鍵盤上按鍵的時間。 2.3、Cv2.DestroyAllWindows方法用于銷毀所有正在顯示圖像的窗口。 2.4實例1-顯示圖像 2.4實例…

分類預測 | Matlab實現KPCA-IDBO-LSSVM基于核主成分分析-改進蜣螂算法優化最小二乘支持向量機的分類預測

分類預測 | Matlab實現KPCA-IDBO-LSSVM基于核主成分分析-改進蜣螂算法優化最小二乘支持向量機的分類預測 目錄 分類預測 | Matlab實現KPCA-IDBO-LSSVM基于核主成分分析-改進蜣螂算法優化最小二乘支持向量機的分類預測分類效果基本描述程序設計參考資料 分類效果 基本描述 1.多特…

校園圈子論壇,交友,帖子內短視頻,二手市場,APP小程序H5三端交付,源碼交付,支持二開

校園圈子論壇&#xff0c;交友頻道&#xff0c;商城&#xff0c;二手市場&#xff0c;活動專區&#xff0c;短視頻&#xff0c;從校園生活的方方面面展現出了充滿活力和創造力的鏡頭。這個頻道是一個讓學生們相互交流、結識新朋友的平臺&#xff0c;不僅有交友功能&#xff0c;…

【done+重點】劍指Offer56-I:找出數組中2個只出現1次的整數

力扣&#xff0c;https://leetcode.cn/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/description/ 題目&#xff1a;一個整型數組nums里除兩個數字之外&#xff0c;其他數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。要求時間復雜度是O(n)&#xff0c;空間…

啟動Dubbo項目注冊Zookeeper時提示zookeeper not connected異常原理解析

原創/朱季謙 遇到一個很詭異的問題&#xff0c;我在啟動多個配置相同zookeeper的Dubbo項目時&#xff0c;其他項目都是正常啟動&#xff0c;唯獨有一個項目在啟動過程中&#xff0c;Dubbo注冊zookeeper協議時&#xff0c;竟然出現了這樣的異常提示—— Caused by: java.lang.…

OpenAI再次與Sam Altman談判;ChatGPT Voice正式上線

11月22日&#xff0c;金融時報消息&#xff0c;OpenAI迫于超過700名員工聯名信的壓力&#xff0c;再次啟動了與Sam Altman的談判&#xff0c;希望他回歸董事會。 在Sam確定加入微軟后&#xff0c;OpenAI超700名員工簽署了一封聯名信&#xff0c;要求Sam和Greg Brockman&#x…

【尚硅谷】第06章:隨堂復習與企業真題(面向對象-基礎)

第06章&#xff1a;隨堂復習與企業真題&#xff08;面向對象-基礎&#xff09; 一、隨堂復習 1. &#xff08;了解&#xff09;面向過程 vs 面向對象 不管是面向過程、面向對象&#xff0c;都是程序設計的思路。面向過程&#xff1a;以函數為基本單位&#xff0c;適合解決簡單…

解決ElementUI時間選擇器回顯出現Wed..2013..中國標準時間.

使用餓了么組件 時間日期選擇框回顯到頁面為啥是這樣的&#xff1f; 為什么再時間框中選擇日期&#xff0c;回顯頁面出現了這種英文格式呢&#xff1f;&#xff1f;&#xff1f;&#xff1f; 其實這個問題直接使用elementui的內置屬性就能解決 DateTimePicker 日期時間選擇…

程序員指南六:數據平面開發套件

PORT HOTPLUG FRAMEWORK 端口熱插拔框架為DPDK應用程序提供在運行時附加和分離端口的能力。由于該框架依賴于PMD實現&#xff0c;PMD無法處理的端口超出了該框架的范圍。此外&#xff0c;在從DPDK應用程序分離端口后&#xff0c;該框架不提供從系統中移除設備的方法。對于由物…

微信開發:API接口與ipad協議的深度比較及最佳選擇

微信開發&#xff1a;API接口與ipad協議的深度比較及最佳選擇 在深入探索微信開發的過程中&#xff0c;理解不同API接口和協議的特點以及他們的適用場景是非常重要的。本文將詳細對比幾種主流的微信API接口和協議&#xff0c;包括Web版微信協議、iPad協議、PC微信協議/Mac協議…

opencv-圖像梯度

目標 ? 圖像梯度&#xff0c;圖像邊界等 ? 使用到的函數有&#xff1a;cv2.Sobel()&#xff0c;cv2.Schar()&#xff0c;cv2.Laplacian() 等 原理 梯度簡單來說就是求導。 OpenCV 提供了三種不同的梯度濾波器&#xff0c;或者說高通濾波器&#xff1a;Sobel&#xff0c;Schar…

萬界星空科技QMS質量管理系統介紹

QMS&#xff08;Quality Management System&#xff09;質量管理系統是五大基礎系統之一&#xff0c;在工業企業中被廣泛的應用&#xff0c;在質量策劃、生產過程質量監督、體系審核和文檔管理等業務上發揮著不可替代的作用。 一般制造業工廠現狀&#xff1a;質量成本高&#x…

使用 COPY 加速 PostgreSQL 批量插入

文章目錄 1.copy命令介紹2.copy vs insert的優勢3.測量性能4.結論 1.copy命令介紹 PostgreSQL 中的命令COPY是執行批量插入和數據遷移的強大工具。它允許快速有效地將大量數據插入表中。 COPY命令為批量插入和數據遷移提供了更簡單且更具成本效益的解決方案。 可以避免使用諸…

基于SSM的課程資源管理系統

末尾獲取源碼 開發語言&#xff1a;Java Java開發工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技術開發 數據庫&#xff1a;MySQL5.7和Navicat管理工具結合 服務器&#xff1a;Tomcat8.5 開發軟件&#xff1a;IDEA / Eclipse 是否Maven項目&#x…

電力感知邊緣計算網關產品設計方案-網關系統通信架構方案

1.邊緣協同控制模發 能針對建筑、充電樁、分布式儲能、分布式光伏等典型設備建立對應物模型、完成數據采集通信協議設計和控制指令交互設計,能針對建筑、充換電站等典型場景提出具體實施方案和人工智能控制算法和邏輯。物模型、通信協議設計和控制指令交互設計科學、先進,能…

聚類系列(一)——什么是聚類?

目前在做聚類方面的科研工作, 看了很多相關的論文, 也做了一些工作, 于是想出個聚類系列記錄一下, 主要包括聚類的概念和相關定義、現有常用聚類算法、聚類相似性度量指標、聚類評價指標、 聚類的應用場景以及共享一些聚類的開源代碼 下面正式進入該系列的第一個部分&#xff…