中文文档

可用性和弹性

本页从生产角度概述了 MinIO 可用性和弹性的设计和功能。

备注

本页面的内容旨在尽力指导您理解 MinIO 的预期设计以及可用性和弹性背后的理念。 它不能取代 MinIO SUBNET 和商业化技术支持(4008-566-339)的功能。 它允许在规划 MinIO 部署时与 MinIO工程师团队进行协调。

社区用户可以在 MinIO社区讨论 上寻求支持。 社区支持只是尽力而为,没有关于响应能力的 SLA。

分布式 MinIO 部署

MinIO 实现纠删码作为核心组件,在驱动器或节点级故障事件期间提供可用性和弹性。

MinIO 将每个对象划分为数据和 奇偶校验分片 ,并将这些分片分布在单个 纠删码集合 上。

纠删码对象分为 12 个数据分片和 4 个奇偶校验分片的图表

这一小型单节点部署在一个纠删码集合中有 16 个驱动器。 假设默认奇偶校验 parityEC:4 ,MinIO 将对象划分为 4(四个)奇偶校验分片和 12(十二)个数据分片。 MinIO 将这些分片均匀分布在纠删码集合中的每个驱动器上。

MinIO 使用确定性算法来为给定对象选择纠删码集合。

对于每个唯一的对象命名空间 BUCKET/PREFIX/[PREFIX/...]/OBJECT.EXTENSION ,MinIO 始终选择相同的纠删码集合进行读/写操作。 这包括同一对象的所有 versions

基于对象命名空间的纠删码集合选择图

MinIO 使用完整的对象命名空间计算目标纠删码集合。

MinIO 需要 读写最低磁盘数 来针对纠删码集合执行读取和写入操作。

仲裁取决于为部署配置的奇偶校验。 读取仲裁始终等于配置的奇偶校验,这样 MinIO 就可以针对丢失的驱动器数量不超过奇偶校验的任何纠删码集合执行读取操作。

降级纠删码集合图,其中两个奇偶校验分片替换了两个数据分片

该节点有两个故障驱动器。 MinIO 使用奇偶校验分片自动替换丢失的数据分片,并将重建的对象提供给请求客户端。

使用默认奇偶校验 EC:4 ,部署可以容忍每个纠删码集合丢失 4(四)个驱动器,并且仍然提供读取操作。

写入仲裁取决于配置的奇偶校验和纠删码集合的大小。

如果奇偶校验小于纠删码集合驱动器数量的 1/2(一半),则写入仲裁等于奇偶校验,并且功能与读取仲裁类似。

MinIO 自动增加写入降级纠删码集合中的对象的奇偶校验,以确保该对象能够满足与健康纠删码集合中的对象相同的:abbr:SLA (服务等级协议)。 奇偶校验升级行为提供了额外的风险缓解层,但不能取代修复或更换损坏的驱动器以使纠删码集合恢复到完全健康状态的长期解决方案。

降级纠删码集合图,其中两个驱动器发生故障

该节点有两个故障驱动器。 MinIO 使用升级后的奇偶校验“EC:6”写入对象,以确保该对象满足与其他对象相同的 SLA。

使用默认奇偶校验 EC:4 ,部署可以容忍每个纠删码集合丢失 4 个驱动器,并且仍然提供写入操作。

如果奇偶校验等于纠删码集合驱动器数量的 1/2(一半),则写入仲裁数等于奇偶校验 + 1(一个)以避免由于“脑裂”情况导致数据不一致。

例如,如果纠删码集合中正好有一半的驱动器由于网络故障而被隔离,MinIO 将认为仲裁丢失,因为它无法为写入操作建立 N+1 组驱动器。

一半驱动器出现故障的纠删码集合图表

该节点有 50% 的驱动器故障。 如果奇偶校验为 EC:8 ,则该纠删码集合无法满足写入仲裁,并且 MinIO 会拒绝对该集的写入操作。 由于纠删码集合仍然保持读取仲裁,因此对现有对象的读取操作仍然可以成功。

永久丢失的驱动器数量多于配置的奇偶校验的纠删码集合已遭受数据丢失。

对于最大奇偶校验配置,如果驱动器损耗等于奇偶校验,则纠删码集合将进入“只读”模式。 对于最大纠删码集合大小 16 和最大奇偶校验 8,这将需要丢失 9 个驱动器才会发生数据丢失。

完全退化的纠删码集合示意图

该纠删码集合丢失的驱动器数量多于“EC:4”配置的奇偶校验数量,因此丢失了读取和写入仲裁。 MinIO 无法恢复存储在此纠删码集合上的任何数据。

暂时或暂时的驱动器故障(例如由于存储控制器或连接硬件故障)可能会恢复到纠删码集合中的正常操作状态。

MinIO通过在池中对称地“条带化”纠删码集驱动器,进一步减轻了纠删码集故障的风险。

根据节点和驱动器的数量,MinIO会自动计算最佳的编码组大小,其中最大的编码组大小为16。 然后,对于每个纠删码集,它会选择跨越池中每个节点的一个驱动器,如果编码组条带大小大于节点数,则循环进行。 这种拓扑结构可以提供弹性以应对单个节点或甚至该节点上的存储控制器的损失。

由 16 个节点和每个节点 8 个驱动器组成的集群图示,其中包含了 8 个由 16 个驱动器组成、均匀条带化分布在每个节点中的编码组。

在这个 16 x 8 的部署中,MinIO将会计算出 8 个由 16 个驱动器组成的编码组。 它会在可用的节点中选择一个驱动器来填充每个纠删码集。 如果有 8 个节点,那么 MinIO 将需要为每个编码组选择每个节点的 2 个驱动器。

在上述拓扑结构中,池中有 8 个由 16 个驱动器组成、条带化分布在 16 个节点上的编码组。 每个节点将分配一个驱动器给每个纠删码集。 虽然失去一个节点在技术上会导致 8 个驱动器的损失,但是每个编码组只会失去一个驱动器。 这保持了最小磁盘数,尽管存在节点停机的情况下。

每个编码组都独立于同一池中的其他编码组。

如果一个编码组完全降级,MinIO仍然可以执行对其他编码组的读/写操作。

一种 MinIO 多池部署的图示,其中一个池中出现了一个故障的纠删码集。

一个池中有一个降级的纠删码集。 虽然 MinIO 不能再对该纠删码集提供读/写操作,但它仍然可以继续在该池中对健康的纠删码集执行操作。

然而,丢失的数据可能会影响依赖于 100% 数据可用性假设的工作负载。 此外,每个纠删码集都是完全独立的,因此您无法使用其他纠删码集将数据恢复到完全降级的纠删码集中。 您必须使用 站点(Site)桶(Bucket) 复制来创建一个适合 BC/DR 的远程部署,以便恢复丢失的数据。

对于多池MinIO部署,每个池都需要至少一个纠删码集来维护读写规定最小的硬盘数以继续执行操作。

如果一个池失去了所有的纠删码集,MinIO将无法确定特定的读写操作是否会路由到该池。 因此,MinIO会停止对整个部署的所有输入输出,即使其他池仍然可操作。

MinIO 多池部署的图示,其中一个池已失败。

此部署中的一个池完全失败。 MinIO 无法再确定将 I/O 路由到哪个池或纠删码集合。 持续的操作可能会产生不一致的状态,其中对象和/或其版本驻留在不同的纠删码集合中。 因此,MinIO 会停止部署中的所有 I/O ,直到池恢复。

要恢复对部署的访问,管理员必须将池恢复到正常运行状态。 这可能需要格式化磁盘、更换硬件或更换节点,具体取决于故障的严重程度。 请查看 硬件故障和恢复办法 以获取更完整的文档。

使用复制的遥控器将丢失的数据恢复到部署中。 存储在健康池中的所有数据都安全地保存在磁盘上。

Exclusive access to drives

MinIO 要求 专有 对提供给对象存储的驱动器或卷的访问。 其他任何进程、软件、脚本或人员都不得直接对提供给MinIO的驱动器或卷执行 任何 操作,也不得对MinIO放置在其上的对象或文件执行操作。

除非由MinIO工程部门指导,否则不要使用脚本或工具直接修改、删除或移动提供给MinIO的驱动器上的任何数据片段、校验片段或元数据文件,包括从一个驱动器或节点移动到另一个驱动器或节点。 这些操作很可能会导致广泛的数据损坏和丢失,超出了MinIO的修复能力。

复制 MinIO 部署

在 MinIO 部署中,为确保业务连续性和灾难恢复(BC/DR),MinIO 实施 站点复制 作为主要措施,以防止小规模和大规模数据丢失。
初始化设置期间多站点部署的图示。

每个对等站点都部署在独立的数据中心中,以保护免受大规模故障或灾害。 如果一个数据中心完全离线,客户端可以切换到其他站点。

由于短暂或持续的停机而导致部分或全部数据丢失的站点,MinIO 复制可以自动 heal
在恢复期间多站点部署的图示

数据中心 2 崩溃,站点 B 需要重新同步。 负载均衡器处理到 Datacenter 1 的站点 A 的路由操作。 站点 A 持续地将数据复制到站点 B。

一旦所有数据同步完成,您可以恢复该站点的正常连接。 根据复制滞后量、站点之间的延迟和整体工作量 I/O ,您可能需要暂时停止写操作,以允许站点完全赶上。

如果对等站点完全失败,您可以将该站点从配置中完全删除。 负载均衡器配置也应该删除该站点,以避免将客户端请求路由到离线站点。

然后,您可以通过 将其添加回站点复制配置 来恢复对等站点,无论是修复原始硬件还是完全替换它。 MinIO 在持续复制新数据的同时自动开始重新同步现有数据。

在重新同步期间,站点可以通过将 GET/HEAD 请求代理到健康的对等站点来继续处理操作。
在恢复期间多站点部署的图示

站点 B 没有所请求的对象,可能是由于复制滞后。 它将 GET 请求代理到站点 A。 站点 A 返回该对象,然后站点 B 将其返回给请求的客户端。

客户端从第一个对等站点接收结果以返回所请求对象的 任何 版本。

PUTDELETE 操作使用常规复制过程进行同步。 LIST 操作不代理,并要求客户端专门针对健康的同行发布它们。

Join Slack 商业支持购买咨询