当前位置: 首页 > 面试题库 >

ElasticSearch-如何将索引合并为一个索引?

程鸿畅
2023-03-14
问题内容

自几个月前以来,我的集群每天都有一个索引,每个索引有5个分片(默认),并且由于分片太多(超过1000个),我无法在整个集群上运行查询。

文档ID是自动生成的。

如何将索引合并为一个索引,处理有冲突的ID(甚至可能发生冲突)并更改类型?

我正在使用ES版本5.2.1


问题答案:

仅在使用ELK堆栈几个月并filebeat逐日创建索引后才可见的常见问题。这里有一些选项可以解决性能问题。

_forcemerge

首先,您可以_forcemerge用来限制Lucene索引中的段数。操作不会限制或合并索引,但会提高Elasticsearch的性能。

curl -XPOST 'localhost:9200/logstash-2017.07*/_forcemerge?max_num_segments=1'

这将贯穿整个月的索引并强制合并细分。每月完成一次后,它将大大提高Elasticsearch的性能。以我为例,CPU使用率从100%下降到2.7%。

不幸的是,这不能解决分片问题。

_reindex

_reindex在继续之前,请阅读文档并备份数据库。

正如tomas所提到的。如果要限制分片或索引的数量,除了_reindex将少数索引合并为一个索引外,别无选择。这可能需要一段时间,具体取决于您拥有的索引的数量和大小。

目的地索引

您可以预先创建目标索引并指定其应包含的分片数量。这将确保您的最终索引将包含您需要的分片数量。

curl -XPUT 'localhost:9200/new-logstash-2017.07.01?pretty' -H 'Content-Type: application/json' -d'
{
    "settings" : {
        "index" : {
            "number_of_shards" : 1 
        }
    }
}
'

分片数量限制

如果要限制每个索引的分片数量,则可以_reindex一对一运行。在这种情况下,不应删除任何条目,因为它将是精确的副本,但分片数量较少。

curl -XPOST 'localhost:9200/_reindex?pretty' -H 'Content-Type: application/json' -d'
{
    "conflicts": "proceed",
    "source": {
        "index": "logstash-2017.07.01"
    },
    "dest": {
        "index": "logstash-v2-2017.07.01",
        "op_type": "create"
    }
}
'

完成此操作后,您可以删除旧索引并使用新索引。不幸的是,如果您想使用旧名称,则需要多花_reindex一点时间使用新名称。如果您决定这样做

不要忘记指定新索引的数量!默认情况下,它将恢复为5。

合并多个索引并限制分片数量

curl -XPOST 'localhost:9200/_reindex?pretty' -H 'Content-Type: application/json' -d'
{
    "conflicts": "proceed",
    "source": {
        "index": "logstash-2017.07*"
    },
    "dest": {
        "index": "logstash-2017.07",
        "op_type": "create"
    }
}
'

完成后,你应该有所有的条目logstash-2017.07.01logstash-2017.07.31合并成logstash-2017.07。请注意,旧索引必须手动删除。

一些条目可以覆盖或合并,这取决于它conflictsop_type你选择的选项。

进一步的步骤

使用一个分片创建新索引

您可以设置将在每次创建新索引时使用的索引模板logstash

curl -XPUT 'localhost:9200/_template/template_logstash?pretty' -H 'Content-Type: application/json' -d'
{
    "template" : "logstash-*",
    "settings" : {
        "number_of_shards" : 1
    }
}
'

这将确保创建的每个logstash-名称匹配的新索引都只有一个分片。

按月分组日志

如果您没有流太多日志,则可以设置logstash按月分组日志。

// file: /etc/logstash/conf.d/30-output.conf

output {
    elasticsearch {
        hosts => ["localhost"]
        manage_template => false
        index => "%{[@metadata][beat]}-%{+YYYY.MM}"
        document_type => "%{[@metadata][type]}"
    }
}

最后的想法

解决初始配置错误并不容易!通过优化您的elasticsearch祝您好运!



 类似资料:
  • 问题内容: 我用映射创建了一个新索引。其中存储了500 000个文档。 我想更改索引的映射,但是在elasticsearch中是不可能的。所以我用新的新映射创建了另一个索引,现在我正尝试将文档从旧索引复制到新索引。 我正在使用扫描和滚动类型从旧索引中检索文档并将其复制到新索引。复制需要花费更多时间,并且系统运行缓慢。 下面是我正在使用的代码。 问题答案: 您不必编写类似的代码。周围有一些出色的工具

  • 我们将数据导入到elasticsearch集群中的索引很少,每个索引约为10GB。 同时,我们关心对现有索引的搜索,很少是小的-100MB,也很少是大的-10GB。 根据这些文章和拉请求,我们不应该接触合并设置在所有。 在这里非常困惑,任何帮助都非常感谢。

  • 问题内容: 我在同一台Ubuntu服务器上有一个Rails 3应用程序的暂存和生产实例(使用tyre gem)。看来这两个实例都共享相同的elasticsearch索引,这显然不是我想要的。 如何使生产和登台实例使用单独的实例? 问题答案: 您需要覆盖索引名称。假设您要绑定ActiveRecord,它将根据相关模型创建索引名称。您可以使用这样的前缀来调整名称; 然后会创建一个名为的索引,以此类推。

  • 合并两个已有的索引比重新对所有数据做索引更有效率,而且有时候必须这样做(例如在“主索引+增量索引”分区模式中应合并主索引和增量索引,而不是简单地重新索引“主索引对应的数据)。因此indexer有这个选项。合并索引一般比重新索引快,但在大型索引上仍然不是一蹴而就。基本上,待合并的两个索引都会被读入内存一次,而合并后的内容需要写入磁盘一次。例如,合并100GB和1GB的两个索引将导致202GB的IO操

  • 问题内容: 现在,我有几个Lucene索引集(我称为分片),它们为不同的文档集建立索引。它们是独立的,这意味着我可以对它们中的每一个执行搜索,而无需阅读其他文件。然后我得到一个查询请求。我想在每个索引集上搜索它,并将结果组合起来以形成最终的顶级文档。 我知道在对文档评分时,Lucene需要知道每个术语的< idf >,并且不同的索引集将为同一术语赋予不同的< idf (因为不同的索引集持有不同的文

  • 问题内容: 我想知道Elasticsearch是否需要先定义复合索引。通过复合索引,我的意思是像mongodb一样。 db.collection.ensureIndex({field1:1,field2:1,field3:1}) 或类似mysql db的东西。 在mytable(field1,field2,field3)上创建索引adhoc_index; 所以我要处理的数据非常平坦(大多数只是cs