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。

https://github.com/minio/minio

它提供了與 Amazon S3 雲存儲服務兼容的 API,使用 MinIO 爲機器學習、分析和應用程序數據工作負載構建高性能基礎架構。

輕量,操作簡單。

特點

  1. 構建高性能的雲原生數據;

  2. 機器學習,大數據分析,海量存儲的基礎架構;

  3. MinIO 支持各種應用程序數據工作負載;

  4. 在中國:阿里巴巴、騰訊、百度、中國聯通、華爲、中國移動等等 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 瀏覽器指向 http://127.0.0.1:9000 並使用 根憑據。您可以使用瀏覽器來創建桶、上傳對象以及瀏覽 MinIO 服務器的內容。

Linux

使用以下命令在運行 64 位 Intel/AMD 架構的 Linux 主機上運行獨立的 MinIO 服務器。將/data 替換爲您希望 MinIO 存儲數據的驅動器或目錄的路徑。

wget http://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 瀏覽器指向 http://127.0.0.1:9000 並使用 root 憑據登錄。您可以使用瀏覽器來創建桶、上傳對象以及瀏覽 MinIO 服務器的內容。

測試

MinIO Server 帶有一個基於 Web 的嵌入式對象瀏覽器。將您的 Web 瀏覽器指向 http://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 http://192.168.1.11/export1 http://192.168.1.12/export2 \
               http://192.168.1.13/export3 http://192.168.1.14/export4 \
               http://192.168.1.15/export5 http://192.168.1.16/export6 \
               http://192.168.1.17/export7 http://192.168.1.18/export8

Windows

Copyset MINIO_ACCESS_KEY=<ACCESS_KEY>
set MINIO_SECRET_KEY=<SECRET_KEY>
minio.exe server http://192.168.1.11/C:/data http://192.168.1.12/C:/data ^
                  http://192.168.1.13/C:/data http://192.168.1.14/C:/data ^
                  http://192.168.1.15/C:/data http://192.168.1.16/C:/data ^
                  http://192.168.1.17/C:/data http://192.168.1.18/C:/data

K8S 部署

Kubernetes 的部署和狀態集提供了在獨立,分佈式或共享模式下部署 MinIO 服務器的完美平臺。在 Kubernetes 上部署 MinIO 有多種選擇,您可以選擇最適合您的。

安裝 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 或更高版本:

使用 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'
}

快速入門示例-文件上傳

本示例程序連接到一個對象存儲服務,創建一個存儲桶並上傳一個文件到該桶中。

你需要有存儲服務的三個參數才能連接到該服務。

Id46Ij

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("https://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 的相關資料,以及加入相關學習交流羣,歡迎關注 大數據流動,聯繫 獨孤風 加羣。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/OnYUpSCnKlhnG5rT4DK-GA