elasticsearch 异常

max_open_scroll_context

异常日志:

{“shard”:0,“index”:"*_default_202111",“node”:“FjBZ-0PxQc-rvrTtYPmE1Q”,“reason”:{“type”:“exception”,“reason”:“Trying to create too many scroll contexts. Must be less than or equal to: [500]. This limit can be set by changing the [search.max_open_scroll_context] setting.”}}]},“status”:500}

解决思路:

  1. 日志出现在凌晨的统计功能上,该功能需要对es进行查询操作,且该操作为多线程执行
  2. 查询es的操作中,使用了 scroll 滚动机制,而从异常日志中可以判定应该是那一个瞬间的 scroll 超过es 的默认值500,但由于代码中已经设置了scroll的过期时间为1分钟,那可以尝试根据提示直接设置max_open_scroll_context 的值
/**
 * 查询
 *
 * @param queryBuilder 查询条件
 * @param sortBuilder  排序条件
 * @return 查询结果
 */
protected List<T> search(QueryBuilder queryBuilder, SortBuilder sortBuilder) {
    List<T> lstData = new ArrayList<>();

    try {
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(queryBuilder);
        sourceBuilder.size(10000);
        Optional.ofNullable(sortBuilder).ifPresent(sourceBuilder::sort);
        final Scroll scroll = new Scroll(TimeValue.timeValueMinutes(1L));
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(getIndexAlias());
        searchRequest.scroll(scroll);
        searchRequest.source(sourceBuilder);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        String scrollId = searchResponse.getScrollId();
        SearchHit[] searchHits = searchResponse.getHits().getHits();

        while (searchHits != null && searchHits.length > 0) {
            for (SearchHit hit : searchHits) {
                lstData.add(fromMap(hit.getSourceAsMap()));
            }

            SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
            scrollRequest.scroll(scroll);
            searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
            scrollId = searchResponse.getScrollId();
            searchHits = searchResponse.getHits().getHits();
        }

        ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
        clearScrollRequest.addScrollId(scrollId);
        client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
    } catch (Exception e) {
        throw new RuntimeException("elasticsearch search error:" + e.getMessage(), e);
    }
    return lstData;
}
  1. 将 max_open_scroll_context值设置为2000,后续跟踪日志后发现问题已经解决
PUT _cluster/settings
{
  "persistent": {
    "search.max_open_scroll_context": 2000
  },
  "transient": {
    "search.max_open_scroll_context": 2000
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值