【问题标题】:"[circuit_breaking_exception] [parent]" Data too large, data for "[<http_request>]" would be error"[circuit_breaking_exception] [parent]" 数据太大,"[<http_request>]" 的数据会出错
【发布时间】:2020-09-04 07:40:38
【问题描述】:

顺利工作了10个多月后,我在做简单的搜索查询时突然开始在生产中遇到这个错误。

{
  "error" : {
    "root_cause" : [
      {
        "type" : "circuit_breaking_exception",
        "reason" : "[parent] Data too large, data for [<http_request>] would be [745522124/710.9mb], which is larger than the limit of [745517875/710.9mb]",
        "bytes_wanted" : 745522124,
        "bytes_limit" : 745517875
      }
    ],
    "type" : "circuit_breaking_exception",
    "reason" : "[parent] Data too large, data for [<http_request>] would be [745522124/710.9mb], which is larger than the limit of [745517875/710.9mb]",
    "bytes_wanted" : 745522124,
    "bytes_limit" : 745517875
  },
  "status" : 503
}

最初,当我遇到此 circuit_break_exception 错误时,我在执行简单的术语查询时遇到此错误,为了调试它,我在 elasticsearch 集群上尝试了 _cat/health 查询,但仍然出现同样的错误,甚至最简单的查询 localhost:9200 给出相同的错误不确定集群突然发生了什么。 她是我的断路器状态:

"breakers" : {
        "request" : {
          "limit_size_in_bytes" : 639015321,
          "limit_size" : "609.4mb",
          "estimated_size_in_bytes" : 0,
          "estimated_size" : "0b",
          "overhead" : 1.0,
          "tripped" : 0
        },
        "fielddata" : {
          "limit_size_in_bytes" : 639015321,
          "limit_size" : "609.4mb",
          "estimated_size_in_bytes" : 406826332,
          "estimated_size" : "387.9mb",
          "overhead" : 1.03,
          "tripped" : 0
        },
        "in_flight_requests" : {
          "limit_size_in_bytes" : 1065025536,
          "limit_size" : "1015.6mb",
          "estimated_size_in_bytes" : 560,
          "estimated_size" : "560b",
          "overhead" : 1.0,
          "tripped" : 0
        },
        "accounting" : {
          "limit_size_in_bytes" : 1065025536,
          "limit_size" : "1015.6mb",
          "estimated_size_in_bytes" : 146387859,
          "estimated_size" : "139.6mb",
          "overhead" : 1.0,
          "tripped" : 0
        },
        "parent" : {
          "limit_size_in_bytes" : 745517875,
          "limit_size" : "710.9mb",
          "estimated_size_in_bytes" : 553214751,
          "estimated_size" : "527.5mb",
          "overhead" : 1.0,
          "tripped" : 0
        }
      }

我在这里Github Issue 发现了一个类似的问题,建议增加断路器内存或禁用它。但我不确定该选择什么。请帮忙!

Elasticsearch 6.3 版

【问题讨论】:

    标签: node.js elasticsearch


    【解决方案1】:

    经过更多研究,我终于找到了解决方案,即

    1. 我们不应该禁用断路器,因为它可能会导致 OOM 错误并最终可能导致 elasticsearch 崩溃。
    2. 动态增加断路器内存百分比很好,但它也是一个临时解决方案,因为在解决方案增加后的最后百分比也可能填满。
    3. 最后,我们有第三种选择,即增加整体 JVM 堆大小,默认情况下为 1GB,但建议在生产环境中应该在 30-32 GB 左右,也应该小于可用总内存的 50%。李>

    如需了解更多信息,请查看此处以了解生产环境中 elasticsearch 的良好 JVM 内存配置,Heap: Sizing and Swapping

    【讨论】:

    • 由于某种原因,您的链接指向过时的 ES 2.x 版本
    • 这适用于所有版本,但您可以通过此标题为堆大小设置的链接导航到最新版本,即elastic.co/guide/en/elasticsearch/reference/7.10/…。该文档包含许多其他设置,可帮助您配置良好的生产级 es 环境。
    • 是的,但在较新的版本中缺少导出环境变量部分,我认为它对我也不起作用
    • @RadioControlled, export ES_JAVA_OPTS="-Xms2g -Xmx2g",这是您在最近版本中设置堆大小的方式。这里的 2g 是 2GB。请记住,此大小不应超过总可用内存的一半。
    【解决方案2】:

    在我的例子中,我有一个包含大型文档的索引,每个文档都有 ~30 KB 和超过 130 个字段(嵌套对象、数组、日期和 ID)。 我正在使用这个 DSL 查询搜索所有字段:

    query_string: {
        query: term,
        analyze_wildcard: true,
        fields: ['*'], // search all fields
        fuzziness: 'AUTO'
    }
    

    因为全文搜索很昂贵。一次搜索多个字段的成本更高。计算能力昂贵,而不是存储。

    因此:

    query_string 或 multi_match 查询的目标字段越多, 慢一点。一种提高搜索速度的常用技术 fields 是在索引时将它们的值复制到单个字段中,并且 然后在搜索时使用此字段。

    请参考ELK docs,它建议在copy-to 指令的帮助下搜索尽可能少的字段。

    在我将查询更改为搜索一个字段后:

        query_string: {
            query: term,
            analyze_wildcard: true,
            fields: ['search_field'] // search in one field
        }
    

    一切都像魅力一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 2015-08-28
      • 2015-06-30
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多