【问题标题】:ElasticSearch index deletionElasticSearch 索引删除
【发布时间】:2015-11-13 20:37:32
【问题描述】:

我正在使用 Java API 从 ElasticSearch 中删除旧索引。

Client client = searchConnection.client

DeleteIndexResponse delete = client.admin().indices().delete(new DeleteIndexRequest('location')).actionGet();

在删除期间集群变红一分钟并且没有索引新数据 - 原因“缺少索引/副本等”。

我如何告诉 ElasticSearch 我将删除它们以防止出现“红色状态”?

【问题讨论】:

  • 您还有哪些其他进程将数据贡献到 ES 中?
  • 另一个过程 - 将数据插入新索引

标签: java elasticsearch


【解决方案1】:

您可以使用aliases 来从下面的真实索引中抽象出来。这个想法是从别名中读取并写入别名。这样您就可以创建一个新索引,将写入别名交换为新索引(这样索引过程不会中断),然后删除旧索引。就流程而言,它会是这样的:

上下文:您当前的location 索引具有location_active 别名,索引进程写入location_active 别名而不是直接写入location 索引。

第 1 步:创建新的location_112015 索引

curl -XPUT localhost:9200/location_112015

第 2 步:将“旧”location 索引中的 location_active 别名替换为第 1 步中创建的“新”索引

curl -XPOST 'http://localhost:9200/_aliases' -d '{
    "actions" : [
        { "remove" : { "index" : "location", "alias" : "location_active" } },
        { "add" : { "index" : "location_112015", "alias" : "location_active" } }
    ]
}'

请注意,此操作是原子操作,因此如果索引进程不断向location_active 发送新文档,它将是透明的,不会丢失任何文档,也不会引发错误。

第 3 步:删除旧索引

curl -XDELETE localhost:9200/location

第 4 步:冲洗并根据需要经常重复

注意:这些操作也可以通过 Java 客户端库轻松执行。

【讨论】:

  • 我每天都写入新索引,并删除超过 1 周的索引。当我执行 DELETE - 集群关闭一分钟。我可以以某种方式更改删除的优先级 - 所以它不会影响那么多的集群索引率吗?
  • 我每天删除大约 40 个索引,一一删除 - 这些中大约有 1.3 亿个事件
  • 删除是同步操作,我不确定优先级对这里有什么帮助,当你删除索引时,它就消失了,没有办法在没有索引发生时安排删除。我上面描述的别名解决方案允许您以透明的方式同时执行(删除和索引)而无需停机。
  • 我不会写入要删除的索引,也不会使用别名。当我执行 DELETE 时 - 它需要 6-7k IOPS,并且正在发送数据的应用程序 - 在删除期间无法发送任何数据。看起来我需要在删除每个索引后添加一些睡眠时间
  • 你试过先关闭索引再删除吗?
猜你喜欢
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 2018-07-23
  • 1970-01-01
相关资源
最近更新 更多