处理索引的重大更改 - Amazon DynamoDB

处理索引的重大更改

OpenSearch 可以动态地向您的索引添加新属性。但是,在为给定键设置映射模板后,您需要采取其它措施来对其进行更改。此外,如果您的更改要求您重新处理 DynamoDB 表中的所有数据,则需要采取相应的步骤来启动新的导出。

注意

在所有这些选项中,如果您的 DynamoDB 表与您指定的映射模板存在类型冲突,您可能仍会遇到问题。确保启用死信队列(DLQ)(即使在开发环境中也是如此)。这样可以更轻松地了解在 OpenSearch 上将记录编入索引中时可能导致冲突的记录问题。

工作方式

下面简要概述了处理索引重大更改时所采取的操作。请参阅以下各节中的分步过程。

  • 停止并启动管道:此选项会重置管道的状态,并且管道将以新的完整导出重新启动。它是非破坏性的,因此它不会删除您的索引或 DynamoDB 中的任何数据。如果在执行此操作之前没有创建新的索引,则可能会看到大量版本冲突导致的错误,因为导出操作会尝试在索引中插入比当前 _version 版本更旧的文档。这些错误完全可以忽略。当管道停止时,您无需支付管道的费用。

  • 更新管道:此选项使用蓝/绿方法更新管道中的配置,而不会丢失任何状态。如果您对管道进行了重大更改(例如向现有索引添加新的路由、索引或键),则可能需要完全重置管道并重新创建索引。此选项执行完整导出。

  • 删除并重新创建索引:此选项会删除索引上的数据和映射设置。在对映射进行任何重大更改之前,应先执行此操作。它将破坏所有依赖该索引的应用程序,直至重新创建和同步索引。删除索引不会启动新的导出。只有在更新管道之后,才应删除索引。否则,可能会在更新设置之前重新创建索引。

删除索引并重置管道(以管道为中心的选项)

如果您仍处于开发中,这种方法通常是最快的选择。您将在 OpenSearch Service 中删除索引,然后停止并启动管道,启动所有数据的全新导出。这样可以确保与现有索引没有映射模板冲突,也不会丢失未完成处理的表中的数据。

  1. 通过 AWS Management Console、或结合 AWS CLI 或 SDK 使用 StopPipeline API 操作来停止管道。

  2. 用新的更改更新您的管道配置

  3. 通过 REST API 调用或通过 OpenSearch 控制面板删除您在 OpenSearch Service 中的索引。

  4. 通过控制台、或结合 AWS CLI 或 SDK 使用 StartPipeline API 操作来停止管道。

    注意

    这将启动新的完整导出,会产生额外费用。

  5. 监控是否存在任何意外问题,因为会生成新的导出来创建新索引。

  6. 确认该索引符合您在 OpenSearch Service 中的预期。

导出完成并恢复从流中读取后,您的 DynamoDB 表数据现在将在索引中可用。

重新创建索引并重置管道(以索引为中心的选项)

如果您需要在从 DynamoDB 恢复管道之前,在 OpenSearch Service 中对索引设计执行大量迭代,则此方法效果很好。当您想非常快速地迭代搜索模式,并且希望避免在每次迭代之间等待新的导出完成时,这对于开发很有用。

  1. 通过 AWS Management Console、或通过结合 AWS CLI 或 SDK 调用 StopPipeline API 操作来停止管道。

  2. 借助要使用的映射模板在 OpenSearch 中删除并重新创建索引。您可以手动插入一些示例数据,以确认您的搜索是否按预期进行。如果您的示例数据可能与 DynamoDB 中的任何数据存在冲突,请务必将其删除后再继续下一步。

  3. 如果您的管道中有索引模板,请将其删除或替换为在 OpenSearch Service 中创建的索引模板。确保索引的名称与管道中的名称相匹配。

  4. 通过控制台、或结合 AWS CLI 或 SDK 调用 StartPipeline API 操作来停止管道。

    注意

    这将启动新的完整导出,将会产生额外费用。

  5. 监控是否存在任何意外问题,因为会生成新的导出来创建新索引。

导出完成并恢复从流中读取后,您的 DynamoDB 表数据现在便在索引中可用。

创建新的索引并接收(在线选项)

如果您需要更新映射模板,但目前正在生产中使用索引,则此方法效果很好。这将创建一个全新的索引,在进行同步和验证后,您需要将应用程序切换至该索引。

注意

这将在流中创建另一个使用者。如果您还有其它使用者(如 AWS Lambda 或全局表),则可能会出现问题。您可能需要暂停对现有管道的更新,来创建加载新索引的容量。

  1. 使用新设置和不同的索引名称创建新管道

  2. 监控新索引是否存在任何意外问题。

  3. 将应用程序切换至新索引。

  4. 在验证一切正常后,停止并删除旧管道。

避免和调试类型冲突的最佳实践

  • 当存在类型冲突时,请务必使用死信队列(DLQ),其有助于更轻松地进行调试。

  • 始终使用带有映射的索引模板并设置 include_keys。虽然 OpenSearch Service 会动态映射新键,但这可能会导致出现意外行为(例如预期某些内容为 GeoPoint,但却创建为 stringobject)或错误(例如 number 混合了 longfloat 值)。

  • 如果您需要在生产环境中保持现有索引正常运行,也可以替换之前的任何删除索引步骤,只在管道配置文件中重命名索引。这将创建一个全新的索引。然后在完成后,您的应用程序需要更新,以指向新索引。

  • 如果您使用处理器修复了类型转换问题,则可以用 UpdatePipeline 对此进行测试。为此,您需要停止并启动或处理死信队列,以修复之前跳过的任何存在错误的文档。