天天看點

【MinIO】MinIO分布式部署MinIO分布式部署

MinIO分布式部署

MinIO簡介

MinIO是一款高性能的分布式對象存儲伺服器,專為大規模私有雲基礎架構而設計。

MinIO是一個分布式對象存儲伺服器,Amazon S3相容,用Go編寫,在Apache License Version 2.0 下開源。

MinIO為加密資料提供機密性,完整性和真實性保證,而性能開銷可忽略不計。使用AES-256-GCM,ChaCha20-Poly1305和AES-CBC支援伺服器端和用戶端加密。加密對象使用AEAD伺服器端加密進行防篡改。

分布式MinIO特點

分布式Minio可以讓你将多塊硬碟(甚至在不同的機器上)組成一個對象存儲服務。由于硬碟分布在不同的節點上,分布式Minio避免了單點故障。

分布式Minio好處

在大資料領域,通常的設計理念都是無中心和分布式。Minio分布式模式可以幫助你搭建一個高可用的對象存儲服務,你可以使用這些儲存設備,而不用考慮其真實實體位置。

分布式注意事項

  • 分布式MinIO使用的磁盤必須是幹淨的,裡面沒有資料。
  • 分布式MinIO裡所有節點需要同樣的access密鑰和secret密鑰,這樣這些節點才能建立連接配接,為了實作這個,你需要在執行minio server指令之前,先将access秘鑰和secret秘鑰export成環境變量。
  • 分布式MinIO裡的節點時間差不能超過3秒,可以使用NTP來保證時間一緻。
  • 在Windows下運作分布式Minio處于實驗階段,請悠着點使用。

資料保護

  • 分布式Minio采用 erasure code 來防範多個節點當機和位衰減 bit rot。
  • 分布式Minio至少需要4個節點,使用分布式Minio自動引入了糾删碼功能。

高可用

單機Minio服務存在單點故障,相反,如果是一個N節點的分布式Minio,隻要有N/2節點線上,你的資料就是安全的。不過你需要至少有N/2+1個節點 Quorum 來建立新的對象

例如,一個8節點的Minio叢集,每個節點一塊盤,就算4個節點當機,這個叢集仍然是可讀的,不過你需要5個節點才能寫資料

限制

分布式Minio單租戶存在最少4個盤最多16個盤的限制(受限于糾删碼)。這種限制確定了Minio的簡潔,同時仍擁有伸縮性。如果你需要搭建一個多租戶環境,你可以輕松的使用編排工具(Kubernetes)來管理多個Minio執行個體

注意,隻要遵守分布式Minio的限制,你可以組合不同的節點和每個節點幾塊盤。比如,你可以使用2個節點,每個節點4塊盤,也可以使用4個節點,每個節點兩塊盤,諸如此類

一緻性

Minio在分布式和單機模式下,所有讀寫操作都嚴格遵守read-after-write一緻性模型

MinIO分布式部署

作業系統:CentOS7

機器資源:

192.168.0.100

192.168.0.101

192.168.0.102

192.168.0.103

基于伺服器本地

拉取二進制Minio

wget https://dl.minio.io/server/minio/release/linux-amd64/minio
           

建立相關目錄(所有節點)

建立資料存儲目錄

mkdir -p /minio/{data1,data2}
           

建立啟動腳本目錄

mkdir -p /opt/minio
           

建立叢集配置檔案目錄

mkdir -p /etc/minio
           

編寫叢集啟動腳本(所有節點配置檔案相同)

vim /opt/minio/run.sh
           
#!/bin/bash
export MINIO_ACCESS_KEY=Minio
export MINIO_SECRET_KEY=Test123456

/opt/minio/minio server --config-dir /etc/minio \
http://192.168.0.100/minio/data1 http://192.168.0.100/minio/data2 \
http://192.168.0.101/minio/data1 http://192.168.0.101/minio/data2 \
http://192.168.0.102/minio/data1 http://192.168.0.102/minio/data2 \
http://192.168.0.103/minio/data1 http://192.168.0.103/minio/data2 \
           
其中,“MINIO_ACCESS_KEY”為使用者名,“MINIO_SECRET_KEY”為密碼,密碼不能設定過于簡單,不然minio會啟動失敗,“–config-dir”指定叢集配置檔案目錄

編寫服務啟動腳本(所有節點)

vim /usr/lib/systemd/system/minio.service
           
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/

[Service]
WorkingDirectory=/opt/minio/
ExecStart=/opt/minio/run.sh

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
           
其中,“WorkingDirectory”為啟動腳本目錄,“ExecStart”為指定叢集啟動腳本
chmod +x /usr/lib/systemd/system/minio.service
           

啟動測試

将minio上傳到

/opt/minio

目錄下并賦予權限

chmod +x minio
           

賦予啟動檔案權限

chmod +x /opt/minio/run.sh
           

啟動

systemctl daemon-reload
systemctl start minio
systemctl enable minio
           

測試

浏覽器輸入叢集任意節點位址+9000端口,即可通路minio,使用者名密碼為前面設定的“MINIO_ACCESS_KEY”和“MINIO_SECRET_KEY”,可建立“bucket”并上傳檔案測試

基于Docker Swarm(仍處在測試階段)

在Manager節點(192.168.0.100)上建立一個swarm

docker swarm init --advertise-addr 192.168.0.100
           

通過Docker swarm傳回的資訊,使用其他伺服器添加Worker節點

為MinIO建立Docker secret(或通過環境變量的方式進行配置)

echo "Minoi" | docker secret create access_key -
echo "Test123456" | docker secret create secret_key -
           
docker node update --label-add minio1=true kb1
docker node update --label-add minio2=true kb2
docker node update --label-add minio3=true kb3
docker node update --label-add minio4=true kb4
           

在Manager節點中建立Docker Swarm配置檔案docekr-compose-secrets.yaml,内容如下

version: '3.7'

services:
  minio1:
    image: minio/minio:latest
    hostname: minio1
    volumes:
      - minio1-data:/export
    ports:
      - "9001:9000"
    networks:
      - minio_distributed
    deploy:
      restart_policy:
        delay: 10s
        max_attempts: 10
        window: 60s
      placement:
        constraints:
          - node.labels.minio1==true
    command: server http://minio{1...4}/export
    secrets:
      - secret_key
      - access_key
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio2:
    image: minio/minio:latest
    hostname: minio2
    volumes:
      - minio2-data:/export
    ports:
      - "9002:9000"
    networks:
      - minio_distributed
    deploy:
      restart_policy:
        delay: 10s
        max_attempts: 10
        window: 60s
      placement:
        constraints:
          - node.labels.minio2==true
    command: server http://minio{1...4}/export
    secrets:
      - secret_key
      - access_key
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio3:
    image: minio/minio:latest
    hostname: minio3
    volumes:
      - minio3-data:/export
    ports:
      - "9003:9000"
    networks:
      - minio_distributed
    deploy:
      restart_policy:
        delay: 10s
        max_attempts: 10
        window: 60s
      placement:
        constraints:
          - node.labels.minio3==true
    command: server http://minio{1...4}/export
    secrets:
      - secret_key
      - access_key
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio4:
    image: minio/minio:latest
    hostname: minio4
    volumes:
      - minio4-data:/export
    ports:
      - "9004:9000"
    networks:
      - minio_distributed
    deploy:
      restart_policy:
        delay: 10s
        max_attempts: 10
        window: 60s
      placement:
        constraints:
          - node.labels.minio4==true
    command: server http://minio{1...4}/export
    secrets:
      - secret_key
      - access_key
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

volumes:
  minio1-data:

  minio2-data:

  minio3-data:

  minio4-data:

networks:
  minio_distributed:
    driver: overlay

secrets:
  secret_key:
    external: true
  access_key:
    external: true
           

Docker Swarm啟動叢集MinIO

docker stack deploy --compose-file=docker-compose-secrets.yaml minio_stack
           

繼續閱讀