Azure 搜索索引器的编程缩放

Programmatic scaling of Azure Search indexers

我有 Cosmos DB 集合,它们由标准的 Azure 搜索索引器 + 数据源对索引。并按照文档中的建议使用 WHERE _ts > @HighWaterMark inQuery。

有时我需要将 up/down 索引器从 1 扩展到 N 以加速索引过程。

对于静态缩放,我可以创建 N 对数据源 + 索引器,它们将处理在查询中定义的单独分区或项目子集,例如WHERE indexingGroup = <1..N> AND _ts >= @HighWaterMark

但现在我需要动态缩放这些对。例如,我有 1 个索引器,我想再创建 1 个。我需要更新查询并为第一对添加 WHERE indexingGroup = 1,并创建一个新的索引器 + 数据源,它将使用 WHERE indexingGroup = 2.

处理第二个子集

因此,我假设第一对将使用上一次执行的 HighWaterMark 继续处理。而第二个新对将从头开始,因为 HighWaterMark 是 0.

是否有机会从 datasource/indexer 获取当前的 HighWaterMark 值,然后将其设置为另一个值?

UPD.1。场景

  1. 我们有数亿条不同类型的记录。每种类型都有自己的索引器(组)。有时我们会获得大量新数据,因此我们需要扩大规模。因为在 Azure 搜索中存在并行索引器的限制(而且它非常低),在我们的测试中我们发现一些索引器永远不会启动,因为旧的索引器不会停止 24 小时。所以我们的想法是能够以编程方式平衡索引器计数。

  2. 正如我们不久前遇到的那样,现在我们正在试验不同数量的索引器。在我们当前的方法中,我们使用 ID 作为分区键,因此每个分区没有专用的索引器。

  3. 一个不常见的(每月+)场景是在有限的时间内索引 200M+ 项目。为此,我们需要添加最大数量的索引器,完成索引,然后缩小规模。之后,我们每天一次有 10-20M 条记录,每个索引器大约有 3M/h 的项目。对于其他类型,我们有要处理的实时数据流(Cosmos DB upsert 吞吐量为 10-100K)。所以主要的平衡是在这个大数据块和流媒体之间。但我们也有非常小的索引器,它们应该在最短的时间内完成(就 Cosmos/Search SLA 功能而言接近实时)

您可以从索引器的最后完成 运行 中获取高水位标记值 finalTrackingState 在索引器执行结果上。该值只能通过 Indexer Reset 清除一个值,不能设置为特定值。但是,您可以通过创建或重置索引器然后更改数据源查询以也包括高水位标记值来实现从特定高位标记 运行ning 的相同效果,例如:

WHERE indexingGroup = <1..N> AND _ts >= @HighWaterMark AND _ts >= _LiteralAsCInt64(1579295473)

如果您这样做,如果您希望索引器从头开始,请记住在重置索引器时从查询中删除该值。此外,在缩小时一定要使用每个索引器的最小 finalTrackingState 以确保您不会错过任何文档。

我在 Azure 认知搜索团队工作,想详细了解您的方案。几个问题。

  1. 为什么需要动态缩放索引器? (而不是总是使用分区索引器)
  2. 如何确定indexingGroup的值? (对数据进行分区)
  3. 您的场景需要什么样的索引吞吐量? (分区索引器数量的上限)