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

dhr*_*hrm 1 elasticsearch logstash filebeat

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

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

[INFO][oeiIndexingMemoryController] [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" 
    }
}
Run Code Online (Sandbox Code Playgroud)

但在当前版本(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
}
Run Code Online (Sandbox Code Playgroud)

我该如何解决上述问题?

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

编辑1:

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

PUT /log-*/_settings
{
    "index.number_of_replicas" : "0",
    "index.refresh_interval" : "-1"
}
Run Code Online (Sandbox Code Playgroud)

Ego*_*gor 5

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

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

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