不再默认重新平衡对象存储!

请注意,这篇文章已被 https://blog.min-io.cn/minio-adds-manual-rebalancing/ 取代。请参阅该文章以了解我们目前关于对象存储重新平衡的思考。
MinIO 不使用传统的重新平衡技术来管理数据或增加容量。就像我们所做的一切一样,我们仔细审视了这种“传统智慧”,并确定重新平衡作为默认操作在对象存储特定实现的背景下将不会有效,该实现需要提供性能、可扩展性和最重要的是,大规模性能。因此,我们通过添加服务器池和擦除集来以不同的方式解决这个问题。这篇文章讨论了默认重新平衡与加权写入和按需重新平衡的权衡,并描述了我们构建可快速高效扩展而不会停机的大型系统的方法。
重新平衡的双刃剑
传统的分布式对象存储系统通过将数据分散到集群中的节点来平衡数据。 它们通过编写的策略来实现这一点,这些策略根据对象的特征、使用情况和资源来优化容量和/或性能。集群在写入对象时跨节点平衡对象以符合策略。关于平衡的一种思考方式是,它类似于条带化,只是条带化跨越磁盘数组,而平衡跨越集群中的节点。
有时需要重新平衡。虽然平衡在对象写入集群时进行,但重新平衡会尽可能快地对尽可能多的对象进行操作,因此它是一个资源密集且痛苦的过程。当节点或媒体被添加或从服务中移除以及当策略发生变化时,重新平衡变得必要。新资源在对象可以重新平衡到这些资源之前不可用于系统。重新平衡是一系列资源密集型任务,它们将集群 CPU、内存、网络和物理存储推到其极限,因为数据从节点到节点以及从磁盘到磁盘移动。
重新平衡一个庞大的分布式存储系统可能是一场噩梦。没有比添加一个存储节点然后无助地观看用户响应时间增加更糟糕的了,而系统本身的资源都在重新平衡以包含新节点。一些系统甚至足够智能,可以非常缓慢地重新平衡或在非高峰时段重新平衡,以最大程度地减少任务的整体性能影响,但谁有几个星期的时间来将一个新节点投入使用呢?
一种常用的替代方法是实现一个具有冗余容量的存储系统。这会浪费预算和更宝贵的机房空间,因为节点会闲置在机架中几个月甚至几年。可悲的是,当需要额外存储时,服务器和物理存储设备可能不再是可用的最快或最密集的设备。
自动重新平衡会给部署、操作和管理带来复杂性,这些复杂性会随着数据量的增加而增加。重新平衡一个 PB 比重新平衡一个 TB 要求高得多,考虑到数据增长的必然性,无法处理数十 PB 或更多数据的对象存储系统注定要失败。重新平衡不仅会影响性能——在网络上跨多个节点在多个节点之间移动许多对象也可能很危险。设备和组件会发生故障,这通常会导致数据丢失或损坏。缺乏按计划重新平衡能力的对象存储很可能使自身瘫痪。
扩展自由
MinIO 在设计我们的对象存储时考虑了这些权衡,并确定我们需要一个更好的扩展方法。
让我们看看 MinIO 的架构,特别是基础擦除编码。 擦除编码 类似于 RAID(之前提到过条带化),因为它将对象拆分为数据和奇偶校验块,并将它们分布在驱动器和服务器(硬件,以及 Kubernetes 软件节点的情况下)上的 MinIO 服务器池 中。擦除编码提供对象级修复,与 RAID 或复制等技术相比开销更低,并使 MinIO 能够在集群中丢失多个驱动器或节点/服务器进程的情况下,自动实时重建对象。
一组驱动器是一个 擦除集,MinIO 使用 Reed-Solomon 算法根据擦除集的大小将对象拆分为数据和奇偶校验块,然后将它们均匀分布在所有擦除集驱动器上,使得集中的每个驱动器最多包含一个对象块。
为了实现快速增长,MinIO 通过添加服务器池和擦除集来进行扩展。如果我们构建了 MinIO 以允许您将一个驱动器甚至单个硬件节点添加到现有的服务器池中,那么您将不得不忍受重新平衡。擦除代码算法将读取擦除集中所有对象,重新计算所有内容并将数据和奇偶校验块重新条带化/重新平衡到整个集中,包括新驱动器或节点。为了添加一个驱动器而用这种 I/O 阻塞和资源密集型任务来破坏生产环境是不值得的。
相反,MinIO 会启动新的服务器池,将其添加到现有的服务器池中,然后对存储填充最少的池执行新的写入操作(加权写入)。MinIO 使用加权写入作为默认机制,因为重新平衡成本高且消耗大量资源。重新平衡必须在用户流量较低的时候执行,以不影响应用程序性能,可以手动启动。
我们设计 MinIO 作为云原生对象存储,这意味着它必须能够快速、高效且透明地进行扩展。您无法通过添加一个驱动器或一个节点来实现快速增长到云规模。我们都见过数据中心,他们以机架甚至整排的方式引入存储以进行扩展。尝试逐个驱动器或逐个节点地增长云驱动器没有操作效率。
MinIO 通过添加服务器池来快速扩展,每个服务器池都是独立的计算、网络和存储资源集。MinIO 通常部署在多租户环境中,因为它具有快速增长的能力。每个租户都是一组独立增长的服务器池。添加硬件,运行 MinIO 服务器以创建和命名服务器进程,然后使用新服务器池的名称更新 MinIO。MinIO 将现有数据保留在其原始服务器池中,同时将新的服务器池暴露给传入数据。除非您想,否则无需重新平衡——这意味着没有停机时间,也不存在数据损坏的风险。
每个服务器池都由自己的硬件组成,使您能够灵活敏捷地构建对象存储,以满足业务和技术需求。底层存储硬件通常针对性能或容量进行优化。MinIO 建议集群在服务器池中至少有 4 个服务器,最多允许 32 个服务器,这为一次性实现大幅增长提供了保障。
停止自动重新平衡,开始扩展
构建对象存储没有任何意义,它受到其增长速度或大小的限制。自动重新平衡对象存储集群不再是必要的罪恶——它已经成为过去。快速将新的对象存储投入使用,满足甚至是最存储密集型用户和应用程序的需求。
下载 MinIO 并开始构建您的对象存储云。它简单明了,软件定义以实现最大灵活性,并且与 S3 API 兼容,因此它已准备好用于您的工作负载。加入我们的 Slack 频道 或发送邮件至 hello@min.io 与我们联系。我们在这里帮助您永远摆脱重新平衡。