配置Elasticsearch集群大查询隔离
场景描述
大查询隔离支持对查询请求进行独立管理,将高内存、长耗时的查询请求进行隔离,保证节点内存安全。在节点堆内存使用率过高时,触发中断控制程序,根据选择的中断策略将其中一条大查询请求进行中断,取消其正在运行的查询任务。大查询隔离同时支持全局查询超时配置,用户可实时配置所有查询请求的超时时间,中断超时查询请求。
- 部分查询占用了很高的节点堆内存,导致机器频繁Garbage Collect,甚至引发OOM异常。
- 频繁Garbage Collect导致节点脱离,查询迟迟无法响应甚至失败。
- 查询量过大导致CPU爆满,线上业务受到影响。
约束限制
仅Elasticsearch 7.6.2、Elasticsearch 7.10.2集群支持大查询隔离。
配置大查询隔离
大查询隔离特性和全局超时特性默认关闭,用户可根据需要实时配置,配置后立即生效。
- 登录云搜索服务管理控制台。
- 在“集群管理”页面,选择待配置大查询隔离的集群,单击操作列“Kibana”,登录Kibana界面。
- 在Kibana的左侧导航中选择“Dev Tools”,执行如下命令开启大查询隔离和全局查询超时的特性开关。
PUT _cluster/settings { "persistent": { "search.isolator.enabled": true, "search.isolator.time.enabled": true } }
以上两个开关是独立功能,当开关打开后,支持配置的参数请参见表1。
表1 大查询隔离和全局超时的参数配置 特性开关
配置参数
参数说明
search.isolator.enabled
search.isolator.memory.task.limit
search.isolator.time.management
单个分片查询任务被定义为大查询任务的阈值。
search.isolator.memory.pool.limit
search.isolator.memory.heap.limit
search.isolator.count.limit
触发隔离池内查询任务中断的阈值。
说明:参数“search.isolator.memory.heap.limit”定义了节点实际堆内存的使用限制,包括写入和查询等操作,超过限制时将选取隔离池内的大查询任务进行中断。
search.isolator.strategy
search.isolator.strategy.ratio
中断隔离池中某一条查询任务的选取策略。
search.isolator.time.enabled
search.isolator.time.limit
全局查询任务超时设置。
- 配置大查询隔离。
- 执行如下命令,设置单个分片查询任务被定义为大查询任务的阈值。
PUT _cluster/settings { "persistent": { "search.isolator.memory.task.limit": "50MB", "search.isolator.time.management": "10s" } }
表2 参数说明 参数名
数据类型
说明
search.isolator.memory.task.limit
String
查询任务用于聚合等操作向节点申请的大内存,申请内存超过此阈值将进行隔离观察。
- 取值范围:0b~节点最大堆内存
- 默认值:50MB
说明:可以通过如下命令查询集群堆内存使用情况和最大值。
GET _cat/nodes?&h=id,ip,port,r,ramPercent,ramCurrent,heapMax,heapCurrent
search.isolator.time.management
String
查询任务创建至今的时长(即开始使用集群资源进行查询),超过阈值将被隔离观察。
- 取值范围:≥ 0ms
- 默认值:10s
- 执行如下命令,触发隔离池内查询任务中断的阈值。
PUT _cluster/settings { "persistent": { "search.isolator.memory.pool.limit": "50%", "search.isolator.memory.heap.limit": "90%", "search.isolator.count.limit": 1000 } }
表3 参数说明 参数名
数据类型
说明
search.isolator.memory.pool.limit
String
当前节点最大堆内存百分比,当隔离池所有大查询任务申请的内存超过此阈值将触发中断控制程序,取消执行隔离池其中一条大查询任务。
- 取值范围:0.0~100.0%
- 默认值:50%
search.isolator.memory.heap.limit
String
当前节点堆内存的实际使用阈值,当节点堆内存使用超过阈值百分比时触发中断控制程序,取消执行隔离池其中一条大查询任务。
- 取值范围:0.0~100.0%
- 默认值:90%
search.isolator.count.limit
Integer
当前节点隔离池的大查询任务数阈值,被观察的查询任务数超过此阈值将触发中断控制程序,不再接受新的大查询。如果继续触发大查询请求,则直接取消该请求。
- 取值范围:10~50000
- 默认值:1000
根据业务设置“search.isolator.memory.pool.limit”,“search.isolator.count.limit”参数时,可结合“search.isolator.memory.task.limit”,“search.isolator.time.management”两个参数控制查询任务进入到隔离池的数量。
- 执行如下命令,中断隔离池中某一条查询任务的选取策略。
PUT _cluster/settings { "persistent": { "search.isolator.strategy": "fair", "search.isolator.strategy.ratio": "0.5%" } }
参数名
数据类型
说明
search.isolator.strategy
String
触发中断控制程序时大查询选取的策略。根据策略选取一条查询进行中断。
说明:大查询隔离池每秒检查一次,直至堆内存下降到安全范围。
取值范围:fair、mem-first、time-first- mem-first策略是指触发中断时,选取隔离池中堆内存使用最大的一条查询任务进行中断。
- time-first策略是指触发中断时,选取隔离池中已运行时间最长的一条查询任务进行中断。
- fair策略是综合考虑内存和时间两种因素,如果分片查询的堆内存申请大小相差不超过“最大堆内存乘search.isolator.strategy.ratio”的大小,则认为时间较长的查询更应该中断。否则认为堆内存使用较大的查询更应该中断。
默认值:fair
search.isolator.strategy.ratio
String
fair策略的阈值,仅当“search.isolator.strategy”值为“fair”生效。综合考虑大查询的运行时间及内存,当大查询任务内存相差不超过此阈值时,考虑选取运行时间长的大查询进行中断。当查询内存相差超过此阈值时,选取大内存查询任务进行中断。
- 取值范围:0.0-100.0%
- 默认值:1%
- 执行如下命令,设置单个分片查询任务被定义为大查询任务的阈值。
- 配置全局查询超时。