【问题标题】:Rebuild index with zero downtime零停机重建索引
【发布时间】:2017-03-08 20:48:09
【问题描述】:

目前正在做某事,需要一些帮助。我将从 sql 数据库中填充一个弹性索引。将有一个来自 sql 数据库的初始完整重新索引,然后会有一个夜间作业,它将更新/删除/插入更新。

如果发生重大故障,我可能需要进行完整的重新索引。理想情况下,我希望零停机时间。我确实找到了一些关于创建别名等的文章,但这似乎是对字段映射的更多更新。我的情况是对源数据库中的数据进行完整的重新索引。我可以让数据将文档推送到弹性并且弹性只会更新现有索引,因为 id 会相同吗?还是我需要做点别的?

问候

伊斯梅尔

【问题讨论】:

    标签: elasticsearch nest


    【解决方案1】:

    对于零停机时间,您可以创建一个新索引,从您的数据库中填充它,然后使用别名从旧索引切换到新索引。步骤:

    1. 将您的主索引称为 main_index_1(或任何您喜欢的名称)
    2. 为那个名为 main_index 的索引创建一个别名

      curl -XPUT 'localhost:9200/main_index_1/_alias/main_index?pretty

    3. 将您的应用程序设置为指向此别名

    4. 创建一个名为 main_index_2 的新索引并从您的数据库中对其进行索引
    5. 切换别名指向新索引

      curl -XPOST 'localhost:9200/_aliases?pretty' -H 'Content-Type: application/json' -d { "actions": [ { "remove": { "index": "main_index_1", "alias": "main_index" }}, { "add": { "index": "main_index_2", "alias": "main_index" }} ] }

    【讨论】:

    • 酷,但是仅仅推高数据应该只是更新现有数据并且仍然保持索引向上所以停机时间也为 0?
    • 理论上是的,但您说的是重大失败。在这种情况下会失败什么?
    • 抱歉可能不好。我从 db 获得的数据更新必须在一个时间范围内被提取和推送。在那个时间范围之后,数据被新数据覆盖。如果在那段时间数据提取失败,那么我需要重建完整索引。但是,在重建期间,我希望索引仍然处于运行状态,即使它可能包含陈旧数据。
    • 如果看到陈旧数据没问题,你可以去更新现有的索引,这也不会导致任何停机。
    • 我发现那篇文章很有用(它还描述了读写别名):medium.com/craftsmenltd/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2017-01-06
    • 2017-01-10
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多