MinIO 企业缓存:用于超高性能的分布式 DRAM 缓存

MinIO Enterprise Cache: A Distributed DRAM Cache for Ultra-Performance

随着计算世界的不断发展以及DRAM 价格的暴跌,我们发现服务器配置通常配备了 500GB 或更大的 DRAM。当您处理更大规模的部署时,即使那些使用超密集 NVMe 驱动器的部署,服务器数量乘以这些服务器上的 DRAM 也会迅速增加——通常达到几个 TB。该 DRAM 池可以配置为一个分布式的共享内存池,非常适合需要海量 IOPS 和吞吐量性能的工作负载。

因此,我们为 MinIO Enterprise Plus 和 Enterprise Lite 客户构建了 MinIO Enterprise 对象存储缓存功能。MinIO Enterprise Cache 允许我们的客户通过缓存经常访问的对象来利用这个共享内存池。MinIO Enterprise Cache 将进一步提高核心 AI 工作负载的性能。

差异化优势

MinIO Enterprise Cache 与通用缓存服务的不同之处在于,它了解数据源——即 MinIO Enterprise 对象存储。

通用缓存旨在与任何数据源一起使用。因此,如果缓存中找不到某个项目,它们所能做的最好的事情就是返回“未找到”响应。从那里,调用方必须获取数据并将其提交给通用缓存服务进行缓存。

另一方面,MinIO 的 Enterprise Cache 功能是专门为缓存 MinIO 对象而构建的。如果在现有的对象缓存中找不到某个对象,那么它将自动检索该对象,将其缓存以供将来请求使用,并将该对象返回给调用方。

另一个差异化优势是 MinIO Enterprise Cache 使用一致性哈希算法将缓存的对象数据分布到缓存节点(称为对等节点)集群中。一致性哈希确保可以根据对象的键轻松找到对象。它还确保节点包含相同数量的数据,这样就不会出现一个节点过载而其他节点空闲的情况。更重要的是,它以这样一种方式分布对象,即如果添加或删除节点,则系统对齐所需的重新分配最少。这导致对象的键值与保存缓存对象的节点之间存在一对一的关系。

我将在本文的后面更深入地探讨这两个差异化功能。现在,让我们更好地了解 MinIO Enterprise Cache 中可用的选项以及它如何与 MinIO Enterprise 对象存储集成。

设置 MinIO Enterprise Cache

设置 MinIO Enterprise Cache 就像在 MinIO Enterprise 对象存储控制台中启用服务并指定需要缓存的存储桶一样简单。如果以前没有配置过缓存,则控制台中的缓存对话框将类似于下面的屏幕截图。要激活缓存服务,请单击“激活缓存”按钮。

启用缓存服务后,您需要指定将使用缓存的存储桶。这在下面的屏幕截图中显示。首先,指定最大内存设置。这是所有存储桶缓存将使用的最大内存量。接下来,指定每个需要缓存的存储桶以及每个存储桶将使用的内存量。如果您希望缓存端点使用 TLS,则指定 CA 路径、公钥路径和私钥路径。

让我们更仔细地看看使 MinIO Enterprise Cache 服务与其他缓存服务不同的功能。

为 MinIO 打造的缓存

如果将通用缓存服务与 MinIO Enterprise 对象存储一起使用,则请求对象的应用程序需要先检查缓存服务,然后再调用 MinIO。由于 MinIO Cache 是专门为 MinIO Enterprise 对象存储构建的,因此它在后台工作。应用程序和服务调用 MinIO,而无需了解 MinIO Cache。如果请求的对象已缓存,则 MinIO 将从缓存中检索该对象。如果它未被缓存并且应该被缓存,则 MinIO 将检索该对象,将其缓存并将其返回给调用服务。

当缓存作为存储解决方案的扩展构建时,缓存维护会更有效率。例如,如果更新了缓存的对象,则 MinIO Enterprise 对象存储可以使缓存中的对象失效或更新缓存。此外,MinIO Cache 使用滚动缓存来保持缓存的总大小在 MinIO Cache 配置中指定的限制范围内。如果添加新对象会导致缓存大小超过指定的限制,则将根据指示上次请求对象的时间戳删除一个或多个对象。

要了解 MinIO Cache 对需要对象存储的应用程序或服务的益处,让我们考虑一下如果将通用缓存服务与 MinIO 一起使用时会发生的流程。如下所示。所有网络请求都用红色箭头表示,进程间调用用黑色箭头表示。

现在考虑 MinIO Cache 使用的流程。如下所示。对于请求对象数据的应用程序,MinIO Cache 实现的逻辑更易于使用。使用任何 MinIO SDK 的应用程序都以与未设置缓存时相同的方式发出请求。缓存是后台操作 - 无需协调对第三方缓存服务的调用。

使用 MinIO Cache 还可以减少缓存需要填充时的网络跳数。(4 个网络调用。)当像 MinIO Cache 这样的缓存服务了解数据源时,它可以代表请求者检索数据,以防数据以前没有被缓存。这导致网络利用率降低了 20%(4 个网络调用对 5 个)。这也意味着始终将对象返回给请求应用程序。

最后,MinIO Cache 在控制器中使用热内存缓存来缓存经常请求的对象,从而无需向节点发出网络请求来获取这些对象。

用于弹性的 一致性哈希

一致性哈希是一种算法,用于根据对象的名称(或键)确定哪个节点包含(或应该包含)缓存的对象,该名称(或键)随每个对 MinIO Cache 的请求一起传递。这样做的优点是无需维护必须在每次请求时搜索的大型查找表。一致性哈希还以这样一种方式将对象分布到节点集群中,从而最大程度地减少了节点故障或添加节点(集群扩展)时移动对象的需要。

让我们逐步了解一致性哈希算法的一个简单应用,以了解它的工作原理及其提供的价值。使用可以将字符串转换为数字的哈希算法,无需维护表即可确定对象应该驻留在哪个节点上非常简单。创建此数字后,一致性哈希会将其映射到圆的边缘。最简单的方法是使用 360 对哈希数字运行模运算。示例:370 模 360 等于 10。模运算返回除以另一个数字的除法运算的余数。最小可能值零将对应于零角度,最大可能值将对应于几乎 360 度(或 2𝝅 弧度)的角度,所有其他哈希值将线性地适合两者之间。当针对三个对象完成时,圆可能如下所示

现在,我们对节点执行相同的操作。我们通过对它们的 IP 地址或 URL 应用相同的算法,将它们放置在圆的边缘。现在,我们的圆看起来像这样

要确定对象应该驻留在哪个节点上,您从圆上的对象开始,逆时针移动,直到遇到一个节点。

现在,作为一个思想实验,假设一个节点发生故障,其他节点必须吸收额外的工作。您会注意到,不需要移动现有对象,并且最靠近故障节点的节点将承担额外的工作,直到故障节点恢复。接下来,假设添加了一个额外的节点。结果类似。新节点将逐渐获取对象,从而减少最靠近对象的负载。这个简单的示例说明了一致性哈希的效率。实际上,此算法更复杂;如果您有兴趣,请阅读此处了解更多信息。

一致性哈希是一种分布式哈希方案,它通过将服务器和对象分配到抽象圆圈上的某个位置,使其独立于参与算法的服务器或对象数量。这使得服务器和对象能够扩展而不会影响整个系统。

摘要

MinIO Cache 是一种缓存服务,它使用内存来缓存频繁访问的对象。MinIO Cache 专为 MinIO Enterprise Object Store 而构建,是 MinIO 最佳的缓存服务——与不了解 MinIO 对象存储的通用缓存服务不同。如果从 MinIO Cache 请求对象,并且缓存中不存在该对象,则 MinIO Cache 将为您获取该对象并将其放入缓存中以供后续请求使用。

此外,MinIO Cache 利用“一致性哈希”方案,以便在节点扩展和节点故障期间高效地管理对象。