本文收錄于【#云計算入門與實踐 - 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 文件管理命令相同的命令,例如cp
和ls
等,但專為本地和遠程存儲系統而設計。它與 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_minio
● 127.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 網站內看到這一行,
說明網絡爬蟲可能在本人還沒有完整發布的時候就抓走了我的文章,
可能導致內容不完整,請去上述的原文鏈接查看原文。