【问题标题】:ElasticSearch - Update or new index?ElasticSearch - 更新或新索引?
【发布时间】:2017-07-26 00:57:32
【问题描述】:

要求:

  • 单个 ElasticSearch 索引需要从每周删除的一堆平面文件中构建
  • 除了这个每周提要之外,我们还会获得间歇性差异文件,提供不属于原始提要的附加数据(插入或更新,不删除)
  • 将这些文件(每周完整提要或差异文件)解析并加载到 ElasticSearch 的时间不是很长
  • 连续两周收到的每周提要预计会有显着差异(删除、添加、更新)
  • 索引对于应用程序的运行至关重要,它需要接近零停机时间
  • 我们并不关心 Feed 中所做的确切更改,但我们需要能够回滚到以前的版本,以防当前加载由于某种原因而失败
  • 显而易见,搜索需要快速响应

鉴于这些要求,我们计划执行以下操作:

  1. 对于增量更新 (diff),我们可以使用批量 API 按原样插入或更新记录
  2. 对于完整更新,我们将重建一个新索引并交换此 post 中提到的别名。在回滚的情况下,我们可以恢复到之前的工作索引(如果回滚需要回几个版本,备份也会保留)

问题:

  1. 在重建索引时,这是最好的方法还是更好地使用内置版本控制对先前创建的索引上的 CRUD 文档?
  2. 修改数据(删除、更新)对底层 lucene 索引/分片有什么影响?修改会导致碎片化或效率低下吗?

【问题讨论】:

    标签: search elasticsearch lucene


    【解决方案1】:
    1. 乍一看,我会说您的整体方法是合理的。如果需要,每周使用新数据创建一个新索引并交换别名是一个好方法

      • 零停机时间和
      • 能够以任何原因回滚到以前的索引

    如果您只保留一个索引并在其中对文档进行 CRUD,那么如果出现任何问题,您将无法回滚,并且您最终可能会处于当前一周的数据和本周的数据混合状态早一点。

    1. 每次更新(甚至是单个字段)或删除文档时,之前的版本都会在底层 Lucene 段中标记为已删除。当 Lucene 段变得足够大时,ES 将合并它们并清除已删除的文档。但是,就您而言,由于您每周都创建一个索引(并最终从前一周删除该索引),因此您不会遇到空间和/或碎片问题。

    【讨论】:

    • 他的数据每周肯定是相似的,每周创建一个类型是不是很糟糕?(例如week1,week2...等)而不是创建完整的索引每次都是
    • @asettouf 查看其他答案:stackoverflow.com/questions/45204579/…(提示:类型正在消失)
    • 再次感谢 Val :) 关于碎片的问题是针对在现有索引上执行 CRUD 的场景。换句话说,我试图看看坚持单个索引并对其进行批量更新和删除是否还有其他缺点(使 ES 努力跟上数据组织,而用户正在为数据敲击索引)
    • 使用单一索引时,很难保证您的数据始终保持一致,尤其是当您的每周批量更新在中途崩溃时。无论如何,假设您的每周更新总是成功,碎片可能永远不会成为问题。但同样,it depends 关于我们正在讨论的文件数量、您的硬件规格等
    猜你喜欢
    • 1970-01-01
    • 2016-11-09
    • 2017-03-11
    • 2017-02-27
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    相关资源
    最近更新 更多