elasticsearch ElasticSearch初始批量导入的最佳实践,elasticsearch,logstash,filebeat,elasticsearch,Logstash,Filebeat" /> elasticsearch ElasticSearch初始批量导入的最佳实践,elasticsearch,logstash,filebeat,elasticsearch,Logstash,Filebeat" />

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

elasticsearch ElasticSearch初始批量导入的最佳实践,elasticsearch,logstash,filebeat,elasticsearch,Logstash,Filebeat,我正在用ElasticSearch、Logstash、Filebeat和Kibana运行docker设置,灵感来自。我需要先将15GB的og日志文件加载到系统中(Filebeat->Logstash->ElasticSearch),但我在性能方面遇到了一些问题 似乎Filebeat/Logstash为ElasticSearch输出了太多的工作。一段时间后,我开始在ElasticSearch中看到一系列错误,如下所示: [INFO][o.e.i.IndexingMemoryController][

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

似乎Filebeat/Logstash为ElasticSearch输出了太多的工作。一段时间后,我开始在ElasticSearch中看到一系列错误,如下所示:

[INFO][o.e.i.IndexingMemoryController][f8kc50d]现在正在限制碎片的索引[]:段写入无法跟上

我发现了这篇关于如何禁用合并限制的旧文档文章:

但在当前版本(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
}
如何解决上述问题

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

EDIT1:

更改副本的数量和刷新间隔似乎可以使其性能更好。仍在测试中

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

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

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


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

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

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


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

您的群集统计信息是什么(节点数、碎片数、副本数、硬件类型)。您是否有任何其他统计信息,如iostat、JVM统计信息等。您是否更改了任何其他设置?@Egor感谢您的推荐。我已经用额外的信息更新了这个问题。您也许可以减少logstash中的工作线程数(-w选项在启动时)。对于elasticsearch,我记得您应该提供一半的可用RAM,剩下的留给文件系统(“将Xmx设置为不超过物理RAM的50%”)。您的集群统计数据是什么(节点、碎片、副本的数量,什么样的硬件)。您是否有任何其他统计信息,如iostat、JVM统计信息等。您是否更改了任何其他设置?@Egor感谢您的推荐。我已经用额外的信息更新了这个问题。您也许可以减少logstash中的工作线程数(-w选项在启动时)。对于elasticsearch,我记得您应该提供一半的可用RAM,剩下的留给文件系统(“将Xmx设置为不超过物理RAM的50%”。谢谢。请参阅我的EDIT1,其中显示我正在执行的PUT请求以启用这些设置。有没有办法让Elasticsearch将这些设置应用于之后创建的索引?在完成批量导入后,我是否有必要保留这些设置,因为我只有一个节点?对于单个节点群集,副本的数量并不重要-副本永远不会与主碎片托管在同一节点上。批量加载期间,index.refresh\u间隔应仅为-1。谢谢。请参阅我的EDIT1,其中显示我正在执行的PUT请求以启用这些设置。有没有办法让Elasticsearch将这些设置应用于之后创建的索引?在完成批量导入后,我是否有必要保留这些设置,因为我只有一个节点?对于单个节点群集,副本的数量并不重要-副本永远不会与主碎片托管在同一节点上。批量加载期间,index.refresh\u间隔应仅为-1。
PUT /log-*/_settings
{
    "index.number_of_replicas" : "0",
    "index.refresh_interval" : "-1"
}