【问题标题】:Elasticsearch 5 stuck reading from diskElasticsearch 5 卡住从磁盘读取
【发布时间】:2017-12-24 12:18:49
【问题描述】:

我有一个由 6 个节点组成的集群,其中 ES 5.44B 小文档 尚未编入索引。
文档以 ~9K 索引 进行组织,总计 2TB。索引的占用率从几 KB 到数百 GB 不等,它们被分片以使每个 分片小于 20GB

集群运行状况查询响应:

{
    cluster_name: "##########",
    status: "green",
    timed_out: false,
    number_of_nodes: 6,
    number_of_data_nodes: 6,
    active_primary_shards: 9014,
    active_shards: 9034,
    relocating_shards: 0,
    initializing_shards: 0,
    unassigned_shards: 0,
    delayed_unassigned_shards: 0,
    number_of_pending_tasks: 0,
    number_of_in_flight_fetch: 0,
    task_max_waiting_in_queue_millis: 0,
    active_shards_percent_as_number: 100
}

在向集群发送任何查询之前,它是稳定的,它每秒都会进行一次批量索引查询,其中包含 10 或数千个文档,没有问题。

一切都很好,直到我将一些流量重定向到这个集群。 一旦它开始响应大多数服务器开始以 250 MB/s 的速度从磁盘读取,导致集群无响应

奇怪的是我在 AWS 上克隆了这个 ES 配置(相同的硬件,相同的 Linux 内核,但不同的 Linux 版本),我没有问题: 注意:请注意,我在服务流量的服务器上一直拥有 40MB/s 的磁盘读取速度。

相关的 Elasticsearch 5 配置为:

  • Xms12g -Xmx12gjvm.options

我也用以下配置测试过,但没有成功:

  • bootstrap.memory_lock:true
  • MAX_OPEN_FILES=1000000

每台服务器有 16CPU 和 32GB 内存;有些有 Linux Jessie 8.7,其他有 Jessie 8.6;都有内核 3.16.0-4-amd64。

我用localhost:9200/_nodes/stats/indices/query_cache?pretty&human检查了每个节点上的缓存,所有服务器都有类似的统计数据:缓存大小、缓存命中、未命中和驱逐。

这似乎不是一个预热操作,因为在 AWS 克隆集群上我从来没有看到过这种行为,也因为它永远不会结束。
我在/var/log/elasticsearch/* 下找不到有用的信息。

我做错了吗?
为了解决这个问题,我应该改变什么?

谢谢!

【问题讨论】:

  • 我可以请你澄清一些事情吗?所以你有 6 台带有 Linux 的服务器,与 AWS 上的相同集群相比,AWS 上的性能还可以。您的服务器上的磁盘是什么?他们在旋转SSD吗? AWS 通常在网络上使用 SSD,它可能会带来差异。此外,主分片的数量看起来很可疑,请查看 ES 指南的这一部分:elastic.co/guide/en/elasticsearch/guide/current/… 这些分片是否很好地分布在集群中?谢谢。
  • 所有磁盘都有SSD。关于分片,我有大约 9000 个索引,其中只有 10 个被分片(无论如何,每个索引最多 16 个分片)。分片在整个集群中平衡良好。我有这个配置在 ES2.4 上工作(相同的分片,但每个索引的文档更少)。
  • 谢谢,所以您在从 ES 2.4 迁移到 5.4 时出现了这个问题?能否提供 es 2 和 5 中的部分映射(我知道这里有 9k 个字段,所以这里无法显示)?
  • 我会尝试 _nodes/hot_threads 看看 ES 在获取 stuck 时做了什么?

标签: java elasticsearch elasticsearch-5


【解决方案1】:

您可能需要减少用于搜索的线程数。 尝试使用 2 倍的处理器数量。在 elasticsearch.yaml 中:

threadpool.search.size:<size>

另外,对于 6 节点集群来说,这听起来分片太多。如果可能的话,我会尝试减少它。

【讨论】:

    【解决方案2】:

    HTTP 请求的最大内容。默认为 100mb

    servers start reading from disk at 250 MB/s making the cluster unresponsive - HTTP 请求的最大内容。默认为 100mb。 .如果设置为大于 Integer.MAX_VALUE,它将被重置为 100mb。

    这将变得无响应,您可能会看到与此相关的日志。检查索引的最大读取大小。

    检查Elasticsearch HTTP

    【讨论】:

      【解决方案3】:

      一些事情;

      1. 5.x 多年来一直是EOL,请紧急升级
      2. 你被严重过度分片

      对于第 2 点 - 你要么需要;

      1. 升级以处理这么多的分片,7.X 中的内存管理要好得多
      2. 通过重新索引减少分片数
      3. 添加更多节点来处理负载

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-19
        • 2012-11-05
        • 1970-01-01
        • 1970-01-01
        • 2014-02-13
        • 2010-12-17
        • 1970-01-01
        • 2015-03-21
        相关资源
        最近更新 更多