在生产环境中,MinIO 集群通常部署在多个物理机或虚拟机上,每个节点运行一个 MinIO 容器,并通过 Docker 暴露 API 和 Console 端口。
假设有 4 台服务器(也可以是同一台服务器的不同端口模拟,但不推荐生产使用):
192.168.1.101
192.168.1.102
192.168.1.103
192.168.1.104
每台服务器上创建一个数据目录,如 /data/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 集群是通过在启动时传入所有节点的地址来实现的,每个节点只需要挂载自己的数据目录,不需要挂载其他节点的数据。
在每台服务器上运行如下命令(以 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
。在 Server2、Server3、Server4 上执行类似的命令,只需将 IP 地址替换为各自的 IP 即可。
http://192.168.1.101:9001
,使用 minioadmin/minioadmin
登录。mc
命令行工具来管理集群。mc
客户端管理集群mc
:wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
mc alias set myminio http://192.168.1.101:9000 minioadmin minioadmin
mc admin info myminio