【问题标题】:Best practices for ElasticSearch initial bulk importElasticSearch 初始批量导入的最佳实践
【发布时间】:2018-05-17 15:10:45
【问题描述】:

我正在运行一个带有 ElasticSearch、Logstash、Filebeat 和 Kibana 的 docker 设置,灵感来自 Elastic Docker Compose。我需要将 15 GB og 日志文件初始加载到系统中(Filebeat->Logstash->ElasticSearch),但我遇到了一些性能问题。

似乎 Filebeat/Logstash 为 ElasticSearch 输出了太多工作。一段时间后,我开始在 ElasticSearch 中看到一堆这样的错误:

[INFO ][o.e.i.IndexingMemoryController] [f8kc50d] 现在限制分片 [log-2017.06.30] 的索引:段写入跟不上

我找到了这篇关于如何禁用 合并限制 的旧文档文章:https://www.elastic.co/guide/en/elasticsearch/guide/master/indexing-performance.html#segments-and-merging

PUT /_cluster/settings
{
    "transient" : {
        "indices.store.throttle.type" : "none" 
    }
}

但在当前版本(ElasticSearch 6)中,它给了我这个错误:

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "transient setting [indices.store.throttle.type], not dynamically updateable"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "transient setting [indices.store.throttle.type], not dynamically updateable"
  },
"status": 400
}

我该如何解决上述问题?

VM 有 4 个 CPU 内核(Intel Xeon E5-2650),ElasticSearch 分配有 4GB RAM,Logstash 和 Kibana 各有 1GB。使用“swapoff -a”禁用交换。 X-pack 和监控已启用。这个日志服务器我只有一个 ES 节点。这个初始批量导入是否需要多个节点?

EDIT1:

更改 number_of_replicasrefresh_interval 似乎使其性能更好。仍在测试中。

PUT /log-*/_settings
{
    "index.number_of_replicas" : "0",
    "index.refresh_interval" : "-1"
}

【问题讨论】:

  • 您的集群统计数据是什么(节点数、分片数、副本数、硬件类型)。您是否有任何其他统计信息,例如 iostat、JVM 统计信息等。您是否更改了任何其他设置?
  • @Egor 感谢您的推荐。我已经用其他信息更新了这个问题。
  • 您或许可以减少logstash 中的工作线程数量(启动时的-w 选项)。对于 elasticsearch,我记得你应该提供一半的可用 RAM,其余的留给文件系统(“将 Xmx 设置为不超过物理 RAM 的 50%”来自elastic.co/guide/en/elasticsearch/reference/master/…)。

标签: elasticsearch logstash filebeat


【解决方案1】:

瓶颈很可能是IO(你可以确认这个正在运行的iostat,如果你发布ES监控截图也会很有用),所以你需要减少它的压力。

默认 ES 配置会导致在批量加载期间生成许多索引段。要解决此问题,对于批量加载,请增加 index.refresh_interval(或将其设置为 -1) - 请参阅 doc。默认值为 1 秒,这会导致每 1 秒创建一个新段,同时尝试增加批量大小,看看是否有帮助。

此外,如果您使用旋转磁盘,请将 index.merge.scheduler.max_thread_count 设置为 1。这将只允许一个线程执行段合并,并减少段合并和索引之间的 IO 争用。

【讨论】:

  • 谢谢。请参阅我的 EDIT1 显示我正在执行的 PUT 请求以启用这些设置。有没有办法让 Elasticsearch 将这些设置应用于之后创建的索引?由于我只有一个节点,所以在完成批量导入后保留这些设置是否有意义?
  • 对于单节点集群来说,副本的数量并不重要——副本永远不会与主分片托管在同一个节点上。 index.refresh_interval 只能在批量加载期间为 -1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2010-12-30
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
相关资源
最近更新 更多