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