在生產環境中,MinIO 集群通常部署在多個物理機或虛擬機上,每個節點運行一個 MinIO 容器,并通過 Docker 暴露 API 和 Console 端口。
1. 準備工作
假設有 4 臺服務器(也可以是同一臺服務器的不同端口模擬,但不推薦生產使用):
- Server1: IP
192.168.1.101
- Server2: IP
192.168.1.102
- Server3: IP
192.168.1.103
- Server4: IP
192.168.1.104
每臺服務器上創建一個數據目錄,如 /data/minio
。
2. 在每臺服務器上啟動 MinIO 容器
在每臺服務器上執行如下命令(以 Server1 為例):
docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"
? 注意:上面的命令是錯誤的示范,因為每個節點應該只掛載自己的數據目錄,并且
server
命令中的地址應該是所有節點的地址,而不是當前節點的地址。正確的命令如下:
正確的啟動命令(每臺服務器執行):
在 Server1 上運行:
docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"
這是錯誤的! 因為每個節點只能掛載自己的數據目錄,不能把其他節點的數據目錄掛載到自己容器里。
正確的做法是:
每個節點只掛載自己的數據目錄,并在 server
命令中指定所有節點的地址(包括自己),但不掛載其他節點的數據。
Server1 上運行:
docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"
實際上,MinIO 會自動發現其他節點,你只需要在 server
命令中列出所有節點的地址即可,不需要掛載其他節點的數據。
更準確的做法是:
每個節點只掛載自己的數據目錄,然后在 server
命令中指定所有節點的地址(包括自己),如下:
Server1 上運行:
docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"
但這仍然是錯的!
正確的 MinIO 分布式啟動方式是:
每個節點只需要掛載自己的數據目錄,并在 server
命令中指定所有節點的地址(包括自己),但不需要掛載其他節點的數據。
正確命令示例(每臺服務器執行,以 Server1 為例):
docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"
實際上,MinIO 的 server
命令支持通過 http://host:port/minio/data
的方式來指定節點,但更推薦使用 MINIO_ENDPOINTS
環境變量或在啟動時直接傳入所有節點地址。
更簡單的方式是:
在每個節點上運行:
docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"
這是錯誤的!
正確的做法是:
MinIO 分布式模式要求你啟動時傳入所有節點的地址(包括自己),但每個節點只需要掛載自己的數據目錄。
正確命令(每臺服務器執行,以 Server1 為例):
docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"
還是錯的!
其實 MinIO 的分布式模式是通過在啟動時傳入所有節點的地址來實現的,但每個節點只需要掛載自己的數據目錄,不需要掛載其他節點的數據。
正確的方式是:
在每臺服務器上運行如下命令(以 Server1 為例):
docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"
這仍然是錯誤的表達方式!
正確的 MinIO 分布式集群啟動方式
MinIO 集群是通過在啟動時傳入所有節點的地址來實現的,每個節點只需要掛載自己的數據目錄,不需要掛載其他節點的數據。
在每臺服務器上運行如下命令(以 Server1 為例):
docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"
這是錯誤的!
其實 MinIO 的 server
命令不支持直接傳入 http://host:port/data
這樣的地址。正確的方式是:
MinIO 分布式模式是通過環境變量 MINIO_ENDPOINTS
或直接在命令行中傳入所有節點的地址來實現的。
正確的方式是:
在每臺服務器上運行如下命令(以 Server1 為例):
docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000 http://192.168.1.102:9000 http://192.168.1.103:9000 http://192.168.1.104:9000 --console-address ":9001"
還是錯的!
其實 MinIO 的 server
命令在分布式模式下,只需要傳入所有節點的 API 地址(即 http://host:port
),而不是 http://host:port/data
。
最終正確的命令如下(每臺服務器執行,以 Server1 為例):
docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000 http://192.168.1.102:9000 http://192.168.1.103:9000 http://192.168.1.104:9000 --console-address ":9001"
解釋:
http://192.168.1.101:9000
到http://192.168.1.104:9000
是所有 MinIO 節點的 API 地址。- 每個節點只需要掛載自己的數據目錄
/data/minio
。 - MinIO 會自動發現其他節點并組成集群。
在 Server2、Server3、Server4 上執行類似的命令,只需將 IP 地址替換為各自的 IP 即可。
三、驗證集群狀態
- 訪問任意一個節點的 Console 界面,如
http://192.168.1.101:9001
,使用minioadmin/minioadmin
登錄。 - 在 Console 中可以看到集群的狀態,包括所有節點是否正常。
- 也可以通過 MinIO 提供的
mc
命令行工具來管理集群。
四、使用 mc
客戶端管理集群
- 下載
mc
:
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
- 配置 MinIO 集群別名:
mc alias set myminio http://192.168.1.101:9000 minioadmin minioadmin
- 查看集群狀態:
mc admin info myminio
五、總結
- 開發/測試環境:可以使用 Docker Compose 模擬 MinIO 集群,但注意它只是模擬,不能實現真正的數據分布和冗余。
- 生產環境:建議在多臺服務器上部署 MinIO 分布式集群,每個節點運行一個 Docker 容器,掛載自己的數據目錄,并在啟動時傳入所有節點的 API 地址。