文档

核心操作概念

MinIO 部署的组成部分是什么?

一个 MinIO 部署由一组存储和计算资源组成,这些资源运行一个或多个 minio server 节点,共同作为一个单一的对象存储库。

MinIO 的独立实例由一个单一的服务器池和一个 minio server 节点组成。独立实例最适合于初始开发和评估。

MinIO 部署可以直接在裸金属(bare metal)或非虚拟化基础设施的物理设备上运行。或者,MinIO 也可以在云服务中的虚拟机内运行,例如使用 Docker、Podman 或 Kubernetes。MinIO 可以在本地、私有云或市面上众多可用的公有云中运行。

您设计、架构和构建系统的具体方式称为系统的拓扑(topology)。

MinIO 支持哪些系统拓扑?

MinIO 可以部署到三种类型的拓扑中:

  1. 单节点单驱动器,一个 MinIO 服务器带有一个用于数据的驱动器或文件夹

    例如,在本地个人电脑上使用计算机硬盘上的一个文件夹进行测试。

  2. 单节点多驱动器,一个 MinIO 服务器带有多个挂载的驱动器或文件夹用于数据

    例如,一个带有两个或更多挂载卷的容器。

  3. 多节点多驱动器,多个 MinIO 服务器带有多个挂载的驱动器或卷用于数据

    对于裸金属基础设施,您可以使用 Ansible、Terraform 或手动流程来安装和管理分布式的 MinIO 部署。

    对于 Kubernetes 基础设施,使用 MinIO Operator 来管理和部署分布式的 MinIO 租户。

分布式 MinIO 部署是如何工作的?

分布式部署利用了不止一台物理或虚拟机上的计算和存储资源。在现代情况下,这通常意味着在私有或公有云环境中运行 MinIO,例如亚马逊网络服务(Amazon Web Services)、谷歌云平台(Google Cloud Platform)、微软的 Azure 平台,或许多其他平台。

MinIO 如何管理多个虚拟或物理服务器?

虽然测试 MinIO 可能只涉及单台计算机上的单个驱动器,但大多数生产环境的 MinIO 部署会使用多个计算和存储设备来创建高可用性环境。服务器池是一组 minio server 节点,它们将自己的驱动器和资源汇集起来,以支持对象存储的写入和检索请求。

MinIO 支持向现有的 MinIO 部署添加一个或多个服务器池以进行水平扩展。当 MinIO 有多个服务器池可用时,单个对象总是写入到同一个服务器池中的同一个纠删集中。

如果一个服务器池宕机,MinIO 会暂停对所有池的 I/O,直到集群恢复正常运行。您必须将该池恢复到工作状态才能恢复对部署的 I/O。在您执行修复操作时,写入其他池中的对象在磁盘上仍然是安全的。

传递给 minio server 命令的 HOSTNAME 参数代表一个服务器池。

请看下面的启动命令示例,它创建了一个服务器池,包含 4 个 minio server 节点,每个节点有 4 个驱动器,总共有 16 个驱动器。

minio server https://minio{1...4}.example.net/mnt/disk{1...4}

             |                    Server Pool                |

在同一个 minio server 启动命令中启动服务器池,可以使所有服务器池的对等节点相互感知。

有关完整的语法和用法,请参阅 minio server

我可以更改现有 MinIO 部署的大小吗?

MinIO 分布式部署支持扩展和退役功能,以增加或减少可用存储。

扩展包括向现有部署中添加一个或多个服务器池。每个服务器池由专用的节点和存储组成,为部署的总容量做出贡献。一旦创建了服务器池,就不能更改其大小,但可以随时通过添加或退役池来增加或移除容量。

有关裸金属和 Kubernetes 基础设施中扩展的更多信息,请分别参阅裸金属:扩展 MinIO 部署Kubernetes:扩展 MinIO 租户

对于拥有多个服务器池的部署,您可以退役较旧的池,并将数据迁移到部署中较新的池。一旦开始退役,就无法停止。MinIO 的退役功能旨在用于移除硬件老化的旧池,而不是在任何部署中定期执行的操作。

在退役后添加池时请保持池的顺序

如果您在多池部署中退役了一个池,您不能为新池使用相同的节点序列。例如,考虑一个具有以下池的部署:

https://minio-{1...4}.example.net/mnt/drive-{1...4}
https://minio-{5...8}.example.net/mnt/drive-{1...4}
https://minio-{9...12}.example.net/mnt/drive-{1...4}

如果您退役了 minio-{5...8} 池,您不能添加一个具有相同节点编号的新池。您必须在 minio-{9...12} 之后添加新池。

https://minio-{1...4}.example.net/mnt/drive-{1...4}
https://minio-{9...12}.example.net/mnt/drive-{1...4}
https://minio-{13...16}.example.net/mnt/drive-{1...4}

我该如何管理一个或多个 MinIO 实例或集群?

有几种选项可以管理您的 MinIO 部署和集群:

我该如何管理 MinIO 部署中的对象分布?

MinIO 通过将新对象(即没有现有版本的对象)写入到可用空间与所有可用服务器池总可用空间相比最大的服务器池中,来优化对象在可用池中的存储。MinIO 不会执行将对象从旧池重新平衡到新池这种代价高昂的操作。相反,新对象通常会路由到新池,因为它有最多的可用空间。随着该池逐渐填满,新的写入操作最终将在部署中的所有池之间达到平衡。有关写入偏好计算逻辑的更多信息,请参阅下面的写入文件

在扩展后重新平衡所有池中的数据是一项昂贵的操作,需要扫描整个部署并在池之间移动对象。根据需要移动的数据量,这可能需要很长时间才能完成。

从 MinIO Client 版本 RELEASE.2022-11-07T23-47-39Z 开始,您可以使用 mc admin rebalance 手动启动跨所有服务器池的重新平衡操作。

重新平衡不会阻塞正在进行的操作,并与所有其他 I/O 并行运行。这可能导致常规操作的性能下降。请考虑在非高峰时段安排重新平衡操作,以避免影响生产工作负载。您可以随时启动和停止重新平衡。

我该如何将对象上传到 MinIO?

您可以使用任何与 S3 兼容的 SDK 将对象上传到 MinIO 部署。每个 SDK 执行的都相当于一个 PUT 操作,它将对象传输到 MinIO 进行存储。

MinIO 还实现了对分段上传的支持,客户端可以将一个对象分成多个部分,以获得更好的传输吞吐量和可靠性。MinIO 会重新组装这些部分,直到得到一个完整的对象,然后将该对象存储在指定的路径。

MinIO 如何提供可用性、冗余性和可靠性?

MinIO 使用纠删码实现数据冗余和可靠性

MinIO 纠删码是一种数据冗余和可用性功能,它允许具有多个驱动器的 MinIO 部署在集群中丢失多个驱动器或节点的情况下,仍然能够实时自动重构对象。与 RAID 或复制等相邻技术相比,纠删码提供了对象级别的修复,且开销显著降低。

MinIO 实现位衰减修复以保护静态数据

位衰减(Bit rot)是指任何存储设备上都可能发生的随机、静默的数据损坏。位衰减损坏不是由用户的任何活动引起的,系统的操作系统本身也无法意识到这种损坏,因此不会通知用户或管理员数据的变化。

位衰减的一些常见原因包括:

  • 驱动器老化

  • 电流尖峰

  • 驱动器固件中的错误

  • 幻影写入

  • 错误的读/写操作

  • 驱动程序错误

  • 意外覆盖

MinIO 使用哈希算法来确认对象的完整性。此算法在对对象进行任何 GETHEAD 操作时自动应用。对于版本化存储桶中的对象,如果 MinIO 识别到版本不一致,PUT 操作也可能触发修复。如果一个对象因位衰减而损坏,MinIO 可以根据该对象的奇偶校验分片(parity shards)的可用性自动修复该对象。

MinIO 还可以使用 MinIO 扫描器 来执行位衰减检查和修复。但是,扫描器位衰减检查默认是关闭的。与位衰减影响分布在多个驱动器和节点上的多个对象分片的低概率相比,扫描器期间主动进行位衰减修复的性能影响很大。正常操作期间的自动检查通常足以应对位衰减,MinIO 不建议使用扫描器进行此类健康检查。

MinIO 将数据分布到纠删集中以实现高可用性和弹性

纠删集是一组支持 MinIO 纠删码的多个驱动器。纠删码为存储在 MinIO 部署上的数据提供了高可用性、可靠性和冗余性。

MinIO 将对象分成称为分片(shards)的数据块,并将它们均匀地分布在纠删集中的每个驱动器上。即使单个驱动器丢失,MinIO 也可以继续无缝地处理读写请求。在最高冗余级别下,即使丢失部署中多达一半(\(N / 2\))的驱动器,MinIO 仍然可以处理读请求,且性能影响最小。

MinIO 根据服务器池中驱动器的总数以及集合中 minio 服务器的数量来计算纠删集的大小和数量。更多信息请参阅纠删码基础

MinIO 自动实时修复损坏或丢失的数据

修复是 MinIO 在发生数据丢失事件后恢复数据的能力。数据丢失可能来自位衰减、驱动器丢失或节点丢失。

如果对象部分丢失,纠删码可提供持续的读写访问。

驱动器的独占访问

MinIO 要求对提供给对象存储的驱动器或卷进行独占访问。任何其他进程、软件、脚本或个人都不应直接对提供给 MinIO 的驱动器或卷,或者 MinIO 放置在它们上面的对象或文件执行任何操作。

除非得到 MinIO 工程团队的指示,否则不要使用脚本或工具直接修改、删除或移动所提供驱动器上的任何数据分片、奇偶校验分片或元数据文件,包括从一个驱动器或节点移动到另一个。这类操作极有可能导致大范围的损坏和数据丢失,超出 MinIO 的修复能力。

MinIO 使用奇偶校验在对象级别写入数据保护

具有多个驱动器的 MinIO 部署将可用驱动器分为数据驱动器和奇偶校验驱动器。当写入一个对象时,MinIO 纠删码会向奇偶校验驱动器添加关于该对象内容的额外哈希信息。MinIO 使用这些奇偶校验信息来确认对象的完整性,并在必要时恢复给定驱动器或一组驱动器上丢失、缺失或损坏的对象分片。

MinIO 可以容忍丢失的驱动器数量最多等于纠删集中可用的奇偶校验设备数量,同时仍然提供对对象的完全访问。

使用法定数量(Quorum)提供读写功能

法定数量是指执行任务所需的最少可用驱动器数量。MinIO 有一个用于读取数据的法定数量,和一个单独的用于写入数据的法定数量。

通常,MinIO 维持写入对象能力所需的可用驱动器数量要高于读取对象所需数量。

English 中文