MinIO的搭建與應用


MinIO 介紹

MinIO 是一個基於 Apache License v2.0 開源協議的對象存儲服務。它兼容亞馬遜 S3 雲存儲服務接口,非常適合於存儲大容量非結構化的數據,例如圖片、視頻、日志文件、備份數據和容器/虛擬機鏡像等,而一個對象文件可以是任意大小,從幾 kb 到最大 5T 不等。

https://docs.min.io/cn/

MinIO 安裝

MinIO 的官方文檔提供了相當全面的安裝信息,使用 docker 安裝 MinIO,不考慮 MinIO 的分布式,畢竟對外使用來講,MinIO 更像是個黑盒子,只關心與黑盒子的上傳下載操作,而不關心是單機存儲還是分布式存儲。

Docker 中創建並運行 MinIO

docker run -p 9800:9000 --name minioservice \
  -e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" \
  -e "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
  -v /mnt/data:/data \
  -v /mnt/config:/root/.minio \
  minio/minio server /data

依據 MinIO Docker 快速入門,下載 MinIO 鏡像並創建一個 MinIO 容器。
https://docs.min.io/cn/minio-docker-quickstart-guide.html

參數說明:

  • -p:對外端口可以依據使用自定義配置,對內端口保持 9000 就行,因本地使用了 portainer,占用了 9000 的對外端口,因此更換使用 9800 端口。(MinIO 文檔中使用的是 9000 的)
  • -e:設置 Access 和 Secret 密鑰,創建時不填寫這兩個則采用默認的,Access 和 Secret 都是 minioadmin,登錄進去后再頁面中再去更改。
  • -v:設置數據卷用來保存存儲應用數據和配置信息。(如果只是想嘗試下 MinIO,不用數據卷就行,這樣在容器退出后數據會丟失)

訪問 MinIO 管理頁面

訪問服務器對外 IP 及 MinIO 容器使用的對外端口,MinIO 提供的登錄頁面相當簡潔,很 nice.使用創建容器時填寫的 Access 和 Secret 或是默認的 minioadmin 登錄。

創建 Bucket

  1. 創建 Bucket,Bucket 釋義是一個容器,用來裝載基本的存儲文件、存儲對象的空間,需要在上傳文件前先建立一個。右下角點擊加號,選擇創建 bucket。

  1. 選擇一個 Bucket,可修改該存儲空間的訪問策略或是刪除存儲空間

文件上傳與下載

  1. 選擇左側的 Bucket,頁面右下角點擊上傳文件

  1. 左側選擇 Bucket,右側列表中操作文件,分享、預覽、下載和刪除文件

  1. 文件分享時配置鏈接時效,最大 7 天

MinIO 應用

不考慮項目搭建問題,假設項目已經准備好。對於.Net 與 MinIO 的交互,MinIO 提供了齊全的 Api 與 Nuget 包,可以參照 MinIO 中的文檔,提供了相當齊全的接口。

安裝 MinIO Nuget 包

官方已經提供了基於.Net Standard的Nuget 包安裝到項目中即可。

Install-Package Minio

上傳文件

class Program
{
    static void Main(string[] args)
    {
        var endpoint = "xxx.xxx.xxx.xxx:9800";
        var accessKey = "你的accesskey";
        var secretKey = "你的secretKey";
            
        try
        {
            var minio = new MinioClient(endpoint, accessKey, secretKey);
            Run(minio).Wait();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadLine();
    }
    private async static Task Run(MinioClient minio)
    {
        var bucketName = "pngs";
        var location = "us-east-1";
        var objectName = "test.png";
        var filePath = @"C:\Users\admin\Desktop\test.png";
        var contentType = "image/png";
        try
        {
            // 檢查是否存在bucket
            bool found = await minio.BucketExistsAsync(bucketName);
            if (!found)
            {
                // 創建bucket
                await minio.MakeBucketAsync(bucketName, location);
            }
            // 上傳文件到bucket
            await minio.PutObjectAsync(bucketName, objectName, filePath, contentType);
            Console.WriteLine("Successfully uploaded " + objectName);
        }
        catch (MinioException e)
        {
            Console.WriteLine("File Upload Error: {0}", e.Message);
        }
    }
}

獲取 MinIO Bucket列表

var bucketList = await minio.ListBucketsAsync();

獲取 MinIO文件列表

var fileList= minio.ListObjectsAsync(bucketName);

獲取文件的Url地址

var bucketName = "pngs";//存儲空間名
var objectName = "test.png";//文件名
var expiresInt = 604800;//有效期秒數,最大7天(604800秒)
var fileUrl = await minio.PresignedGetObjectAsync(bucketName, objectName,expiresInt);

獲取到這個fileUrl可在瀏覽器中直接展示,對於圖片類型來講,有些場景下可以提供直接展示,如頭像之類的。

對於一些文件如報告文件,存儲包等,也可以拿着url直接下載了。從 MinIO 的單機服務中獲取文件,一定程度的降低了承載業務的應用程序壓力。

2020-10-19,望技術有成后能回來看見自己的腳步


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM