從零搭建分散式檔案系統MinIO比FastDFS要更合適
阿新 • • 發佈:2020-05-05
前兩天跟大家分享了一篇關於如何利用FastDFS元件來自建分散式檔案系統的文章,有興趣的朋友可以閱讀下《[用asp.net core結合fastdfs打造分散式檔案儲存系統](https://www.cnblogs.com/yilezhu/p/12797543.html)》。通過留言發現大家雖然感興趣,但是都覺得部署比較麻煩。的確,fastdfs的部署很繁瑣,而且也沒有官方提供的針對.net core的sdk。而今天帶來的MinIO則是一個比fastdfs更好的選擇,可以讓你足夠簡單的來部署使用,官方也提供了足夠詳細的api文件。下面就讓我們開始今天的正文吧。
這裡說明下為什麼今天才進行分享,因為就在幾個小時前官方才釋出了最新的3.1.12版本的nuget包,解決了`BucketExistsAsync`的一個bug,不然你還得引用原始碼才能正常執行。
> 作者:依樂祝
>
> 原文地址:https://www.cnblogs.com/yilezhu/p/12830123.html
### MinIO是什麼?
官方對MinIO的介紹是:高效能,Kubernetes原生支援的物件儲存系統。MinIO的高效能軟體定義物件儲存套件可以使使用者能夠為機器學習、分析和應用程式資料工作負載構建雲原生支援的資料基礎設施。下面是幾個常用的網址
- 官網:https://min.io/
- 開源地址:https://github.com/minio/
- 中文文件:https://docs.min.io/cn/
- .NET 客戶端api地址:https://docs.min.io/cn/dotnet-client-api-reference.html
- 下載地址:https://min.io/download#/windows
- minio-dotnet:https://github.com/minio/minio-dotnet
MinIO物件儲存與其他有本質的不同。它是為效能和S3 API而設計的並100%開源。MinIO非常適合具有嚴格安全性,在不同的工作負載範圍內要求並提供關鍵任務可用性的大型私有云環境。
#### MinIO是高效能物件儲存的先驅
![](https://img2020.cnblogs.com/blog/1377250/202005/1377250-20200505115940060-1533554481.png)
MinIO是世界上速度最快的物件儲存伺服器。在標準硬體上,物件儲存的讀/寫速度分別為183 GB/s和171 GB/s,可以作為一組不同工作負載的主儲存層,這些工作負載包括Spark、Presto、TensorFlow、H2O.ai以及Hadoop HDFS的替代品。
#### 建立在web規模的規則之上
![](https://img2020.cnblogs.com/blog/1377250/202005/1377250-20200505115957868-747901660.png)
MinIO利用了web定標器來之不易的知識,為物件儲存帶來了一個簡單的定標器模型。在MinIO,擴充套件從一個叢集開始,這個叢集可以與其他MinIO叢集聯合以建立一個全域性名稱空間,如果需要,可以跨越多個數據中心。這也是《財富》500強中超過一半的人使用MinIO的原因之一。
#### 為雲而生
![](https://img2020.cnblogs.com/blog/1377250/202005/1377250-20200505120013203-1013577383.png)
MinIO是在過去四年中從頭開始構建的,是定義雲的技術和架構的原生版本。其中包括集裝箱化、與Kubernetes的協調、微服務和多租戶。沒有比Kubernetes更友好的物件儲存了。
#### 排名第一的開源物件儲存服務,對企業友好
![](https://img2020.cnblogs.com/blog/1377250/202005/1377250-20200505120031258-1053569651.png)
MinIO在Apache V2許可和Affero通用公共許可版本3(AGPLv3)下是100%開源的。這意味著MinIO的客戶可以自由鎖定、自由檢查、自由創新、自由修改和自由重新分配。其部署的多樣性使該軟體變得更加強大,這是專有軟體永遠無法提供的。
#### 亞馬遜S3相容性的事實標準
![](https://img2020.cnblogs.com/blog/1377250/202005/1377250-20200505120043354-1454622111.png)
Amazon的S3 API是物件儲存領域的事實標準。MinIO是S3相容性的事實上的標準,是第一個採用API和第一個新增對S3 Select支援的標準之一。包括微軟Azure在內的750多家公司使用MinIO的S3閘道器,這一數字超過了業內其他公司的總和。
#### 簡單並且功能非常強大
![Simplicity](https://img2020.cnblogs.com/blog/1377250/202005/1377250-20200505115650210-725536489.gif)
極簡主義是MinIO的一個指導性設計原則。簡單性減少了錯誤的機會,提高了正常執行時間,提供了可靠性,同時也為效能奠定了基礎。MinIO可以在幾分鐘內安裝和配置。配置選項和變數的數量保持在最低限度,這將導致幾乎為零的系統管理任務和更少的故障路徑。
### 如何安裝部署MinIO
官方提供了傻瓜式的UI頁面來讓你下載部署。下面以windows系統為例來進行演示。
開啟上面列出的幾個網址中的下載地址:
https://min.io/download#/windows
![image-20200505113236045](https://img2020.cnblogs.com/blog/1377250/202005/1377250-20200505115649752-974655932.png)點選右側的下載按鈕進行下載即可
然後設定一個檔案儲存的路徑如:E:\MinIO\data
然後進入minio.exe所在的目錄,按住Shilft鍵然後點選滑鼠右鍵開啟powershell直接執行如下命令即可:
```powershell
minio.exe server E:\MinIO\data
```
![image-20200505113735303](https://img2020.cnblogs.com/blog/1377250/202005/1377250-20200505115649412-242926484.png)
看到如上所示的頁面說明MinIO就已經執行起來了,簡單吧!這時候你用瀏覽器開啟
http://127.0.0.1:9000 即可看到如下的UI
![image-20200505113920173](https://img2020.cnblogs.com/blog/1377250/202005/1377250-20200505115649080-279807750.png)
輸入上面顯示的Access Key 以及Secret Key登入即可
![image-20200505114013192](https://img2020.cnblogs.com/blog/1377250/202005/1377250-20200505115648635-858685522.png)
### .NET Core整合
這一小節我們就結合我們之前開發的檔案儲存微服務來寫一個MinIO的Provider來支援MinIO的檔案上傳與下載吧。
這裡我只是簡單的演示下,所以就用官方提供的例項程式碼繼續演示了。
首先引入nuget包,注意就在寫這篇文章前幾個小時官方才釋出了最新的3.1.12版本的nuget包,解決了`BucketExistsAsync`的一個bug,所以今天才進行這篇文章的分享。
```powershell
Install-Package Minio
```
然後構建MinioClient
```c#
var endpoint = "127.0.0.1:9000";
var accessKey = "minioadmin";
var secretKey = "minioadmin";
try
{
var minio = new MinioClient(endpoint, accessKey, secretKey).WithSSL();
FileUpload.Run(minio).Wait();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
```
上傳的程式碼如下:
```c#
private async static Task Run(MinioClient minio)
{
var bucketName = "mymusic";
var location = "us-east-1";
var objectName = "golden-oldies.zip";
var filePath = "C:\\Users\\username\\Downloads\\golden_oldies.mp3";
var contentType = "application/zip";
try
{
// Make a bucket on the server, if not already present.
bool found = await minio.BucketExistsAsync(bucketName);
if (!found)
{
await minio.MakeBucketAsync(bucketName, location);
}
// Upload a file to bucket.
await minio.PutObjectAsync(bucketName, objectName, filePath, contentType);
Console.WriteLine("Successfully uploaded " + objectName );
}
catch (MinioException e)
{
Console.WriteLine("File Upload Error: {0}", e.Message);
}
}
```
是不是很簡單。關於更多api的使用可以檢視如下的文件:
> 這是中文的api文件哦,所以就不說太多了
https://docs.min.io/cn/dotnet-client-api-reference.html
### 總結
今天跟大家介紹了另一個而且是更好用的分散式檔案儲存系統,看了MinIO的資料後毫不猶豫的選擇了它,然後就無情的把FastDFS給丟棄了。如果你也有構建分散式檔案系統的需求不妨關注下這個MinIO。