【问题标题】:Elasticsearch - Zero Downtime Reindex Without Second Reindex?Elasticsearch - 没有第二次重新索引的零停机时间重新索引?
【发布时间】:2020-04-17 16:08:36
【问题描述】:

当在 Elasticsearch 中为正在使用的更新繁重的索引重新编制索引时,我们首先执行初始重新编制索引。第一次重新索引完成后,我们更新别名以指向新索引。但是在执行第一次重新索引时,原始索引中的一些文档可能已经更新。因此,我们会执行第二次重新索引,以确保在第一次重新索引期间的更新能够到达新索引。

我做错了吗?在重新索引过程中,在重新索引过程中进入的更新是否会在重新索引结束时应用?

例如

如果我将users-v1 重新索引到users-v2 并且这需要6 个小时,那么userv-v1 中的许多文档将在重新索引完成时更新。如果我在第一个小时同步用户 John,并在第四个小时为 John 进行了更新,那么该更新是否也会应用于 users-v2?或者我是否需要在切换别名后执行第二次重新索引以确保更新成功?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您正在做正确的事,执行第二次重新索引是正确的做法。在第一次重新索引期间发生的更新不会自动应用。

    希望您有一个lastUpdatedDate 字段或类似的字段,以便在第二个重新索引中您可以提供一个查询来重新索引所有已更改的文档。

    要考虑的一件事是删除 - 默认情况下,第二次重新索引不会知道在第一次重新索引期间删除的文档。为了解决这个问题,您可以使用软删除(而不是删除,将文档标记为“已删除”),或者,如果可能,让删除客户端记录所有已删除的文档 ID,然后从目标索引中删除它们。

    【讨论】:

    • 我们正在使用软删除,但没有 last_updated_date 字段。我们一直在谈论添加一个,可能是时候硬着头皮实施它了。
    • 对于一个经常写入的大型数据集,这可能会使第二个重新索引运行时项目看起来好像刚刚消失。您可以将它们都添加到别名中,将新索引设置为 write_to_index,然后执行重新索引并在重新索引完成后删除初始别名。但是,这将显示重复项。因此,它可能会丢失项目或可能显示重复项。想不通。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2021-08-14
    • 1970-01-01
    相关资源
    最近更新 更多