随着计算世界的发展和 DRAM 价格的暴跌,我们发现服务器配置通常配备 500GB 或更多的 DRAM。当您处理大型部署时,即使是那些具有超高密度 NVMe 驱动器的部署,这些服务器上的服务器数量乘以 DRAM 也会迅速增加,通常达到几 TB。该 DRAM 池可以配置为分布式共享内存池,非常适合需要大量 IOPS 和吞吐量性能的工作负载。
因此,我们为 Enterprise Plus 和 Enterprise Lite 客户构建了 MinIO Enterprise Object Store Cache 功能。MinIO Enterprise Cache 允许我们的客户通过缓存经常访问的对象来利用此共享内存池。MinIO Enterprise Cache 将进一步提高核心 AI 工作负载的性能。
差异化点
MinIO Enterprise Cache 与通用缓存服务的区别在于它了解数据源(即 MinIO Enterprise Object Store)。
通用缓存旨在与任何数据源一起使用。因此,如果在缓存中找不到项目,他们能做的最好的事情就是返回“未找到”响应。从那里,调用方必须提取数据并将其提交到通用缓存服务进行缓存。
另一方面,MinIO 的企业缓存功能是专门为缓存 MinIO 对象而构建的。如果在对象的现有缓存中找不到对象,则它将自动检索该对象,缓存该对象以供将来的请求使用,并将该对象返回给调用方。
另一个区别点是 MinIO Enterprise Cache 使用一致哈希算法将缓存的对象数据分散到缓存节点集群(称为对等节点)中。一致的哈希可确保对象可以根据其密钥轻松定位。它还确保节点包含相同数量的数据,以便在其他节点空闲时不会过载。然而,更重要的是,它以这样一种方式将对象分散开来,如果添加或删除节点,则只需进行最小的洗牌即可使系统对齐。这会导致对象的键值与保存缓存对象的节点之间建立一对一关系。
在本文后面,我将更深入地介绍这两个差异化功能。现在,让我们更好地了解 MinIO 的企业缓存中可用的选项,以及它如何与 MinIO 企业对象存储集成。
设置 MinIO Enterprise 缓存
设置 MinIO Enterprise Cache 非常简单,只需在 MinIO Enterprise Object Store 控制台中启用服务并指定需要缓存的存储桶即可。如果之前未配置缓存,则控制台中的“缓存”对话框将类似于下面的屏幕截图。要激活缓存服务,请单击“激活缓存”按钮。
启用缓存服务后,您需要指定将使用缓存的存储桶。如下面的屏幕截图所示。首先,指定最大内存设置。这是将用于跨所有存储桶进行缓存的最大内存量。接下来,指定每个需要缓存的存储桶以及每个存储桶要使用的内存量。如果希望缓存终结点使用 TLS,请指定 CA 路径、公钥路径和私钥路径。
让我们仔细看看将 MinIO Enterprise Cache 服务与其他缓存服务区分开来的功能。
为 MinIO 构建的缓存
如果通用缓存服务要与 MinIO Enterprise Object Store 一起使用,则请求对象的应用程序需要先检查缓存服务,然后再调用 MinIO。由于 MinIO 缓存是专门为 MinIO 企业对象存储构建的,因此它在后台工作。应用程序和服务在不了解 MinIO 缓存的情况下调用 MinIO。如果请求的对象被缓存,则 MinIO 将从缓存中检索该对象。如果它没有被缓存,而它应该被缓存,那么 MinIO 将检索对象,缓存它,并将其返回到调用服务。
当缓存作为存储解决方案的扩展构建时,缓存维护会更有效。例如,如果更新了缓存的对象,则 MinIO Enterprise Object Store 可以使缓存中的对象失效或更新缓存。此外,MinIO 缓存使用滚动缓存将缓存的总大小保持在 MinIO 缓存配置中指定的限制内。如果添加新对象将导致缓存大小超过指定的限制,则将根据指示上次请求对象的时间戳删除一个或多个对象。
要了解 MinIO 缓存对需要对象存储的应用程序或服务的好处,让我们考虑一下将通用缓存服务与 MinIO 一起使用时将发生的流程。如下所示。所有网络请求都用红色箭头表示,进程间调用用黑色箭头表示。
现在考虑 MinIO 缓存使用的流。如下图所示。对于请求对象数据的应用程序,MinIO Cache 实现的逻辑更易于使用。使用任何 MinIO SDK 的应用程序发出请求的方式与完全未设置缓存时相同。缓存是一项幕后操作 - 不需要协调对第三方缓存服务的调用。
当需要填充缓存时,使用 MinIO 缓存还可以减少网络跃点。(4 个网络调用。当缓存服务(如 MinIO 缓存)了解数据源时,它可以在之前未缓存数据的情况下代表请求者检索数据。这导致网络利用率降低 20%(4 个网络调用对 5 个)。这也意味着对象始终返回到请求应用程序。
最后,MinIO 缓存利用控制器中的热内存缓存来处理频繁请求的对象,因此无需为这些对象向节点发出网络请求。
一致的哈希处理,实现复原能力
一致哈希是一种算法,用于根据对象的名称(或键)确定哪个节点包含(或应该包含)缓存对象,该名称(或密钥)随每个请求传递给 MinIO 缓存。这样做的优点是,无需使用必须与每个请求一起搜索的大型查找表。一致哈希还以这样一种方式将对象分散到节点集群中,从而最大限度地减少在节点发生故障或添加节点(集群横向扩展)时移动对象的需要。
让我们通过一致哈希算法的简单应用来了解它的工作原理和它提供的价值。使用可以将字符串转换为数字的哈希算法,在不维护表的情况下确定对象应驻留的节点非常简单。创建此数字后,Consistent Hashing 会获取它并将其映射到圆的边缘。最简单的方法是使用 360 通过模运算符运行哈希数。示例:370 模 360 等于 10。模运算返回除法运算的余数和另一个数字。最小可能值 0 对应于零的角度,最大可能值对应于近 360 度的角度(或 2π 弧度),所有其他哈希值将线性拟合介于两者之间。当对三个对象完成时,圆可能如下所示:
现在我们对节点做同样的事情。我们通过对它们的 IP 地址或 URL 应用相同的算法将它们放在圆圈的边缘。现在,我们的圈子看起来像这样:
要确定对象应驻留在哪个节点上,请从圆上的对象开始,逆时针行进,直到到达节点。
现在,作为一个思想实验,假设一个节点失败了,其他节点必须吸收额外的工作。您会注意到,不需要移动现有对象,并且最接近故障节点的节点将获得额外的工作,直到故障节点恢复。接下来,假装添加了一个额外的节点。结果是相似的。新节点将缓慢获取对象,从而减少最近对象的负载。这个简单的例子说明了一致哈希的效率。实际上,这种算法更复杂;如果您感兴趣,请在此处内容。
一致哈希是一种分布式哈希方案,它通过在抽象圆上为它们分配一个位置来独立于参与算法的服务器或对象的数量来运行。这允许服务器和对象在不影响整个系统的情况下进行扩展。
总结
MinIO Cache 是一种缓存服务,它使用内存来缓存经常访问的对象。MinIO Cache 专为 MinIO 企业对象存储构建,是 MinIO 的最佳缓存服务,与不了解 MinIO 对象存储的通用缓存服务不同。如果从 MinIO 缓存请求对象,并且缓存中不存在该对象,则 MinIO 缓存将为您获取该对象并将其放入缓存中以供后续请求使用。
此外,MinIO 缓存利用“一致哈希”方案在节点横向扩展操作和节点故障期间进行高效的对象管理。