更新时间:2025-09-05 GMT+08:00

配置OpenSearch集群读写流量控制策略

通过流量控制策略管理OpenSearch集群的读写流量,保障集群稳定性并防止异常流量冲击。

在OpenSearch集群中,突发流量、恶意访问或资源竞争可能导致节点过载甚至崩溃。流量控制策略通过限制客户端访问、反压写入流量、统计分析流量行为,实现集群资源的合理分配和风险防控,适用于以下场景:
  • 高并发写入场景:避免大请求涌入导致节点内存溢出。
  • 安全防护场景:通过黑白名单限制非法IP访问。
  • 流量异常响应场景:一键断流快速应对突发流量冲击。
  • 性能调优场景:通过统计分析优化流控配置阈值。

原理介绍

表1 流量控制策略介绍

策略

原理介绍

相关文档

HTTP/HTTPS流控

通过黑白名单、并发连接数和新建连接速率限制,控制客户端访问流量。

  • 黑白名单控制:白名单优先于黑名单,如果IP同时存在于两者,白名单生效。被黑名单阻断的连接将直接中断,不处理任何请求。
  • 并发连接数限制:限制节点每秒的HTTP连接总数,防止连接数激增。
  • 新建连接数限制:限制每秒新建连接数,通过“预热时间”(warmup_period)平滑流量增长。

配置HTTP/HTTPS流控

内存流控

当堆内存使用率超过阈值(如80%),暂停大请求读取,触发垃圾回收(GC)释放内存。

通过反压因子(in_flight_factor)和最大延迟时间(max)控制写入流量强度。

配置内存流控

一键断流

切断所有客户端连接(OpenSearch Dashboards访问和运维监控类接口除外),快速恢复集群状态。

配置一键断流

请求采样统计与分析

记录客户端IP的访问量(如bulk写入、search查询),并提供统计接口,基于统计值评估集群压力,帮助识别异常流量。

配置请求采样统计与分析

访问日志记录

记录HTTP/HTTPS请求的URL和Body,用于分析流量压力和请求行为。

同时也支持将访问日志记录到文件,便于问题的定位与分析。

约束限制

  • OpenSearch集群仅2.19.0版本支持流量控制功能。
  • 开启流量控制策略会消耗部分节点性能。例如,内存流控可能会导致OpenSearch Dashboards的查询失败。
  • 内存流控的Path配置过多会显著影响性能。
  • 访问日志开启后集群性能会下降。
  • 开启流量控制策略后,超过阈值的请求将被直接拒绝,

登录OpenSearch Dashboards

登录OpenSearch Dashboards进入命令执行页面。OpenSearch集群支持多种客户端访问,本文仅以CSS服务集成的OpenSearch Dashboards为例介绍配置指导。

  1. 登录云搜索服务管理控制台
  2. 在左侧导航栏,选择“集群管理 > OpenSearch”
  3. 在集群列表,选择目标集群,单击操作列的“Dashboards”,登录OpenSearch Dashboards。
  4. 在OpenSearch Dashboards左侧导航栏选择“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
      }
    }
    表2 HTTP/HTTPS流控的参数说明

    参数

    参数类型

    描述

    flowcontrol.http.enabled

    Boolean

    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

    并发连接数阈值,限制节点每秒处理的最大HTTP/HTTPS并发连接数。默认值为节点可用CPU核数 x 600。

    flowcontrol.http.newconnect

    Integer

    每秒新建连接数阈值,限制节点每秒可以创建的最大HTTP/HTTPS新建连接数。

    默认值为节点可用CPU核数 x 200。

    当配置为“null”时,表示恢复默认值。

    flowcontrol.http.warmup_period

    Integer

    新建连接数达到最大速率的预热时间,控制HTTP/HTTPS新建连接数达到最大速率需要的时间。

    取值范围:0~10000

    单位:ms(毫秒)

    默认值为0,表示无预热,立即达到最大速率。

    当配置为“null”时,表示恢复默认值。

    例如,“flowcontrol.http.newconnect”配置为“100”“flowcontrol.http.warmup_period”配置为“5000ms”,表示系统需要5秒钟的时间来逐渐增加到每秒100个新建连接的速率。

  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:开启内存流控。
    • false(默认值):关闭内存流控。

    flowcontrol.memory.heap_limit

    String

    堆内存使用率阈值,设置节点堆内存使用率的阈值,当节点堆内存使用率超过此阈值时,将启动流量反压机制。

    取值范围:10%-100%

    默认值为90%,是保守阈值,即堆内存大于90%使用量时会停止读取客户端超过64KB的大请求,直至堆内存下降。如堆内存下降到85%,会开始允许最多一次读取“5%×堆内存最大值”的客户端数据量。如果堆内存持续超过90%,则无法放开客户端连接的请求读取,此时会尝试触发GC算法进行垃圾回收,直到堆内存低于所设定的阈值。

    日常使用时,建议设置为80%或小于80%,保证节点有一定的堆内存余量,供写入内存以外的行为使用,例如Segment merge等。

    当配置为“null”时,表示恢复默认值。

    flowcontrol.holding.in_flight_factor

    Float

    反压释放因子,控制内存反压释放的灵敏度,值越大反压越强,对写入流量的限制也越严格。

    取值范围:≥0.5

    默认值为1.0。

    当配置为“null”时,表示恢复默认值。

    flowcontrol.holding.max

    TimeValue

    请求最大延迟时间,设置请求的最大允许延迟时间,超过此时间后将按延迟超时后的请求处理策略“flowcontrol.holding.max_strategy”处理。

    取值范围:≥15s

    单位:s(秒)

    默认值为60s。

    当配置为“null”时,表示恢复默认值。

    flowcontrol.holding.max_strategy

    String

    延迟超时后的请求处理策略,定义超过请求最大延迟时间后的处理策略。

    • keep(默认值):保持反压状态,等待内存使用率下降,由服务器根据实时内存决定执行时机。
    • soft:强制执行请求,但由inFlight熔断器决定是否拒绝。
    • hard:立即丢弃请求并断开客户端连接。

    当配置为“null”时,表示恢复默认值。

    flowcontrol.memory.once_free_max

    String

    被暂停的请求队列一次性释放的最大内存比例,设置被暂停的请求队列一次性重新打开的最大内存比例。此参数用于防止在内存压力突然降低时,大量请求同时涌入导致集群过载。

    取值范围:1%-50%

    默认值为5%。

    当配置为“null”时,表示恢复默认值。

    flowcontrol.memory.nudges_gc

    Boolean

    是否触发垃圾回收(GC)。当写入压力过大(每秒检查一次反压连接池,所有现有连接均被阻塞无法放开新的写入请求)时,是否触发垃圾回收以释放内存。

    • true(默认值):触发GC。
    • false:不触发GC。

    当配置为“null”时,表示恢复默认值。

  2. 关闭内存流控。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.memory.enabled": false
      }
    }

配置一键断流

切断所有客户端连接(OpenSearch Dashboards访问和运维监控类接口除外),快速恢复集群状态。

  1. 开启一键断流。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.break.enabled": true
      }
    }
    表4 一键断流的参数说明

    参数

    参数类型

    描述

    flowcontrol.break.enabled

    Boolean

    一键断流开关,开启后系统将立即切断所有客户端连接(OpenSearch Dashboards访问和运维监控类接口除外)。

    • 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

    请求采样统计开关,开启后统计客户端IP的访问量(如bulk写入、search/msearch查询请求)。
    • true:开启请求采样统计。
    • false(默认值):关闭请求采样统计。

    flowcontrol.log.access.count

    Integer

    统计访问集群的客户端IP数量上限,控制统计最近访问集群的客户端IP地址数量,该值越大,统计范围越广。

    取值范围:0~100

    默认值:10

    当配置为“null”时,表示恢复默认值。

  2. 查看采样统计结果。
    • 查看所有节点的流量控制情况
      GET /_nodes/stats/filter/v2
    • 查看所有节点的流量控制详细情况
      GET /_nodes/stats/filter/v2?detail
    • 查看某个节点的流量控制情况
      GET /_nodes/{nodeId}/stats/filter/v2

      “{nodeId}”为节点ID。

    响应示例:
    {
      "_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
          }
        }
      }
    }
    表6 响应参数说明

    参数

    描述

    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/{nodeId}?duration_limit=30s&capacity_limit=1mb

      “{nodeId}”为节点ID。

    表7 开启访问日志的参数说明

    参数

    参数类型

    描述

    duration_limit

    String

    访问日志记录的最长时间,达到该时间后停止记录访问日志。

    取值范围:10~120

    单位:s(秒)

    默认值为30。

    当配置为“null”时,表示恢复默认值。

    “duration_limit”“capacity_limit”只要有一个参数达到阈值,访问日志记录就会停止。

    capacity_limit

    String

    访问日志记录的最大内存容量。统计开启访问日志后记录的请求大小,当统计的容量大于该配置值,日志记录终止。

    取值范围:1~5

    单位:MB

    默认值为1。

    当配置为“null”时,表示恢复默认值。

    “duration_limit”“capacity_limit”只要有一个参数达到阈值,访问日志记录就会停止。

  2. 查看访问日志。
    • 查看集群所有节点的访问日志
      GET /_access_log
    • 查看集群中某节点的访问日志
      GET /_access_log/{nodeId}

      “{nodeId}”为节点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" : ""
            }
          ]
        }
      }
    }
    表8 响应参数说明

    参数

    描述

    name

    节点名称。

    host

    节点对应的IP地址。

    count

    统计周期内访问节点的请求数量。

    access

    统计周期内访问节点的请求详情。

    time

    请求时间。

    remote_address

    请求的源IP地址和端口。

    url

    请求的原始URL。

    method

    请求Path的方法。

    content

    请求内容,如空字符串 "" 表示无请求体。

  3. 删除访问日志。由于日志记录在内存中,查看完毕后,建议删除日志释放资源。
    删除所有节点的访问日志
    DELETE /_access_log

记录访问日志到文件

将访问日志记录到文件,存储在磁盘空间中,便于问题的定位与分析。该功能一般用于定位问题,问题解决后建议关闭此开关,避免影响集群性能。

  1. 开启访问日志记录到文件。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.log.file.enabled": true
      }
    }
    表9 访问日志记录到文件的参数说明

    参数

    参数类型

    描述

    flowcontrol.log.file.enabled

    Boolean

    访问日志记录到文件的开关,开启后将每个请求的访问日志记录到文件。

    访问日志文件的名称为“集群名_access_log.log”,仅支持通过日志备份功能查看。

    • true:开启访问日志记录到文件。
    • false(默认值):关闭访问日志记录到文件。
  2. 关闭访问日志记录到文件。
    PUT /_cluster/settings
    {
      "persistent": {
        "flowcontrol.log.file.enabled": false
      }
    }