
# 配置大查询隔离
通过大查询隔离可以管理高内存或长耗时查询，保障OpenSearch集群稳定性并避免OOM异常。
随着业务规模扩大，OpenSearch集群面临的查询压力日益增加。部分复杂查询可能占用大量节点内存，导致机器频繁垃圾回收甚至发生OOM异常，严重影响集群性能和稳定性。为保障集群稳定运行，CSS服务提供了大查询隔离功能，帮助用户有效管理高内存、长耗时的查询请求。通过大查询隔离，可以解决以下问题：
- 隔离高内存/长耗时查询：将大查询任务单独管理，避免影响正常业务。
- 堆内存阈值触发中断：当节点堆内存使用率过高时，中断隔离池中的大查询。
- 全局超时控制：设置所有查询的超时时间，自动取消超时任务。
 
#### 功能介绍
- 定义大查询任务：
  - 追踪记录查询任务创建大数组对象的内存开销，当内存开销大于大查询任务标准时将其标记为大查询任务。
  
  - 周期检查各个查询任务运行时长，当查询任务运行时长大于大查询任务标准时将其标记为大查询任务。
   
- 中断策略：
  - fair策略：综合内存和时间选择中断目标。
  
  - mem-first策略：优先中断内存使用最大的任务。
  
  - time-first策略：优先中断运行时间最长的任务。
   
- 原生Cancel接口：使用OpenSearch原生的cancel接口中断查询任务，确保兼容性。
 
#### 约束限制
仅当OpenSearch集群版本号为2.19.0或3.4.0（镜像版本不低于3.4.0_26.6.0_xxx）时，才支持大查询隔离功能，且满足条件的集群**默认启用**该功能。大查询隔离功能中的全局超时特性默认关闭，如有需要可以通过API动态配置，配置完成后将立即生效。
#### 登录OpenSearch Dashboards
登录OpenSearch Dashboards进入命令执行页面。OpenSearch集群支持多种客户端访问，本文仅以CSS服务集成的OpenSearch Dashboards为例介绍配置指导。
1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
2. 在左侧导航栏，选择"集群管理 \> OpenSearch"。
3. 在集群列表，选择目标集群，单击操作列的"Dashboards"，登录OpenSearch Dashboards。
4. 在OpenSearch Dashboards左侧导航栏选择"Dev Tools"，进入操作页面。 控制台左侧是命令输入框，其右侧的三角形图标为执行按钮，右侧区域则显示执行结果。
   
 
#### 配置大查询隔离
大查询隔离会将大查询任务放入隔离池，隔离池任务会根据内存、时间阈值触发中断。大查询隔离的功能开关**默认开启**，用户可根据业务需求动态配置，配置后立即生效。
1. 执行如下命令，开启/关闭大查询隔离的功能开关。
   ```
   PUT _cluster/settings
   {
     "persistent": {
       "search.isolator.enabled": true
     }
   }
   ```
   表1大查询隔离开关的参数说明 
   | 参数                      | 类型      | 默认值  | 说明                                                                                                                                                                                                                                                                                                                                                                                                                         |
   |:---|:---|:---|:---|
   | search.isolator.enabled | Boolean | true | 大查询隔离功能开关，开启后可以将大查询任务单独管理，避免影响正常业务。 取值范围： - true：开启大查询隔离功能。  - false：关闭大查询隔离功能。   |
      
   
2. 执行如下命令，设置单个分片查询任务被定义为大查询任务的阈值。
   ```
   PUT _cluster/settings
   {
     "persistent": {
       "search.isolator.memory.task.limit": "50MB",
       "search.isolator.time.management": "10s"
     }
   }
   ```
   表2大查询阈值的参数说明 
   | 参数                                | 类型     | 默认值  | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   |:---|:---|:---|:---|
   | search.isolator.memory.task.limit | String | 50MB | 大查询任务内存阈值，用于控制查询任务申请的大内存，超过此阈值将被隔离观察。 取值格式：数字+单位 - 数字：自然数  - 单位：B、K、KB、M、MB、G、GB、T、TB、P、PB（不区分大小写）   最小值：0（所有查询都被隔离） 最大值：节点最大堆内存 如果将参数值调小，可能导致更多查询任务被纳入大查询隔离池，从而增加隔离池的内存占用比例。此时建议同步调整参数"search.isolator.memory.pool.limit"与"search.isolator.count.limit"，通过调大参数值以容纳更多查询任务，避免因资源不足触发熔断机制（如"查询请求被频繁熔断"）。 |
   | search.isolator.time.management   | String | 10s  | 查询时长阈值，用于控制查询任务执行时间（从开始使用集群资源进行查询算起），超过此阈值将被隔离观察。 取值格式：数字+单位 - 数字：自然数  - 单位：nanos(纳秒)、micros（微秒）、ms（毫秒）、s（秒）、m（分钟）、h（小时）、d（天）   最小值：0（所有查询都被隔离） 如果将参数值调小，可能导致更多查询任务被纳入大查询隔离池，从而增加隔离池的内存占用比例。此时建议同步调整参数"search.isolator.memory.pool.limit"与"search.isolator.count.limit"，通过调大参数值以容纳更多查询任务，避免因资源不足触发熔断机制（如"查询请求被频繁熔断"）。                             |
      
   
3. 执行如下命令，设置触发隔离池内查询任务中断的阈值。
   ```
   PUT _cluster/settings
   {
     "persistent": {
       "search.isolator.memory.pool.limit": "50%",
       "search.isolator.count.limit": 1000,
       "search.isolator.memory.heap.limit": "90%"
     }
   }
   ```
   表3任务中断阈值的参数说明 
   | 参数                                | 类型      | 默认值  | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   |:---|:---|:---|:---|
   | search.isolator.memory.pool.limit | String  | 50%  | 隔离池内存占用率阈值，表示隔离池所需内存占当前节点最大堆内存的百分比。当隔离池所有大查询任务申请的内存总和的占用率超过该阈值时，将触发中断控制程序，并根据预设策略取消隔离池中的一条大查询任务，以释放资源并防止内存溢出。 取值范围：0.0\~100.0% 如果集群中以大查询任务为主（内存占用高或执行时间长），可以适当调大本参数值，并结合参数"search.isolator.memory.task.limit"和"search.isolator.time.management"控制隔离池中的查询任务数量。                                                                                                                                                                                        |
   | search.isolator.count.limit       | Integer | 1000 | 隔离池查询数量阈值，表示当前节点的隔离池中大查询任务的最大数量。当隔离池中被隔离的大查询任务数量超过此阈值时，将触发中断控制程序，不再接受新任务到隔离池，以防止资源耗尽。 取值范围：10\~50000 如果集群中以大查询任务为主（内存占用高或执行时间长），可以适当调大本参数值，并结合参数"search.isolator.memory.task.limit"和"search.isolator.time.management"控制隔离池中的查询任务数量。                                                                                                                                                                                                                  |
   | search.isolator.memory.heap.limit | String  | 90%  | 堆内存使用率阈值，表示当前节点堆内存的使用率。当节点实际堆内存使用率超过该阈值时，将触发中断控制程序，并根据预设策略取消隔离池中的一条大查询任务，以释放资源并防止内存溢出。 取值范围：0.0\~100.0% 在启用indices.breaker.total.use_real_memory时，本参数值必须小于indices.breaker.total.limit才能生效。否则，系统将优先触发OpenSearch原生的熔断机制。详细请参见[Circuit breaker settings](https://docs.opensearch.org/latest/install-and-configure/configuring-opensearch/circuit-breaker/)。 当集群可能存在流量高峰或浪涌时，可适当调小本参数值，以更早触发熔断机制，防止堆内存过载。 |
      
   
4. 执行如下命令，设置中断策略。
   ```
   PUT _cluster/settings
   {
     "persistent": {
       "search.isolator.strategy": "fair",
       "search.isolator.strategy.ratio": "0.5%"
     }
   }
   ```
   表4中断策略的参数说明 
   | 参数                             | 类型     | 默认值  | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   |:---|:---|:---|:---|
   | search.isolator.strategy       | String | fair | 查询中断策略，用于定义触发中断控制程序时选取查询任务的策略。 - fair：综合考虑内存和运行时间，如果查询内存差异≤"OpenSearch进程的最大堆内存 x fair策略的阈值"，则优先中断运行时间长的查询；如果查询内存差异\>"OpenSearch进程的最大堆内存 x fair策略的阈值"，则优先中断内存占用大的查询。其中OpenSearch进程的最大堆内存为"min(31, 节点总内存/2) "，单位是GB。  - mem-first：优先中断内存占用最大的查询。  - time-first：优先中断运行时间最长的查询。   大查询隔离池每秒检查一次，直至堆内存下降到安全范围。 |
   | search.isolator.strategy.ratio | String | 1%   | fair策略的阈值，用于衡量内存差异与最大堆内存的比例关系。 - 当大查询任务的内存差异不大时，通过优先中断运行时间长的任务来维护公平性。  - 当大查询任务的内存差异显著时，通过优先中断内存占用高的任务能更有效地释放资源，最大化系统性能。   仅当"search.isolator.strategy"为"fair"时生效。 取值范围：0.0-100.0% 建议保持默认值或根据实际情况谨慎调整。                                                                                                                 |
      
   
5. 执行如下命令，设置大查询隔离日志中记录的被取消查询任务的最大数量。
   ```
   PUT _cluster/settings
   {
     "persistent": {
       "search.isolator.log.count": "100"
     }
   }
   ```
   表5参数说明 
   | 参数                        | 类型      | 默认值 | 说明                                                                                                                                                                                                                                                                                                                            |
   |:---|:---|:---|:---|
   | search.isolator.log.count | Integer | 100 | 控制大查询隔离日志中记录的被取消查询任务的最大数量。 当大查询隔离机制触发中断控制程序并取消某一大查询任务时，系统会将这些查询请求信息记录到日志中，用于分析和优化查询性能。当被取消的查询任务数量超过此阈值时，系统会自动删除最早的记录，仅保留最新的记录，从而避免日志文件无限增长，占用过多内存。 取值范围：0\~5000 0：表示关闭日志记录功能。 |
      
   通过以下接口可以查询被取消查询任务的日志信息：
   - 查询所有节点被取消查询任务的统计信息
     ```
     GET /_isolator_metrics
     ```
     
   
   - 查询指定节点被取消查询任务的统计信息
     ```
     GET /_isolator_metrics/{nodeId}
     ```
     
   
   - 查询所有节点被取消查询任务的详细信息
     ```
     GET /_isolator_metrics?detailed
     ```
     
   
   - 查询指定节点被取消查询任务的详细信息
     ```
     GET /_isolator_metrics/{nodeId}?detailed
     ```
     
   
   
   表6参数说明 
   | 参数      | 类型     | 默认值 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                  |
   |:---|:---|:---|:---|
   | node_id | String | 无   | 指定集群节点ID。 - 单个节点：直接输入节点ID。  - 多个节点：用英文逗号分隔多个ID。   节点ID可以通过如下命令获取： ``` GET _cat/nodes?s=n&h=n,id&v=true&full_id=true ``` |
      
   返回结果示例：
   ```
   {
     "_nodes": {
       "total": 1,
       "successful": 1,
       "failed": 0
     },
     "cluster_name": "test",
     "nodes": {
       "CTqrZFXWTzmLonSZyNMKkQ": {
         "name": "test-ess-esn-1-1",
         "host": "172.16.101.116",
         "total_cancel": 0,//被取消的查询任务总数
         "isolator_cancel": 0,//因超隔离池阈值被取消的查询任务个数
         "out_of_time_cancel": 0//因查询超时被取消的查询任务个数
       }
     }
   }
   ```
   
 
#### 配置全局超时控制
全局超时控制可以设置所有查询的超时时间，并自动取消超时任务（返回"cancel cause by global time limit"），以确保长时间运行的查询不会占用过多资源。全局查询超时的功能开关**默认关闭**，用户可根据业务需求动态配置，配置后立即生效。
执行如下命令，开启全局查询超时功能并设置全局查询超时时间。
```
PUT _cluster/settings
{
  "persistent": {
    "search.isolator.time.enabled": true,
    "search.isolator.time.limit": "110s"
  }
}
```
表7全局超时控制的参数说明 
| 参数                           | 类型      | 默认值   | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
|:---|:---|:---|:---|
| search.isolator.time.enabled | Boolean | false | 全局查询超时功能开关，开启后当查询任务超过全局查询超时时间，则自动取消超时任务。 取值范围： - true：开启全局查询超时功能。  - false：关闭全局查询超时功能。                                        |
| search.isolator.time.limit   | String  | 120s  | 全局查询超时时间，设置所有查询的超时时间，超过该时间则自动取消超时任务。 取值格式：数字+单位 - 数字：自然数  - 单位：nanos(纳秒)、micros（微秒）、ms（毫秒）、s（秒）、m（分钟）、h（小时）、d（天）   最小值：0（所有查询被取消） |
   
