手动使用 Docker 启动 MinIO 分布式集群(推荐生产环境)

在生产环境中,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:9000http://192.168.1.104:9000 是所有 MinIO 节点的 API 地址。
  • 每个节点只需要挂载自己的数据目录 /data/minio
  • MinIO 会自动发现其他节点并组成集群。

在 Server2、Server3、Server4 上执行类似的命令,只需将 IP 地址替换为各自的 IP 即可。


三、验证集群状态

  1. 访问任意一个节点的 Console 界面,如 http://192.168.1.101:9001,使用 minioadmin/minioadmin 登录。
  2. 在 Console 中可以看到集群的状态,包括所有节点是否正常。
  3. 也可以通过 MinIO 提供的 mc 命令行工具来管理集群。

四、使用 mc 客户端管理集群

  1. 下载 mc
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
  1. 配置 MinIO 集群别名:
mc alias set myminio http://192.168.1.101:9000 minioadmin minioadmin
  1. 查看集群状态:
mc admin info myminio

五、总结

  • 开发/测试环境:可以使用 Docker Compose 模拟 MinIO 集群,但注意它只是模拟,不能实现真正的数据分布和冗余。
  • 生产环境:建议在多台服务器上部署 MinIO 分布式集群,每个节点运行一个 Docker 容器,挂载自己的数据目录,并在启动时传入所有节点的 API 地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87709.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在IntelliJ IDEA中设置数据库连接全局共享

在现代软件开发中,数据库连接管理是开发过程中不可或缺的一部分。为了提高开发效率,减少配置错误,并方便管理,IntelliJ IDEA 提供了一个非常有用的功能:数据库连接全局共享。通过这个功能,你可以在多个项目…

【Python】文件应用: 查找读取的文件内容

查找读取的文件内容 from pathlib import Pathpath Path(pi_million_digits.txt) contents path.read_text()lines contents.splitlines() pi_string for line in lines:pi_string line.lstrip()birthday input("Enter your birthday, in the form mmddyy: "…

交互式剖腹产手术模拟系统开发方案

以下是为您设计的《交互式剖腹产手术模拟系统》开发方案框架,包含技术实现路径与详细内容结构建议。由于篇幅限制,这里呈现核心框架与关键模块说明: 交互式剖腹产手术模拟系统开发方案 一、项目背景与意义 1.1 传统医学教学痛点分析 尸体标本成本高昂(约$2000/例)活体训…

AWS WebRTC: 判断viewer端拉流是否稳定的算法

在使用sdk-c viewer端进行拉流的过程中,viewer端拉取的是视频帧和音频帧,不会在播放器中播放,所以要根据收到的流来判断拉流过程是否稳定流畅。 我这边采用的算法是:依据相邻帧之间的时间间隔是否落在期望值的 20% 范围内。 音频…

【Python】文件读取:逐行读取应用实例——从一个JSONL文件中逐行读取文件

从一个JSONL文件中逐行读取文件,并将这些问题保存到一个新的JSONL文件中 import json import argparse import os # 导入os模块用于检查文件是否存在def read_questions_from_jsonl(file_path, limit):"""从JSONL文件中读取指定数量的question部分…

百宝箱生成智能体

点击新建应用 工作流如下: 点击发布 点击Web服务,上架

嵌入式 数据结构学习(五) 栈与队列的实现与应用

一、栈(Stack)详解 1. 栈的基本概念 栈的定义与特性 后进先出(LIFO):最后入栈的元素最先出栈 操作限制:只能在栈顶进行插入(push)和删除(pop)操作 存储位置:我们实现的链栈位于堆区(malloc分配),系统栈区存储函数调用信息 栈…

汇编与接口技术:8259中断实验

一、实验目的 该实验使学生掌握8259向量中断方式的硬件连接和软件编程的方法,同时使同学掌握中断和其它接口芯片配合来完成某一特定任务的方法。 二、实验内容 1、手动产生单脉冲作为中断请求信号连接到MIRQ3上和SIRT10上。每按一次开关产生一次中断,…

Ajax的初步学习

一、什么是 Ajax? Ajax (Asynchronous JavaScript and XML) 是一种无需重新加载整个网页的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。 主要特性: 异步性 (Asynchronous…

OOM电商系统订单缓存泄漏,这是泄漏还是溢出

电商系统订单缓存泄漏的本质分析一、明确概念区别内存泄漏(Memory Leak)定义:对象已经不再被使用,但由于被错误引用而无法被垃圾回收特点:内存使用量随时间持续增长,最终可能导致OOM类比:像浴缸…

二进制安全-汇编语言-02-寄存器

二、寄存器 水滴石穿 一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连 内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其他器件的联系 简单说,在CPU中: 运算器进行信息处理寄存器进…

Java——初始guava(1)

基于 Google Guava 官方教程的解答 📚 Guava 提供了哪些 JDK 不具备的 API? Guava 扩展了 JDK 的集合框架,提供了多种 JDK 没有的实用 API: 不可变集合(Immutable Collections) ImmutableList、ImmutableSet、ImmutableMap 等特性:创建后不可修改,线程安全,性能优于…

day53

import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset import numpy as np from sklearn.preprocessing import MinMaxScaler from sklearn.datasets import load_iris import warnings # 忽略不必要的警…

c++ python 共享内存

一、目的 是为了c来读取并解码传递给python,Python做测试非常方便,c 和 python之间必须定好协议,整体使用c 来解码,共享内存传递给python 二、主类 主类,串联decoder,注意decoder并没有直接在显存里面穿…

react函数组件的props,ref,state。

react开发我们会把页面分为一个个组件,组件是独立而且可复用的重复代码片段。具体来说组件可以是一个按钮,一个输入框。react组件有两种定义方法,一种是函数组件,一种是类组件。我们这里说一下函数组件之间父子之间如何传递props参…

基于ARM+FPGA实现的BISS-C协议解决方案,适用于高精度光栅位移传感器等

模块简介 本资源提供了专为FPGA设计的BISS-C接口协议发送模块源码。BISS-C模式作为一种高速、同步的串行通信协议,广泛应用于高精度光栅位移传感器的数据传输中,特别适用于需要精确位置信息的应用场景。此模式遵循主从架构,其中FPGA作为主控制…

spring中@Transactional注解和事务的实战理解附代码

文章目录 前言一、事务是什么?二、事务的特性2.1隔离性2.2事务的隔离级别 三、Transactional注解Transactional注解简介基本用法常用属性配置事务传播行为事务隔离级别异常处理与回滚性能优化建议 四、 事务不生效的可能原因方法访问权限非public自调用问题异常被捕…

替代进口SCA7606【智芯微】国产高精度电流传感器 工业新能源电网专用

SCA7606(智芯微)产品解析与推广文案一、产品概述SCA7606 是 智芯微电子(ZXMICRO) 推出的一款 高精度数字隔离式电流传感器芯片,采用 霍尔效应数字输出 技术,专为 工业控制、新能源、智能电网 等领域的电流检…

Java 与 Vue 全栈开发:“一课一得“ 学习笔记系统实战

一、项目背景与核心价值 "一课一得" 是一个面向学习者的笔记管理平台,旨在帮助用户系统化记录、整理和回顾学习内容。项目采用前后端分离架构:前端基于 Vue.js 构建交互式界面,后端使用 Java Spring Boot 实现业务逻辑&#xff0c…

百度文心大模型 4.5 开源深度测评:技术架构、部署实战与生态协同全解析

声明:本文只做实际测评,并非广告 1.前言 2025 年 6 月 30 日,百度做出一项重大举措,将文心大模型 4.5 系列正式开源,并选择国内领先的开源平台 GitCode 作为首发平台。该模型也是百度在2025年3月16日发布的自研的新一…