Github 29K Star的開源對象存儲方案——Minio入門寶典
對象存儲不是什麼新技術了,但是從來都沒有被替代掉。為什麼?在這個大數據發展迅速地時代,數據已經不單單是簡單的文本數據了,每天有大量的圖片,影片數據產生,在短影片火爆的今天,這個數量還在增加。有數據表明,當今世界產生的數據,有80%是非關係型的。那麼,對於圖片,影片等數據的分析可以說是大數據與人工智慧的未來發展方向之一。
但是如何存儲這些數據呢?商用雲方案往往價格昂貴,而傳統的大數據解決方案並不能充分支撐圖片,影片數據的存儲與分析。本文將詳細的介紹開源的對象存儲解決方案Minio的部署與實踐,文章將分為以下幾部分進行介紹。
本文基於2021年10月Minio最新版本整理,後續文檔更新,請關注 大數據流動
文檔版權所有公眾號 大數據流動,請勿做商用,如需轉載與作者 獨孤風 聯繫。
1、對象存儲
從本質上講,對象存儲是一種數據存儲架構,允許以高度可擴展的方式存儲大量非結構化數據。
如今,我們需要在關係或非關係資料庫中存儲的可不僅僅是簡單的文本資訊。數據類型包括電子郵件、影像、影片、網頁、音頻文件、數據集、感測器數據和其他類型的媒體內容。也就是非結構化的數據。
區別於傳統的存儲,對象存儲非常適合圖片影片等數據的存儲。這裡就不得不提到另外兩種存儲方式。
文件存儲 vs 塊存儲 vs 對象存儲
文件存儲是網路附加存儲,其中數據存儲在文件夾中。當需要訪問文件時,電腦必須知道找到它的完整路徑。
塊存儲將數據保存在原始塊中,與文件存儲不同,它可以通過存儲區域網路訪問,低延遲高性能,一般用於資料庫相關操作。
很明顯,文件存儲便於共享,但是性能很差。塊存儲性能好,但是無法靈活的共享。那麼,有沒有一種方案可以兼顧呢?
對象存儲
對象存儲是一種全新體系結構,其中每個文件都保存為一個對象,並且可以通過 HTTP 請求訪問它。這種類型的存儲最適合需要管理大量非結構化數據的場景。在對象存儲中,每個對象都會收到一個唯一的 id,消費者將使用它來檢索它和豐富的元數據。
基於對象的存儲系統不通過分層結構存儲數據是其最顯著的特徵。缺乏基於文件夾的存儲不僅使檢索文件更容易,而且還為每條數據分配元數據。
對象存儲,是一種扁平結構,其中文件被分解成碎片並分散在硬體中。在對象存儲中,數據被分成稱為對象的離散單元並保存在單個存儲庫中,而不是作為文件夾中的文件或伺服器上的塊保存。
對象存儲 VS HDFS
有人會問,大數據不能解決對象存儲的問題嗎?HDFS確實很強大,也解決分散式存儲的瓶頸問題,但是還有很多不足之處。
元數據的擴展性:NameNode是一個中央元數據服務節點,也是集群管理節點,文件系統的元數據以及塊位置關係全部在記憶體中。NameNode對記憶體的要求非常高,需要訂製大記憶體的機器,記憶體大小也限制了集群擴展性。
全局鎖:NameNode 有一把FSNamesystem全局鎖,每個元數據請求時都會加這把鎖。雖然是讀寫分開的,且有部分流程對該鎖的持有範圍進行了優化,但依然大問題。
塊彙報風暴:HDFS塊大小默認128M,啟動幾百PB數據量的集群時,NameNode需要接受所有塊彙報才可以退出安全模式,因此啟動時間會達數小時。
HDFS是為了大文件存儲而設計的,天生對於圖片影片這種海量的小文件支援有限。毫無疑問對象存儲才是最佳選擇。
對象存儲方案
過去的相當長的一段時間裡,商用對象存儲佔據了市場上的大量的份額。國外的Amazon S3,中國的阿里雲OSS都成為了大多數公司的選擇。
但是構建一個企業級的數據湖(包括結構化和非結構化數據)已經成為了越來越多公司的目標,私有化的對象存儲方案迫在眉睫。
開源的私有化的對象存儲方案選擇很多,如分散式對象、塊和文件存儲平台Ceph,簡單的、高度可擴展的分散式文件系統SeaweedFS,以及本文要介紹的高性能,雲原生的對象存儲MinIO。
2、Minio概述
MinIO是個高性能,雲原生的對象存儲。Github有近30K的Star。
它提供了與 Amazon S3 雲存儲服務兼容的 API,使用 MinIO 為機器學習、分析和應用程式數據工作負載構建高性能基礎架構。
輕量,操作簡單。
特點
- 構建高性能的雲原生數據;
- 機器學習,大數據分析,海量存儲的基礎架構;
- MinIO支援各種應用程式數據工作負載;
- 在中國:阿里巴巴、騰訊、百度、中國聯通、華為、中國移動等等9000多家企業也都在使用MinIO產品。
高性能
MinIO 是全球領先的對象存儲先鋒,目前在全世界有數百萬的用戶. 在標準硬體上,讀/寫速度上高達183 GB / 秒 和 171 GB / 秒。
對象存儲可以充當主存儲層,以處理Spark、Presto、TensorFlow、H2O.ai等各種複雜工作負載以及成為Hadoop HDFS的替代品。
MinIO用作雲原生應用程式的主要存儲,與傳統對象存儲相比,雲原生應用程式需要更高的吞吐量和更低的延遲。而這些都是MinIO能夠達成的性能指標。
可擴展性
MinIO利用了Web縮放器的來之不易的知識,為對象存儲帶來了簡單的縮放模型。 這是我們堅定的理念 「簡單可擴展.」 在 MinIO, 擴展從單個群集開始,該群集可以與其他MinIO群集聯合以創建全局名稱空間, 並在需要時可以跨越多個不同的數據中心。 通過添加更多集群可以擴展名稱空間, 更多機架,直到實現目標。
雲原生支援
MinIO 是在過去4年的時間內從0開始打造的一款軟體 ,符合一切原生雲計算的架構和構建過程,並且包含最新的雲計算的全新的技術和概念。 其中包括支援Kubernetes 、微服和多租戶的的容器技術。使對象存儲對於 Kubernetes更加友好。
開放全部源程式碼 + 企業級支援
MinIO 基於Apache V2 license 100% 開放源程式碼 。 這就意味著 MinIO的客戶能夠自動的、無限制、自由免費使用和集成MinIO、自由的創新和創造、 自由的去修改、自由的再次發行新的版本和軟體. 確實, MinIO 強有力的支援和驅動了很多世界500強的企業。 此外,其部署的多樣性和專業性提供了其他軟體無法比擬的優勢。
與Amazon S3 兼容
亞馬遜雲的 S3 API(介面協議) 是在全球範圍內達到共識的對象存儲的協議,是全世界內大家都認可的標準。 MinIO 在很早的時候就採用了 S3 兼容協議,並且MinIO 是第一個支援 S3 Select 的產品. MinIO對其兼容性的全面性感到自豪, 並且得到了 750多個組織的認同, 包括Microsoft Azure使用MinIO的S3網關 – 這一指標超過其他同類產品的總和。
簡單
極簡主義是MinIO的指導性設計原則。簡單性減少了出錯的機會,提高了正常運行時間,提供了可靠性,同時簡單性又是性能的基礎。 只需下載一個二進位文件然後執行,即可在幾分鐘內安裝和配置MinIO。 配置選項和變體的數量保持在最低限度,這樣讓失敗的配置概率降低到接近於0的水平。 MinIO升級是通過一個簡單命令完成的,這個命令可以無中斷的完成MinIO的升級,並且不需要停機即可完成升級操作 – 降低總使用和運維成本。
與大數據集成
MinIO與領先的分析和機器學習框架進行了本地集成。
Minio是目前全世界增長最快的對象存儲系統。
3、部署與安裝
Minio支援原生安裝與容器化安裝等安裝方式,本著簡單化的原則,安裝起來非常的簡單,相關安裝包可以在資料包中獲取。
容器安裝
運行以下命令以使用臨時數據卷將 MinIO 的最新穩定映像作為容器運行:
Copypodman run \
-p 9000:9000 \
-p 9001:9001 \
minio/minio server /data --console-address ":9001"
MinIO 部署開始使用默認的 root 憑據 minioadmin:minioadmin
。您可以使用 MinIO 控制台測試部署,這是一個嵌入式 內置於 MinIO 伺服器的對象瀏覽器。將主機上運行的 Web 瀏覽器指向 //127.0.0.1:9000 並使用 根憑據。您可以使用瀏覽器來創建桶、上傳對象以及瀏覽 MinIO 伺服器的內容。
Linux
使用以下命令在運行 64 位 Intel/AMD 架構的 Linux 主機上運行獨立的 MinIO 伺服器。將/data
替換為您希望 MinIO 存儲數據的驅動器或目錄的路徑。
wget //dl.minio.org.cn/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /data
將/data
替換為您希望 MinIO 存儲數據的驅動器或目錄的路徑。
Windows
使用以下命令在 Windows 主機上運行獨立的 MinIO 伺服器。 將「D:\」替換為您希望 MinIO 存儲數據的驅動器或目錄的路徑。 您必須將終端或 powershell 目錄更改為 minio.exe
可執行文件的位置,或將該目錄的路徑添加到系統 $PATH
中:
minio.exe server D:\
MinIO 部署開始使用默認的 root 憑據 minioadmin:minioadmin
。您可以使用 MinIO 控制台測試部署,這是一個內置在 MinIO 伺服器中的基於 Web 的嵌入式對象瀏覽器。將主機上運行的 Web 瀏覽器指向 //127.0.0.1:9000 並使用 root 憑據登錄。您可以使用瀏覽器來創建桶、上傳對象以及瀏覽 MinIO 伺服器的內容。
測試
MinIO Server 帶有一個基於 Web 的嵌入式對象瀏覽器。將您的 Web 瀏覽器指向 //127.0.0.1:9000 以確保您的伺服器已成功啟動。
分散式安裝
在大數據領域,通常的設計理念都是無中心和分散式。Minio分散式模式可以幫助你搭建一個高可用的對象存儲服務,你可以使用這些存儲設備,而不用考慮其真實物理位置。
示例1: 啟動分散式Minio實例,8個節點,每節點1塊盤,需要在8個節點上都運行下面的命令。
GNU/Linux 和 macOS
Copyexport MINIO_ACCESS_KEY=<ACCESS_KEY>
export MINIO_SECRET_KEY=<SECRET_KEY>
minio server //192.168.1.11/export1 //192.168.1.12/export2 \
//192.168.1.13/export3 //192.168.1.14/export4 \
//192.168.1.15/export5 //192.168.1.16/export6 \
//192.168.1.17/export7 //192.168.1.18/export8
Windows
Copyset MINIO_ACCESS_KEY=<ACCESS_KEY>
set MINIO_SECRET_KEY=<SECRET_KEY>
minio.exe server //192.168.1.11/C:/data //192.168.1.12/C:/data ^
//192.168.1.13/C:/data //192.168.1.14/C:/data ^
//192.168.1.15/C:/data //192.168.1.16/C:/data ^
//192.168.1.17/C:/data //192.168.1.18/C:/data
K8S部署
Kubernetes的部署和狀態集提供了在獨立,分散式或共享模式下部署MinIO伺服器的完美平台。 在Kubernetes上部署MinIO有多種選擇,您可以選擇最適合您的。
- 默認standaline模式下,需要開啟Beta API的Kubernetes 1.4+。
- distributed 模式,需要開啟Beta API的Kubernetes 1.5+。
- 底層支援PV provisioner。
- 你的K8s集群里需要有Helm package manager installed。
安裝 MinIO chart
$ helm install stable/minio
helm install --name my-release \
--set persistence.size=100Gi \
stable/minio
上述命令部署了一個帶上100G持久卷的MinIO服務。
要在分散式模式中配置MinIO伺服器,請將mode
欄位設置為distributed
,
Copy$ helm install --set mode=distributed stable/minio
上述命令部署了個帶有4個節點的分散式MinIO伺服器。 要更改分散式MinIO伺服器中的節點數,請設置numberOfNodes
屬性。
Copy$ helm install --set mode=distributed,numberOfNodes=8 stable/minio
上述命令部署了個帶有8個節點的分散式MinIO伺服器。注意一下,numberOfNodes
取值範圍是[4,16]。
4、客戶端
MinIO Client (mc)為ls,cat,cp,mirror,diff,find等UNIX命令提供了一種替代方案。它支援文件系統和兼容Amazon S3的雲存儲服務(AWS Signature v2和v4)。
Copyls 列出文件和文件夾。
mb 創建一個存儲桶或一個文件夾。
cat 顯示文件和對象內容。
pipe 將一個STDIN重定向到一個對象或者文件或者STDOUT。
share 生成用於共享的URL。
cp 拷貝文件和對象。
mirror 給存儲桶和文件夾做鏡像。
find 基於參數查找文件。
diff 對兩個文件夾或者存儲桶比較差異。
rm 刪除文件和對象。
events 管理對象通知。
watch 監聽文件和對象的事件。
policy 管理訪問策略。
session 為cp命令管理保存的會話。
config 管理mc配置文件。
update 檢查軟體更新。
version 輸出版本資訊。
MinIO Client(mc)提供了「 admin」子命令來對您的MinIO部署執行管理任務。
Copyservice 服務重啟並停止所有MinIO伺服器
update 更新更新所有MinIO伺服器
info 資訊顯示MinIO伺服器資訊
user 用戶管理用戶
group 小組管理小組
policy MinIO伺服器中定義的策略管理策略
config 配置管理MinIO伺服器配置
heal 修復MinIO伺服器上的磁碟,存儲桶和對象
profile 概要文件生成概要文件數據以進行調試
top 頂部提供MinIO的頂部統計資訊
trace 跟蹤顯示MinIO伺服器的http跟蹤
console 控制台顯示MinIO伺服器的控制台日誌
prometheus Prometheus管理Prometheus配置
kms kms執行KMS管理操作
5、Java Api
MinIO Java Client SDK提供簡單的API來訪問任何與Amazon S3兼容的對象存儲服務。
需要Java 1.8或更高版本:
- OracleJDK 8.0
- OpenJDK8.0
使用maven
Copy<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.0.2</version>
</dependency>
使用gradle
Copydependencies {
compile 'io.minio:minio:7.0.2'
}
快速入門示例-文件上傳
本示常式序連接到一個對象存儲服務,創建一個存儲桶並上傳一個文件到該桶中。
你需要有存儲服務的三個參數才能連接到該服務。
參數 | 說明 |
---|---|
Endpoint | 對象存儲服務的URL |
Access Key | Access key就像用戶ID,可以唯一標識你的賬戶。 |
Secret Key | Secret key是你賬戶的密碼。 |
FileUploader.java
Copyimport java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import org.xmlpull.v1.XmlPullParserException;
import io.minio.MinioClient;
import io.minio.errors.MinioException;
public class FileUploader {
public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException {
try {
// 使用MinIO服務的URL,埠,Access key和Secret key創建一個MinioClient對象
MinioClient minioClient = new MinioClient("//play.min.io", "Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG");
// 檢查存儲桶是否已經存在
boolean isExist = minioClient.bucketExists("asiatrip");
if(isExist) {
System.out.println("Bucket already exists.");
} else {
// 創建一個名為asiatrip的存儲桶,用於存儲照片的zip文件。
minioClient.makeBucket("asiatrip");
}
// 使用putObject上傳一個文件到存儲桶中。
minioClient.putObject("asiatrip","asiaphotos.zip", "/home/user/Photos/asiaphotos.zip");
System.out.println("/home/user/Photos/asiaphotos.zip is successfully uploaded as asiaphotos.zip to `asiatrip` bucket.");
} catch(MinioException e) {
System.out.println("Error occurred: " + e);
}
}
}
編譯FileUploader
Copyjavac -cp "minio-3.0.9-all.jar" FileUploader.java
運行FileUploader
Copyjava -cp "minio-3.0.9-all.jar:." FileUploader
/home/user/Photos/asiaphotos.zip is successfully uploaded as asiaphotos.zip to `asiatrip` bucket.
mc ls play/asiatrip/
[2016-06-02 18:10:29 PDT] 82KiB asiaphotos.zip
6、大數據與Minio
作為一個先進的對象存儲方案,Minio對於大數據及人工智慧的支援有著天然的優勢。
Minio支援與Spark,Flink等技術方案進行整合,並且通過S3 Select實現數據查詢的下沉,這讓大數據的存儲與查詢分離提供了事實依據。這也就為數據湖的構建打下了堅實的基礎。
MinIo支援S3協議,可以使用hadoop的aws包從minIO中讀取數據。
啟動spark 需要兩個jar包,aws-java-sdk hadoop-aws
spark-shell --executor-memory 2g --driver-memory 2g \
--jars aws-java-sdk-bundle-1.11.271.jar \
,hadoop-aws-3.0.0-cdh6.3.2.jar
val df=Seq((1,"student1"),(2,"student2"),(3,"student3")).toDF("id","name")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.access.key", "*****")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.secret.key", ""*****")")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.endpoint","127.0.0.1:9000")
spark.sparkContext.hadoopConfiguration.set("fs.s3a.path.style.access", "true");
spark.sparkContext.hadoopConfiguration.set("fs.s3a.connection.ssl.enabled", "false");
spark.sparkContext.hadoopConfiguration.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem");
df.rdd.saveAsTextFile( "s3a://test/df")
S3 Select
S3 Select 是 Amazon S3 的一項功能,專用於僅從對象中提取所需數據。藉助 Amazon S3 Select,您可以使用簡單的結構化查詢語言 (SQL) 語句來過濾 Amazon S3 對象的內容並僅檢索您需要的數據子集。
Minio S3 SELECT 同樣可以響應流式數據到 Flink 進一步分析處理。
更多Minio的相關資料,以及加入相關學習交流群,歡迎關注 大數據流動,聯繫 獨孤風 加群。