雲原生分布式文件存儲 MinIO 教程


文章轉載自:https://mp.weixin.qq.com/s/_52kZ5jil1Cec98P5oozoA

MinIO 提供開源、高性能、兼容 s3 的對象存儲,為每個公共雲、每個 Kubernetes 發行版、私有雲和邊緣雲中無縫運行,使其成為混合雲和多雲對象存儲的領導者。

1. MinIO 的應用場景

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

  • 網盤 : 海量文件
  • 社交網站:海量圖片
  • 電商網站:海量商品圖片
  • 視頻網站:海量視頻文件

對於中小型企業,如果不選擇存儲上雲,那么 MinIO 是個不錯的選擇,麻雀雖小,五臟俱全。當然 MinIO 除了直接作為對象存儲使用,還可以作為雲上對象存儲服務的網關層,無縫對接到 Amazon S3 等。

2. MinIO 的系統特點

[1] 高性能

  • MinIO 是全球領先的對象存儲先鋒,在標准硬件上,讀/寫速度上高達 183GB/s 和171GB/s,已經成為 Hadoop HDFS 的替代品。
  • MinIO 用作雲原生應用程序的主要存儲,與傳統對象存儲相比,雲原生應用程序需要更高的吞吐量和更低的延遲。而這些都是 MinIO 能夠達成的性能指標。

[2] 可擴展性

  • MinIO 一直秉承着 “簡單可擴展” 的理念,為對象存儲帶來了一個簡單的縮放模型。借助在此基礎之上,可以實現 MinIO 從單個群集到其他 MinIO 群集聯合使用的情況,並且在需要時可以跨越多個不同的數據中心。

[3] 開放全部源代碼 + 企業級支持

  • MinIO 基於 Apache V2 license 的 100% 開放源代碼的產品。
  • 客戶能夠自動的、無限制、自由免費使用和集成 MinIO、自由的創新和創造、 自由的去修改、自由的再次發行新的版本和軟件。其部署的多樣性使軟件變得更加堅固,這是專有軟件無法提供的。

[4] 混合雲和多雲

  • 亞馬遜雲的 S3 API 是在全球范圍內達到共識的對象存儲的協議。
  • 當添加到數以百萬計的私有雲實例和廣泛的邊緣部署時,MinIO 是混合雲的領導者。

[5] 簡單而強大

  • 極簡主義是 MinIO 的指導性設計原則。簡單性減少了出錯的機會,提高了正常運行時間,提供了可靠性,同時簡單性又是性能的基礎。
  • 只需下載一個二進制文件然后執行,即可在幾分鍾內安裝和配置 MinIO。MinIO 升級是通過一個簡單命令完成的,這個命令可以無中斷的完成 MinIO 的升級,並且不需要停機即可完成升級操作。

3. MinIO 的基礎概念

存儲相關的概念

  • 一個對象存儲在一個 Set
  • 一個集群划分為多個 Set
  • 一個 Set 中的 Drive 盡可能分布在不同的節點上
  • 一個 Set 包含的 Drive 數量是固定的,默認由系統根據集群規模自動計算

糾刪碼 - EC - Erasure Code

MinIO 使用 糾刪碼和校驗和 機制來保證高可靠性,即便丟失一半數量(N/2)的硬盤,仍然可以恢復數據。糾刪碼是一種恢復丟失和損壞數據的數學算法,MinIO 采用 Reed-Solomon code 將對象拆分成 N/2 數據和 N/2 奇偶校驗塊。這就意味着如果是 12 塊盤,一個對象會被分成 6 個數據塊、6 個奇偶校驗塊,你可以丟失任意 6 塊盤,仍可以從剩下的盤中的數據進行恢復。

糾刪碼的工作原理和 RAID 或者復制不同,像 RAID6 可以在損失兩塊盤的情況下不丟數據,而 MinIO 糾刪碼可以在丟失一半的盤的情況下,仍可以保證數據安全。而且 MinIO 糾刪碼是作用在對象級別,可以一次恢復一個對象,而 RAID 是作用在卷級別,數據恢復時間很長。MinIO 對每個對象單獨編碼,存儲服務一經部署,通常情況下是不需要更換硬盤或者修復。MinIO 糾刪碼的設計目標是為了性能和盡可能的使用硬件加速。

對象的存儲形式

文件對象上傳到 MinIO 上面,會在對應的磁盤當中,以 Bucket 名稱為目錄,文件名稱為下一級目錄,文件名下是 part.1 和 xl.meta,前者是編碼數據塊及檢驗塊,后者是元數據文件。

常見的使用方案

4. MinIO 的安裝部署 - 單機

建議使用容器化安裝和部署方式 - 簡單和好用

需要注意的是,單機版本無法使用,版本控制、對象鎖定和存儲桶復制等功能。如果需要使用,是需要部署 帶有糾刪碼的分布式 MinIO。對於擴展的開發和生產,請在啟用擦除編碼的情況下部署 MinIO - 特別是, 每個 MinIO 服務器最少 4 個驅動器。

單機版 - 容器安裝 - 沒有糾錯碼版本

  • 9000 端口為自帶的 Web 網頁入庫
  • 9001 端口為使用 API 和客戶端的連接口
# 內嵌了一個MinIO的對象服務
# http://127.0.0.1:9000 (默認用戶名和密碼:minioadmin:minioadmin)
$ docker run -d --name=minio-test \
    -p 9000:9000 -p 9001:9001 \
    quay.io/minio/minio server /data --console-address ":9001"

# 啟動時自定義用戶和密碼
$ docker run -d --name=minio-test \
    -p 9000:9000 -p 9001:9001 \
    -e "MINIO_ROOT_USER=admin" \
    -e "MINIO_ROOT_PASSWORD=12345678" \
    quay.io/minio/minio server /data --console-address ":9001"

# MINIO_ROOT_USER length should be at least 3, and MINIO_ROOT_PASSWORD length at least 8 characters

# Windows系統啟動
$ docker run -d --name=minio-test \
    -p 9000:9000 -p 9001:9001 \
    -v D:\data:/data \
    -e "MINIO_ROOT_USER=admin" \
    -e "MINIO_ROOT_PASSWORD=12345678" \
    quay.io/minio/minio server /data --console-address ":9001"
# 在設置安全密鑰的時候報錯:Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
# 設置安全秘鑰啟動
$ echo "admin" | docker secret create access_key -
$ echo "123456" | docker secret create secret_key -

# 使用docker-service的安全秘鑰啟動,
$ docker service create --name="minio-service" \
    --secret="access_key" --secret="secret_key" \
    --env="MINIO_ROOT_USER_FILE=my_access_key" \
    --env="MINIO_ROOT_PASSWORD_FILE=my_secret_key" \
    quay.io/minio/minio server /data

單機版 - 容器安裝 - 帶有糾錯碼版本

  • 9000 端口為自帶的 Web 網頁入庫
  • 9001 端口為使用 API 和客戶端的連接口
# 命令行啟動
$ mkdir -p /{data1,data2,data3,data4,data5,data6,data7,data8}

$ minio server /data1 /data2 /data3 /data4 /data5 /data6 /data7 /data8

# 容器啟動
$ docker run -d --name=minio-test \
  -p 9000:9000 -p 9001:9001 \
  -v /mnt/data1:/data1 \
  -v /mnt/data2:/data2 \
  -v /mnt/data3:/data3 \
  -v /mnt/data4:/data4 \
  -v /mnt/data5:/data5 \
  -v /mnt/data6:/data6 \
  -v /mnt/data7:/data7 \
  -v /mnt/data8:/data8 \
  quay.io/minio/minio server /data{1...8} --console-address ":9001"

單機版 - 命令安裝

  • 9000 端口為自帶的 Web 網頁入庫
  • 9001 端口為使用 API 和客戶端的連接口
# MacOS
$ brew install minio/stable/minio
$ minio server /data

# linux
$ apt install minio
$ minio server /data

單機版 - 二進制安裝

  • 9000 端口為自帶的 Web 網頁入庫
  • 9001 端口為使用 API 和客戶端的連接口
# MacOS
$ wget https://dl.min.io/server/minio/release/darwin-amd64/minio
$ chmod +x minio
$ ./minio server /data

# Windows
$ wget https://dl.min.io/server/minio/release/windows-amd64/minio.exe
$ minio.exe server D:\

# Linux
$ wget https://dl.min.io/server/minio/release/linux-amd64/minio
$ chmod +x minio
$ ./minio server /data

$ ufw allow 9000:9010/tcp
$ firewall-cmd --get-active-zones
$ firewall-cmd --zone=public --add-port=9000/tcp --permanent
$ firewall-cmd --reload

5. MinIO 的安裝部署 - 分布式

在大數據領域,通常的設計理念都是無中心和分布式。MinIO 也提供了分布式部署的方式,其好處在於,可以提供一個高可用的對象存儲服務,確保數據不會丟失和一致。MinIO 在分布式和單機模式下,所有讀寫操作都嚴格遵守 read-after-write 一致性模型。

命令行方式啟動 - client

# 設置變量
$ export MINIO_ROOT_USER=<ACCESS_KEY>
$ export MINIO_ROOT_PASSWORD=<SECRET_KEY>

# 命令行啟動方式格式
$ minio server http://host{1...n}/export{1...m}
$ minio server http://host{1...n}/export{1...m} http://host{o...z}/export{1...m}

# 命令行啟動方式示例
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

容器方式啟動 - docker

version: '3.7'

services:
  minio:
    restart: on-failure
    container_name: app_minio
    image: quay.io/minio/minio:RELEASE.2021-11-09T03-21-45Z
    command: server /data --console-address ":9001"
    ports:
      - "80:9000"
      - "81:9001"
    volumes:
      - "/app_minio/data:/data"
    environment:
      MINIO_ROOT_USER: admin
      MINIO_ROOT_PASSWORD: 12345678
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3
    networks:
      - app_minio_network

networks:
  app_minio_network:

容器方式啟動 - kubernetes

  • helm minio charts
# 安裝MinIO的chart
$ helm install stable/minio

# 容器平台上面啟動服務 - 單機
$ helm install --name minio-release \
    --namespace minio
    --set rootUser=rootuser,rootPassword=rootpass123
    --set persistence.size=100Gi \
    stable/minio

#  容器平台上面啟動服務 - 分布式
$ helm install --set mode=distributed stable/minio
$ helm install --set mode=distributed,numberOfNodes=8 stable/minio
$ helm install --set mode=shared,numberOfNodes=8 stable/minio
$ helm install --set persistence.enabled=false stable/minio

6. MinIO 的安裝部署 - 多租戶

[1] 單主機 + 單磁盤

$ minio server --address :9001 /data/tenant1
$ minio server --address :9002 /data/tenant2
$ minio server --address :9003 /data/tenant3

[2] 單主機 + 多塊磁盤 (有糾錯碼)

$ minio server --address :9001 /disk{1...4}/data/tenant1
$ minio server --address :9002 /disk{1...4}/data/tenant2
$ minio server --address :9003 /disk{1...4}/data/tenant3

[3] 多主機 + 多塊磁盤 (分布式+糾錯碼)

$ export MINIO_ROOT_USER=<TENANT1_ACCESS_KEY>
$ export MINIO_ROOT_PASSWORD=<TENANT1_SECRET_KEY>
$ minio server --address :9001 http://192.168.10.1{1...4}/data/tenant1

$ export MINIO_ROOT_USER=<TENANT2_ACCESS_KEY>
$ export MINIO_ROOT_PASSWORD=<TENANT2_SECRET_KEY>
$ minio server --address :9002 http://192.168.10.1{1...4}/data/tenant2

$ export MINIO_ROOT_USER=<TENANT3_ACCESS_KEY>
$ export MINIO_ROOT_PASSWORD=<TENANT3_SECRET_KEY>
$ minio server --address :9003 http://192.168.10.1{1...4}/data/tenant3

7. MinIO 的網頁使用

[1] 運行服務 - docker-compose

  • docker-compose.yaml
  • nginx.conf
version: "3.7"

x-minio-common: &minio-common
  image: quay.io/minio/minio:RELEASE.2021-11-24T23-19-33Z
  command: server --console-address ":9001" http://minio{1...4}/data{1...2}
  expose:
    - "9000"
    - "9001"
  environment:
    MINIO_ROOT_USER: minio
    MINIO_ROOT_PASSWORD: minio123
  healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
    interval: 30s
    timeout: 20s
    retries: 3

services:
  minio1:
    <<: *minio-common
    hostname: minio1
    volumes:
      - data1-1:/data1
      - data1-2:/data2

  minio2:
    <<: *minio-common
    hostname: minio2
    volumes:
      - data2-1:/data1
      - data2-2:/data2

  minio3:
    <<: *minio-common
    hostname: minio3
    volumes:
      - data3-1:/data1
      - data3-2:/data2

  minio4:
    <<: *minio-common
    hostname: minio4
    volumes:
      - data4-1:/data1
      - data4-2:/data2

  nginx:
    image: nginx:1.19.2-alpine
    hostname: nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "9000:9000"
      - "9001:9001"
    depends_on:
      - minio1
      - minio2
      - minio3
      - minio4

volumes:
  data1-1:
  data1-2:
  data2-1:
  data2-2:
  data3-1:
  data3-2:
  data4-1:
  data4-2:

[2] 啟動服務

# docker-compose
$ docker stack deploy --compose-file docker-compose.yaml minio

[3] 界面登錄

8. MinIO 客戶端使用

[1] MC 命令行工具安裝

# 容器安裝
$ docker pull minio/mc
$ docker run minio/mc ls play
$ docker run -it --entrypoint=/bin/sh minio/mc

# MacOS
brew install minio/stable/mc

# Linux
$ wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc

# 自動補全
mc --autocompletion

[2] MC 命令行參數介紹

  • mc xxx
alias        設置/移除/列出自定義的別名
ls           列出文件和文件夾
mb           創建一個存儲桶或一個文件夾
rb           移除一個桶
cp           拷貝文件和對象
mirror       給存儲桶和文件夾做鏡像
cat          顯示文件和對象內容
head         顯示對象的第n行
pipe         將一個STDIN重定向到一個對象或者文件或者STDOUT
share        生成用於共享的URL
find         基於參數查找文件
sql          在對象上運行SQL查詢
stat         顯示對象元信息
mv           移動文件和對象
tree         以樹的格式列出桶和對象
du           統計磁盤使用情況
retention    設置對象和桶的保留
legalhold    設置對象的合法持有
diff         對兩個文件夾或者存儲桶比較差異
rm           刪除文件和對象
encrypt      管理桶加密配置
events       管理對象通知
watch        監聽文件和對象的事件
undo         取消PUT/DELETE操作
policy       管理訪問策略
tag          管理桶和對象的標簽
ilm          管理桶的生命周期
version      輸出版本信息
replicate    配置服務器端桶復制
admin        管理Minio服務器
update       檢查軟件更新

[3] MC 服務端命令參數

  • mc admin xxx
service     服務重啟並停止所有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管理操作
bucket      管理MinIO服務器中定義的存儲桶

[4] 示例演示 (個別地方沒有走通)

# MinIO雲存儲配置,默認使用80端口,其他端口需要單獨加上,具體看實際操作
mc alias set minio http://192.168.1.51 admin 123456
mc alias set s3 https://s3.amazonaws.com admin 123456
mc alias set gcs  https://storage.googleapis.com admin 123456

實際操作:
# mc alias set minio http://192.168.20.102:9001 admin 12345678 
Added `minio` successfully.

# 開始操作雲存儲 - 列出所有存儲桶
mc ls play

# 創建一個桶
# mc mb play.min.io/mybucket
Bucket created successfully `play.min.io/mybucket`.

# 上傳東西
mc cp myobject.txt play/mybucket

9. MinIO Python SDK (未實踐)

Python 代碼操作 MinIO 服務

  • MinIO Python SDK for Amazon S3 Compatible Cloud Storage Slack
  • Python Client API Reference
  • MinIO Python SDK Examples
# 安裝pip包
pip3 install minio

# file_uploader.py
from minio import Minio
from minio.error import S3Error


def main():
    # Create a client with the MinIO server playground, its access key
    # and secret key.
    client = Minio(
        "play.min.io",
        access_key="Q3AM3UQ867SPQQA43P2F",
        secret_key="zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG",
    )

    # Make 'asiatrip' bucket if not exist.
    found = client.bucket_exists("asiatrip")
    if not found:
        client.make_bucket("asiatrip")
    else:
        print("Bucket 'asiatrip' already exists")

    # Upload '/home/user/Photos/asiaphotos.zip' as object name
    # 'asiaphotos-2015.zip' to bucket 'asiatrip'.
    client.fput_object(
        "asiatrip", "asiaphotos-2015.zip", "/home/user/Photos/asiaphotos.zip",
    )
    print(
        "'/home/user/Photos/asiaphotos.zip' is successfully uploaded as "
        "object 'asiaphotos-2015.zip' to bucket 'asiatrip'."
    )


if __name__ == "__main__":
    try:
        main()
    except S3Error as exc:
        print("error occurred.", exc)


免責聲明!

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



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