核心操作概念
MinIO 部署的组件是什么?
MinIO 部署包含一组存储和计算资源,这些资源运行一个或多个 minio server
节点,这些节点共同充当单个对象存储库。
MinIO 的独立实例包含一个具有单个 minio server
节点的服务器池。独立实例最适合初始开发和评估。
MinIO 部署可以直接运行在物理设备上的裸机
或非虚拟化基础设施上。或者,MinIO 也可以运行在云服务上的虚拟机中,例如使用 Docker、Podman 或 Kubernetes。MinIO 可以本地运行,也可以在私有云或市场上众多公有云中的任何一个运行。
您设计、架构和构建系统的方式被称为系统的拓扑结构
。
MinIO 支持哪些系统拓扑结构?
MinIO 可以部署到三种类型的拓扑结构
分布式 MinIO 部署是如何工作的?
分布式部署利用了多个物理或虚拟机的计算和存储资源。在现代环境中,这通常意味着在私有云或公有云环境中运行 MinIO,例如使用 Amazon Web Services、Google Cloud Platform、Microsoft 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 集群?
集群指的是整个 MinIO 部署,包括一个或多个服务器池。
考虑下面的命令,它创建了一个由两个服务器池组成的集群,每个服务器池包含 4 个minio server
节点,每个节点 4 个磁盘,总共 32 个磁盘。
minio server https://minio{1...4}.example.net/mnt/disk{1...4} \
https://minio{5...8}.example.net/mnt/disk{1...4}
| Server Pool |
每个服务器池都有一个或多个擦除集,具体取决于池中的磁盘和节点数量。
MinIO 强烈建议生产集群的服务器池中至少包含 4 个minio server
节点,以确保适当的高可用性和持久性。
我能否更改现有 MinIO 部署的大小?
MinIO 分布式部署支持扩展和停用,作为增加或减少可用存储的功能。
扩展包括向现有部署添加一个或多个服务器池。每个服务器池都包含专用的节点和存储,这些节点和存储有助于提高部署的整体容量。创建服务器池后,您无法更改其大小,但您可以随时通过添加或停用池来增加或减少容量。
有关更多信息,请参阅扩展 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 客户端版本 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 实现位腐烂修复以保护静态数据
位腐烂是指任何存储设备上可能发生的随机、静默的数据损坏。位腐烂损坏不会由用户的任何活动引发,系统操作系统本身也没有意识这种损坏,无法通知用户或管理员数据发生了更改。
位腐烂的一些常见原因包括
驱动器老化
电流尖峰
驱动器固件中的错误
幽灵写入
错误的读/写操作
驱动程序错误
意外覆盖
MinIO 使用散列算法来确认对象的完整性。此算法在对对象执行任何 GET
和 HEAD
操作时自动应用。对于版本化存储桶中的对象,PUT
操作也可以在 MinIO 识别版本不一致时触发修复。如果对象因位腐烂而损坏,MinIO 可以根据对象奇偶校验分片的可访问性自动修复对象。
MinIO 还可以使用MinIO 扫描程序执行位腐烂检查和修复。但是,扫描程序的位腐烂检查默认情况下是关闭的。与位腐烂影响分布在多个驱动器和节点上的多个对象分片的概率较低相比,扫描程序期间的主动位腐烂修复会对性能产生重大影响。通常,正常操作期间的自动检查足以应对位腐烂,MinIO 不建议使用扫描程序进行此类健康检查。
MinIO 将数据分布在擦除集中,以实现高可用性和弹性
擦除集是一组多个驱动器,支持 MinIO 擦除编码。擦除编码提供存储在 MinIO 部署中的数据的 高可用性、可靠性和冗余性。
MinIO 将对象划分为块(称为分片),并在擦除集中的每个驱动器上均匀分布这些块。即使丢失任何单个驱动器,MinIO 也可以继续无缝地提供读写请求服务。在最高的冗余级别,即使丢失了部署中多达一半 (\(N / 2\)) 的驱动器,MinIO 也可以以最小的性能影响提供读请求服务。
MinIO 根据服务器池中驱动器的总数和该集中minio
服务器的数量计算擦除集的大小和数量。有关更多信息,请参阅擦除编码基础知识。
MinIO 自动动态修复损坏或丢失的数据
修复是 MinIO 在某些事件导致数据丢失后恢复数据的能力。数据丢失可能来自位腐烂、驱动器丢失或节点丢失。
擦除编码在对象部分丢失时提供持续的读写访问。
驱动器的独占访问
MinIO **需要**对用于对象存储的驱动器或卷进行独占访问。任何其他进程、软件、脚本或人员都不应直接对提供给 MinIO 的驱动器或卷或 MinIO 在其上放置的对象或文件执行任何操作。
除非 MinIO 工程师指示,否则不要使用脚本或工具直接修改、删除或移动提供的驱动器上的任何数据分片、奇偶校验分片或元数据文件,包括从一个驱动器或节点移动到另一个驱动器或节点。此类操作极有可能导致广泛的损坏和数据丢失,超出 MinIO 的修复能力。
MinIO 使用奇偶校验在对象级别写入数据保护
具有多个驱动器的 MinIO 部署将可用驱动器划分为数据驱动器和奇偶校验驱动器。MinIO 擦除编码在写入对象时将有关对象内容的其他散列信息添加到奇偶校验驱动器。MinIO 使用奇偶校验信息来确认对象的完整性,并在必要时恢复给定驱动器或一组驱动器上丢失的、缺失的或损坏的对象分片。
MinIO 可以容忍丢失的驱动器总数等于擦除集中可用的奇偶校验设备数量,同时仍能提供对对象的完全访问。
使用仲裁交付读写功能
必须可用的最小驱动器数量才能执行任务。MinIO 具有一个用于读取数据的仲裁和一个用于写入数据的单独仲裁。
通常,与读取对象所需的驱动器数量相比,MinIO 需要更多数量的可用驱动器来保持写入对象的能力。