Elasticsearch Serverless FAQ

更新时间:
复制 MD 格式

本文介绍使用Elasticsearch Serverless服务时,可能遇到的高频问题。

报错问题一

  • 报错内容:"app storage exceed limit, app current size: xx GB app limit size: yy GB refer to: MAX_STORAGE_PER_CU and maxCu"

  • 报错原因:当前App的存储容量已经达到上限。

  • 解决方案:

    • 调整CU上限(MaxCU)会自动放宽存储容量。默认每 CU 对应存储容量上限为 50 GB(max_storage_per_cu),例如 2 CU 应用存储容量上限默认 100 GB。

    • 调整 max_storage_per_cu 可调整上述每 CU 对应的存储容量上限。

      说明

      调大 max_storage_per_cu 的值会导致查询和写入性能下降,请谨慎调整。

报错问题二

  • 报错内容:"index storage exceed limit, index current size: xx GB index limit size: yy GB refer to: index storage"

  • 报错原因:当前索引的存储容量已经达到上限。

  • 解决方案:

    • 可调整索引存储大小来放宽存储容量限制。

    • 可调整MAX_STORAGE_PER_INDEX并新建索引。

      说明
      • 对于读多写少的场景,推荐调整MAX_STORAGE_PER_INDEX并新建索引,使用别名关联旧索引,将数据写入到新索引中。

      • MAX_STORAGE_PER_INDEX仅对新建索引生效。

报错问题三

  • 报错内容:查询时报错 too_many_clauses 或提示 maxClauseCount / max_terms_count 超限。

  • 报错原因:ES Serverless 不支持调大 maxClauseCount 和 max_terms_count 参数,两者的最大限制均为 1024。当查询中 Bool Query 的 should 子句数量或 terms 查询的词项数量超过该限制时,会触发此报错。

  • 解决方案:

    可通过以下方式优化查询逻辑,避免超限:

    • 方案一:使用 terms 查询替代 bool should 子句

      将循环构建的 bool should 子句替换为 terms 查询。terms 查询在 Lucene 层面通常只算 1 个子句,默认上限为 65,536 个值,远高于 maxClauseCount 的 1024 限制。示例:

      
      {
        "terms": {
          "key.keyword": ["value1", "value2", "value3"]
        }
      }
      
    • 方案二:拆分查询

      将庞大的词项数组切分为多个小数组(每组不超过 1024 个词项),通过 Bool Query 的 should 子句组合多个子查询的结果。

    • 方案三:使用 Terms Lookup 机制

      从另一个索引的文档中提取字段值作为查询条件,避免在请求中硬编码传递大数组。

    若业务场景必须调大 maxClauseCount 或 max_terms_count 的限制,建议迁移至 ES PaaS 版本,PaaS 版本支持自定义调整这些参数。

报错问题四

  • 报错内容:查询请求返回 HTTP 429(Too Many Requests),提示 MAX_CONCURRENT_SEARCH 超限,或返回如下限流信息。

    
    limited by {限制项}(xxxxxx_xxxxxxx) threshold:[{限流值}]
    
  • 报错原因:客户端同时发起的搜索请求数超过了应用的查询并发度限制 max_concurrent_search(入门版默认值为 5,企业版存在该限制但不展示在控制台),超出上限的请求会被限流。

    说明

    max_concurrent_search 不展示在服务配额页面,也无法在控制台提交修改限制值的申请。各限制项的默认值请参见应用配额与服务限制文档。

  • 解决方案:

    1. 降低客户端的并发请求数量,并确保客户端具备请求重试机制。重试时应采用指数退避策略(以逐渐延长的间隔重试请求),避免瞬时重试进一步加剧限流。

    2. 合并小查询,使用 _msearch 批量接口替代多次单独查询,减少并发请求数。

    3. 优化长耗时查询,缩短单次请求的占用时间,减少并发堆积。

    4. 评估是否提高 CU 弹性区间(quota_CU_range):CU 决定了应用可承接的 QPS 与并发查询能力,突发流量场景建议适当调高 CU 弹性区间的下限以预留资源。

    5. 若业务并发确实需要更高的上限,请提交工单评估。

      说明

      提高并发上限不一定能改善整体吞吐,建议先确认单次查询的耗时是否已优化。

常见问题一

  • 问题描述:如何在 ES Serverless 的 Kibana 中添加自定义用户?为什么在 Stack Management 中看不到 Security 菜单?

  • 解决方案:

    添加自定义用户

    1. 登录 Kibana,在左侧导航栏进入 Stack Management > Security > Roles。

    2. 单击创建角色,配置所需权限(如 manage、kibana_system 等)。

    3. 进入 Stack Management > Security > Users 页面,单击创建用户。

    4. 填写用户名和密码,并绑定步骤 2 中创建的角色。

    Security 菜单不可见

    如果在 Stack Management 中看不到 Security 菜单,或菜单下的功能被禁用,说明当前登录账号的权限不足。请使用创建应用时设置的管理员账号登录 Kibana,该账号具备创建 Role 和 User 的管理权限。

常见问题二

  • 问题描述:在 ES Serverless 中创建索引时,出现 ElasticsearchWarning: current index has max storage limit which can be confirmed in aliyun console 告警,是否影响使用?

  • 问题原因:该告警为预期行为,不影响索引创建和使用。ES Serverless 对每个索引设置存储上限,创建索引时系统会返回此告警提示当前索引存在最大存储限制。索引仍会正常创建,可通过 _cat/indices API 确认索引状态为 green。

  • 存储上限说明:ES Serverless 按分片设置存储上限。单个分片默认存储上限为 20 GB(max_storage_per_shard),单索引存储上限 = 主分片数 × max_storage_per_shard。需要更大的单索引存储时,可增加主分片数,或调大 max_storage_per_shard(调大分片存储上限会影响读写性能)。应用级存储上限默认 100 GB,等于固定 CU 配额(MaxCU)× 每 CU 存储上限(max_storage_per_cu,默认 50 GB),可通过调大 max_storage_per_cu 或提高 MaxCU 修改。在阿里云控制台 ES Serverless 应用详情页可查看当前存储用量和上限配置。