ElasticSearch初始批量导入的最佳实践

时间:2017-12-04 07:34:17

标签: elasticsearch logstash filebeat

我正在使用受Elastic Docker Compose启发的ElasticSearch,Logstash,Filebeat和Kibana运行Docker设置。我需要在系统中初始加载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_replicas refresh_interval 似乎可以让它表现更好。还在测试。

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

1 个答案:

答案 0 :(得分:2)

最有可能的瓶颈是IO(您可以确认此运行iostat,如果您发布ES监控屏幕截图也会很有用),因此您需要减轻压力。

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

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