在生产环境中,忽然客户现场执行数据修改,出现无法成功的问题,开始以为是调用接口出现异常,通过监控发现实际为调用es出现了异常:update Trying to create too many scroll contexts
Trying to create too many scroll contexts. Must be less than or equal to: [2012345678]. This limit can be set by changing the [search.max_open_scroll_context] setting.
执行的sql
POST intrusion_att_cks.new.pro.xxxxxx/_update_by_query
{
"script": {
"source": "ctx._source.current_state=params.current_state; ctx._source.disposal_at=params.disposal_at;",
"params": {
"current_state": 13,
"disposal_at": "2023-12-26T12:00:00"
},
"lang": "painless"
},
"query": {
"bool": {
"must": [
{
"terms": {
"_id": [
"11111111"
]
}
}
]
}
}
}
问题定位
- 开始以为是确实在使用过程中未对scroll进行有效回收出现导致的,通过一下命令可以进行查看当前是否存在已经打开了的scroll,但是未进行有效关闭的:
GET /_nodes/stats/indices/search
重点关注这两个参数是否存在大于0的情况,如果是有的话,代码中可能还是会存在未进行有效关闭scroll
此时查看我的实际是没有这种情况的,但是还是会抛出异常
- 查看是否max_open_scroll_context 设置的过小导致的,通过以下命令进行查看具体的设置
GET /_cluster/settings
{
"persistent" : {
"search" : {
"max_open_scroll_context" : "2012345678"
}
},
"transient" : {
"search" : {
"max_open_scroll_context" : "2012345678"
}
}
}
发现其值大小也比较大,正常的update也不会出现这个问题,排除此问题
- 尝试是否是当前index的配置存在了什么问题,而导致出现异常,但是使用其他index进行修改,同样也是会出现这个错误(因为是生产,处理还是需要谨慎),排除此问题
问题解决
最后通过百度查找看是否存在有同类型的问题,但是大部分的都是以修改数量来进行解决,但是由于是生产,而且我们的现象表现的并没有占用,所以还是想要知道最终的问题是在哪里。
后面在elasticsearch的官方iuss中找到了遇到相同的问题,发现当前实际在6.9版本时候已经出现该bug,但是一直到7.7之后才修复完成,立马我这边查看我的es版本,发现果然是7.6.2的版本,而且大部分遇到该问题的用户也都是使用的7.6.2的版本出现的。
使用以下命令查看当前版本
GET /
{
"name" : "es-03",
"cluster_name" : "prod-escluster",
"cluster_uuid" : "RMgBIu7nTHaRDv3c8mNrEw",
"version" : {
"number" : "7.6.2",
"build_flavor" : "de1fault",
"build_type" : "tar",
"build_hash" : "e132eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
github issues地址:https://github.com/elastic/elasticsearch/issues/71618
解决方案
- 升级到7.7以后版本可以彻底解决
- 临时调整max_open_scroll_context大小
# 使用该调整大小
PUT /_cluster/settings
{
"persistent": {
"search.max_open_scroll_context": 2152345678
},
"transient": {
"search.max_open_scroll_context": 2152345678
}
}
- issues中有提到可以重启es解决,临时解决(未验证)
胡乱猜想:有可能是该数量在代码中也存在计数,然后在判断的过程中直接使用内存中的数据做了处理,提现可能就是在业务量不大的情况或者以及数据量不大的情况下,前期比较难以提现处理,毕竟目前我的配置是20亿的数据,也算不能轻易到达,然后重启之后可能存在将计数进行重置,所以有能够继续使用,未看实际提交的代码,所以仅个人猜想。