
# 配置读写流控策略2.0
通过流量控制策略管理Elasticsearch集群的读写流量，保障集群稳定性并防止异常流量冲击。
在Elasticsearch集群中，突发流量、恶意访问或资源竞争可能导致节点过载甚至崩溃。流量控制策略通过限制客户端访问、反压写入流量、统计分析流量行为，实现集群资源的合理分配和风险防控，适用于以下场景：
- 高并发写入场景：避免大请求涌入导致节点内存溢出。
- 安全防护场景：通过黑白名单限制非法IP访问。
- 流量异常响应场景：一键断流快速应对突发流量冲击。
- 性能调优场景：通过统计分析优化流控配置阈值。
 
#### 功能介绍
表1流量控制策略介绍 
| 策略           | 原理介绍                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 相关文档                                                                                                                                                                                                                                                                                                                                                                                 |
|:---|:---|:---|
| HTTP/HTTPS流控 | 通过黑白名单、并发连接数和新建连接速率限制，控制客户端访问流量。 - 黑白名单控制：白名单优先于黑名单，如果IP同时存在于两者，白名单生效。被黑名单阻断的连接将直接中断，不处理任何请求。  - 并发连接数限制：限制节点能够处理的HTTP连接总数，防止连接数激增。  - 新建连接数限制：限制每秒新建连接数，通过"预热时间"（warmup_period）平滑流量增长。   启用HTTP/HTTPS流控后，黑名单中的IP连接会被直接拒绝；对于既不在白名单也不在黑名单中的IP连接，当其并发连接数或新建连接数达到设定的阈值时，系统也会拒绝其连接请求；而白名单中的IP连接不受流控限制，可正常访问。 | [配置HTTP/HTTPS流控]                                                                                                                                                                                                                                                                                                                |
| 内存流控         | 当堆内存使用率超过阈值（如80%），暂停大请求读取，触发垃圾回收（GC）释放内存。 通过反压因子（in_flight_factor）和最大延迟时间（max）控制写入流量强度。 启用内存流控后，在集群内存负载超过设置的阈值时，大请求可能会被长时间挂起。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | [配置内存流控]                                                                                                                                                                                                                                                                                                                       |
| 一键断流         | 切断所有非白名单的客户端连接（Kibana访问和运维监控类接口除外），快速恢复集群状态。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | [配置一键断流]                                                                                                                                                                                                                                                                                                                         |
| 请求采样统计与分析    | 记录客户端IP的访问量（如bulk写入、search查询），并提供统计接口，基于统计值评估集群压力，帮助识别异常流量。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | [配置请求采样统计与分析]                                                                                                                                                                                                                                                                                                                    |
| 访问日志记录       | 记录HTTP/HTTPS请求的URL和Body，用于分析流量压力和请求行为。 同时也支持将访问日志记录到文件，便于问题的定位与分析。 启用访问日志记录会增加额外的CPU和内存开销，可能会导致请求响应变慢。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | - [配置访问日志记录]  - [记录访问日志到文件]   |
   
#### 约束限制
2023年2月起新建的Elasticsearch 7.6.2和7.10.2集群只支持流量控制2.0版本，而此前创建的集群只支持流量控制1.0版本。
#### 登录Kibana
登录Kibana进入命令执行页面。Elasticsearch集群支持多种客户端访问，本文仅以CSS服务集成的Kibana为例介绍配置指导。
1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
2. 在左侧导航栏，选择"集群管理 \> Elasticsearch"。
3. 在集群列表，选择目标集群，单击操作列的"Kibana"，登录Kibana。
4. 在Kibana左侧导航栏选择"Dev Tools"，进入操作页面。 控制台左侧是命令输入框，其右侧的三角形图标为执行按钮，右侧区域则显示执行结果。
   
 
 #### 配置HTTP/HTTPS流控
通过黑白名单、并发连接数和新建连接速率限制，控制客户端访问流量，防止过载。
1. 开启HTTP/HTTPS流控。
   ```
   PUT /_cluster/settings
   {
     "persistent": {
       "flowcontrol.http.enabled": true,
       "flowcontrol.http.allow": ["192.168.0.1/24", "192.168.2.1/24"],
       "flowcontrol.http.deny": "192.168.1.1/24",
       "flowcontrol.http.concurrent": 1000,
       "flowcontrol.http.newconnect": 1000,
       "flowcontrol.http.warmup_period": 0
     }
   }
   ```
   表2HTTP/HTTPS流控的参数说明 
   | 参数                             | 类型             | 默认值             | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   |:---|:---|:---|:---|
   | flowcontrol.http.enabled       | Boolean        | false           | HTTP/HTTPS流控开关，开启后根据HTTP/HTTPS流控配置限制客户端访问流量。 取值范围： - true：开启HTTP/HTTPS流控。  - false：关闭HTTP/HTTPS流控。                                                                                                                                                                                                                     |
   | flowcontrol.http.allow         | List\<String\> | 无（无白名单）         | IP白名单列表，允许访问集群的客户端IP地址或子网列表。 - 支持单个IP地址，例如"192.18.0.1"。  - 支持IP子网，CIDR格式，例如"192.168.0.0/24"。  - 支持多个IP或子网，以英文逗号（,）分隔，例如"192.168.0.1/24, 192.168.2.1/24"。   当配置为"null"时，表示恢复默认值。 |
   | flowcontrol.http.deny          | List\<String\> | 无（无黑名单）         | IP黑名单列表，禁止访问集群的客户端IP地址或子网列表。白名单优先级高于黑名单。 - 支持单个IP地址，例如"192.18.0.1"。  - 支持IP子网，CIDR格式，例如"192.168.0.0/24"。  - 支持多个IP或子网，以英文逗号（,）分隔，例如"192.168.0.1/24, 192.168.2.1/24"。   当配置为"null"时，表示恢复默认值。                                        |
   | flowcontrol.http.concurrent    | Integer        | 节点CPU核数 x 600   | 并发连接数阈值，限制节点能够处理的最大HTTP/HTTPS并发连接数。 最小值：10 当配置为"null"时，表示恢复默认值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   | flowcontrol.http.newconnect    | Integer        | 节点CPU核数 x 200   | 每秒新建连接数阈值，限制节点每秒可以创建的最大HTTP/HTTPS新建连接数。 最小值：10 当配置为"null"时，表示恢复默认值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   | flowcontrol.http.warmup_period | Integer        | 0（无预热，直接达到最大速率） | 新建连接数达到最大速率的预热时间，控制HTTP/HTTPS新建连接数达到最大速率需要的时间。 取值范围：0\~10000 单位：ms（毫秒） 例如，"flowcontrol.http.newconnect"配置为"100"且"flowcontrol.http.warmup_period"配置为"5000ms"，表示系统需要5秒钟的时间来逐渐增加到每秒100个新建连接的速率。 当配置为"null"时，表示恢复默认值。                                                                                                                                                                                                                                                                                   |
      
   
2. 关闭HTTP/HTTPS流控。
   ```
   PUT /_cluster/settings
   {
     "persistent": {
       "flowcontrol.http.enabled": false
     }
   }
   ```
   
 
 #### 配置内存流控
当节点堆内存使用率超过阈值时，主动限制写入流量，防止内存溢出。
1. 开启内存流控。
   ```
   PUT /_cluster/settings
   {
     "persistent": {
       "flowcontrol.memory.enabled": true,
       "flowcontrol.memory.heap_limit": "80%"
     }
   }
   ```
   表3内存流控的参数说明 
   | 参数                                   | 类型        | 默认值           | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   |:---|:---|:---|:---|
   | flowcontrol.memory.enabled           | Boolean   | true          | 内存流控开关，开启后持续监控节点堆内存使用率，超过阈值时限制写入流量。 取值范围： - true：开启内存流控。  - false：关闭内存流控。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | flowcontrol.memory.heap_limit        | String    | 90%（保守阈值）     | 堆内存使用率阈值，设置节点堆内存使用率的阈值，当节点堆内存使用率超过此阈值时，将启动流量反压机制。 取值范围：10%-100% - 当堆内存使用率超过阈值时，系统将暂停处理客户端发送的单个请求体大于64KB的请求，直至堆内存使用率降至阈值以下。  - 当堆内存使用率下降到比阈值低5个百分点时，系统将继续处理请求，但读取的数据总量不能超过堆内存最大容量的5%（5%由"flowcontrol.memory.once_free_max"参数控制，表示单次允许释放的最大内存比例）。该机制旨在为内存回收提供缓冲空间。  - 当堆内存使用率持续超过阈值，系统将无法处理客户端请求的读取，如果参数"flowcontrol.memory.nudges_gc"为"true"，则系统还会主动触发垃圾回收（GC），通过持续尝试回收内存，直至堆内存使用率低于阈值。该机制可有效防止内存泄漏导致的系统崩溃。   日常使用建议设置为80%或更低，以保留堆内存余量供写入操作（如Segment merge）等非读取任务使用。 当配置为"null"时，表示恢复默认值。 |
   | flowcontrol.holding.in_flight_factor | Float     | 1.0（建议保持默认值）  | 反压释放因子，控制内存反压释放的灵敏度，值越大反压越强，对写入流量的限制也越严格。 取值范围：≥0.5 该值的作用是预估某个超大请求接收后对Java堆内存占用的影响，预估值为"in_flight_factor × 请求body体大小"。后续新申请资源会走其他熔断逻辑，此处只要按实际计算请求body体大小的内存即可。 当配置为"null"时，表示恢复默认值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | flowcontrol.holding.max              | TimeValue | 60s           | 请求最大延迟时间，设置请求的最大允许延迟时间，超过此时间后将按延迟超时后的请求处理策略"flowcontrol.holding.max_strategy"处理。 取值范围：≥15s 单位：s（秒） 一般结合延迟超时后的请求处理策略配置： - 当"flowcontrol.holding.max_strategy"为"soft"时，建议参数值配置小于用户客户端的超时时长。并预留一定的请求执行时间。  - 当"flowcontrol.holding.max_strategy"为"hard"时，建议参数值配置大于用户客户端请求的超时时长。  - 当"flowcontrol.holding.max_strategy"为"keep"时，该参数不生效。   当配置为"null"时，表示恢复默认值。                                                              |
   | flowcontrol.holding.max_strategy     | String    | keep          | 请求延迟超时后的处理策略，定义超过请求最大延迟时间后的操作行为。 取值范围： - keep：保持反压状态，等待内存使用率下降，由服务器根据实时内存情况决定是否释放请求。该模式会一直挂起请求，直到内存使用率下降到允许执行的程度，这期间请求会处于挂起状态，可能会导致请求超时。  - soft：强制执行请求，但由inFlight熔断器决定是否拒绝。inFlight熔断器是Elasticsearch原生的熔断机制，用于防止系统过载。详细请参见[Circuit breaker settings](https://www.elastic.co/docs/reference/elasticsearch/configuration-reference/circuit-breaker-settings)。该模式会允许挂起时间超过最大延迟的请求通过，但仍可能导致内存使用量激增，进而引发内存溢出。  - hard：立即丢弃请求并断开客户端连接。该模式会导致部分请求被流控。   当配置为"null"时，表示恢复默认值。                                                                                                                                                                                                           |
   | flowcontrol.memory.once_free_max     | String    | 5%            | 被暂停的请求队列单次允许释放的最大内存比例，定义被暂停的请求队列在内存压力下降时，单次可恢复处理的最大内存占比。该参数用于防止内存压力下降时突发流量冲击集群。 取值范围：1%\~50% 当配置为"null"时，表示恢复默认值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   | flowcontrol.memory.nudges_gc         | Boolean   | true（建议保持默认值） | 是否触发垃圾回收（GC）。当写入压力过大（每秒检查一次反压连接池，所有现有连接均被阻塞无法接受新的写入请求）时，是否触发垃圾回收以释放内存。 取值范围： - true：触发GC。  - false：不触发GC。   当配置为"null"时，表示恢复默认值。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
      
   
2. 关闭内存流控。
   ```
   PUT /_cluster/settings
   {
     "persistent": {
       "flowcontrol.memory.enabled": false
     }
   }
   ```
   
 
 #### 配置一键断流
切断所有客户端连接（Kibana访问和运维监控类接口除外），快速恢复集群状态。
1. 开启一键断流。
   ```
   PUT /_cluster/settings
   {
     "persistent": {
       "flowcontrol.break.enabled": true
     }
   }
   ```
   表4一键断流的参数说明 
   | 参数                        | 类型      | 默认值   | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   |:---|:---|:---|:---|
   | flowcontrol.break.enabled | Boolean | false | 一键断流开关，开启后系统将立即切断所有客户端连接（Kibana访问和运维监控类接口除外）。 取值范围： - true：开启一键断流。  - false：关闭一键断流。   |
      
   
2. 关闭一键断流。
   ```
   PUT /_cluster/settings
   {
     "persistent": {
       "flowcontrol.break.enabled": false
     }
   }
   ```
   
 
 #### 配置请求采样统计与分析
记录客户端IP的访问量，基于统计结果，帮助识别异常流量。
1. 开启请求采样统计。
   ```
   PUT _cluster/settings
   {
     "transient": {
       "flowcontrol.log.access.enabled": true
     }
   }
   ```
   表5请求采样统计的参数说明 
   | 参数                             | 类型      | 默认值   | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   |:---|:---|:---|:---|
   | flowcontrol.log.access.enabled | Boolean | false | 请求采样统计开关，开启后统计客户端IP的访问量（如bulk写入、search/msearch查询请求）。 取值范围： - true：开启请求采样统计。  - false：关闭请求采样统计。   |
   | flowcontrol.log.access.count   | Integer | 10    | 统计访问集群的客户端IP数量上限，控制统计最近访问集群的客户端IP地址数量，该值越大，统计范围越广。 取值范围：0\~100 当配置为"null"时，表示恢复默认值。                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
      
   
2. 查看采样统计结果，以分析客户端IP的访问模式和流量控制情况。
   - 查看所有节点的流量控制情况
     ```
     GET /_nodes/stats/filter/v2
     ```
     
   
   - 查看所有节点的流量控制详细情况
     ```
     GET /_nodes/stats/filter/v2?detail
     ```
     
   
   - 查看指定节点的流量控制情况
     ```
     GET /_nodes/{node_id}/stats/filter/v2
     ```
     表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" : "css-xxxx",
     "nodes" : {
       "d3qnVIpPTtSoadkV0LQEkA" : {
         "name" : "css-xxxx-ess-esn-1-1",
         "host" : "192.168.x.x",
         "timestamp" : 1672236425112,
         "flow_control" : {
           "http" : {
             "current_connect" : 52,
             "rejected_concurrent" : 0,
             "rejected_rate" : 0,
             "rejected_black" : 0,
             "rejected_breaker" : 0
           },
           "access_items" : [
             {
               "remote_address" : "10.0.0.x",
               "search_count" : 0,
               "bulk_count" : 0,
               "other_count" : 4
             }
           ],
           "holding_requests" : 0
         }
       }
     }
   }
   ```
   表7响应参数说明 
   | 参数                  | 说明                                                                                                                                                                                                 |
   |:---|:---|
   | current_connect     | 节点实际的HTTP连接数据信息， 没有开启流控这个配置也会记录，等同于GET /_nodes/stats/http接口的current_open值， 可以看到节点当前的客户端连接数。                                                                                                        |
   | rejected_concurrent | 开启流量控制期间被拒绝的并发连接数。 仅当HTTP/HTTPS流控开关开启（即"flowcontrol.http.enabled"为"true"）时，会统计该数据。当HTTP/HTTPS流控开关从开启状态关闭时，该统计值不会清零。    |
   | rejected_rate       | 开启流量控制期间被拒绝的新建连接数。 仅当HTTP/HTTPS流控开关开启（即"flowcontrol.http.enabled"为"true"）时，会统计该数据。当HTTP/HTTPS流控开关从开启状态关闭时，该统计值不会清零。    |
   | rejected_black      | 开启流量控制期间因黑名单拒绝的新建连接数。 仅当HTTP/HTTPS流控开关开启（即"flowcontrol.http.enabled"为"true"）时，会统计该数据。当HTTP/HTTPS流控开关从开启状态关闭时，该统计值不会清零。 |
   | rejected_breaker    | 开启一键断流期间被拒绝的新建连接数。 仅当一键断流开关开启（即"flowcontrol.break.enabled"为"true"）时，会统计该数据。当一键断流开关从开启状态关闭时，该统计值不会清零。                   |
   | access_items        | 请求采样统计，统计最近访问集群的客户端IP地址。 统计数量由"flowcontrol.log.access.count"决定。                                                        |
   | remote_address      | IP地址统计，基于配置值统计节点访问的IP地址和请求数量。                                                                                                                                                                      |
   | search_count        | 统计该客户端以_search、_msearch访问的次数。                                                                                                                                                                      |
   | bulk_count          | 统计该客户端以_bulk访问的次数。                                                                                                                                                                                 |
   | other_count         | 统计该客户端其他请求的访问次数。                                                                                                                                                                                   |
   | holding_requests    | 统计当前节点有多少个连接被流控策略暂停数据写入。                                                                                                                                                                           |
      
   
3. 关闭请求采样统计。
   ```
   PUT /_cluster/settings
   {
     "persistent": {
       "flowcontrol.log.access.enabled": false
     }
   }
   ```
   
 
 #### 配置访问日志记录
记录HTTP/HTTPS请求的URL和Body，用于分析流量压力和请求行为，优化集群性能。
1. 开启访问日志。
   - 开启集群所有节点的访问日志
     ```
     PUT /_access_log?duration_limit=30s&capacity_limit=1mb
     ```
     
   
   - 开启集群中指定节点的访问日志
     ```
     PUT /_access_log/{node_id}?duration_limit=30s&capacity_limit=1mb
     ```
     
   
   
   表8开启访问日志的参数说明 
   | 参数             | 类型     | 默认值 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   |:---|:---|:---|:---|
   | duration_limit | String | 30  | 访问日志的最大记录时长，达到该时长后停止记录访问日志。 取值范围：10\~120 单位：s（秒） 当配置为"null"时，表示恢复默认值。 "duration_limit"和"capacity_limit"只要有一个参数的值达到其对应的阈值，访问日志记录就会停止。                                             |
   | capacity_limit | String | 1   | 访问日志的最大记录容量。统计开启访问日志后记录的请求大小，当统计的容量超过该配置值，日志记录终止。 取值范围：1\~5 单位：MB 当配置为"null"时，表示恢复默认值。 "duration_limit"和"capacity_limit"只要有一个参数的值达到其对应的阈值，访问日志记录就会停止。 |
      
   
2. 查看访问日志。
   - 查看集群所有节点的访问日志
     ```
     GET /_access_log
     ```
     
   
   - 查看集群中指定节点的访问日志
     ```
     GET /_access_log/{node_id}
     ```
     
   
   
   响应示例：
   ```
   {
     "_nodes" : {
       "total" : 1,
       "successful" : 1,
       "failed" : 0
     },
     "cluster_name" : "css-flowcontroller",
     "nodes" : {
       "8x-ZHu-wTemBQwpcGivFKg" : {
         "name" : "css-flowcontroller-ess-esn-1-1",
         "host" : "10.0.0.98",
         "count" : 2,
         "access" : [
           {
             "time" : "2021-02-23 02:09:50",
             "remote_address" : "/10.0.0.98:28191",
             "url" : "/_access/security/log?pretty",
             "method" : "GET",
             "content" : ""
           },
           {
             "time" : "2021-02-23 02:09:52",
             "remote_address" : "/10.0.0.98:28193",
             "url" : "/_access/security/log?pretty",
             "method" : "GET",
             "content" : ""
           }
         ]
       }
     }
   }
   ```
   表9响应参数说明 
   | 参数             | 说明                    |
   |:---|:---|
   | name           | 节点名称。                 |
   | host           | 节点对应的IP地址。            |
   | count          | 统计周期内访问节点的请求数量。       |
   | access         | 统计周期内访问节点的请求详情。       |
   | time           | 请求时间。                 |
   | remote_address | 请求的源IP地址和端口。          |
   | url            | 请求的原始URL。             |
   | method         | 请求Path的方法。            |
   | content        | 请求内容，如空字符串 "" 表示无请求体。 |
      
   
3. 删除访问日志。由于日志记录在内存中，查看完毕后，建议删除日志释放资源，避免因日志占用过多内存影响系统性能。
   1. 删除所有节点的访问日志。
      ```
      DELETE /_access_log
      ```
      
   
   2. 查看访问日志，确认日志已被成功删除。
      ```
      GET /_access_log
      ```
      
    
 
 #### 记录访问日志到文件
将访问日志记录到文件，存储在磁盘空间中，便于问题的定位与分析。该功能一般用于定位问题，问题解决后建议关闭此开关，避免影响集群性能。
1. 开启访问日志记录到文件。
   ```
   PUT /_cluster/settings
   {
     "persistent": {
       "flowcontrol.log.file.enabled": true
     }
   }
   ```
   表10访问日志记录到文件的参数说明 
   | 参数                           | 类型      | 默认值   | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   |:---|:---|:---|:---|
   | flowcontrol.log.file.enabled | Boolean | false | 访问日志记录到文件的开关，开启后将每个请求的访问日志记录到文件。 访问日志文件的名称为"集群名称_access_log.log"，仅支持通过日志备份功能查看。日志备份指导请参见[启用日志备份功能](https://support.huaweicloud.com/usermanual-css/css_01_0164.html#ZH-CN_TOPIC_0000002558581145__zh-cn_topic_0000001223434432_section3460103108)。 取值范围： - true：开启访问日志记录到文件。  - false：关闭访问日志记录到文件。   |
      
   
2. 关闭访问日志记录到文件。
   ```
   PUT /_cluster/settings
   {
     "persistent": {
       "flowcontrol.log.file.enabled": false
     }
   }
   ```
   
 
