配置OpenSearch集群读写流量控制策略
通过流量控制策略管理OpenSearch集群的读写流量,保障集群稳定性并防止异常流量冲击。
- 高并发写入场景:避免大请求涌入导致节点内存溢出。
- 安全防护场景:通过黑白名单限制非法IP访问。
- 流量异常响应场景:一键断流快速应对突发流量冲击。
- 性能调优场景:通过统计分析优化流控配置阈值。
原理介绍
策略 |
原理介绍 |
相关文档 |
---|---|---|
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为例介绍配置指导。
- 登录云搜索服务管理控制台。
- 在左侧导航栏,选择“集群管理 > OpenSearch”。
- 在集群列表,选择目标集群,单击操作列的“Dashboards”,登录OpenSearch Dashboards。
- 在OpenSearch Dashboards左侧导航栏选择“Dev Tools”,进入操作页面。
配置HTTP/HTTPS流控
通过黑白名单、并发连接数和新建连接速率限制,控制客户端访问流量。
- 开启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个新建连接的速率。
- 关闭HTTP/HTTPS流控。
PUT /_cluster/settings { "persistent": { "flowcontrol.http.enabled": false } }
配置内存流控
当节点堆内存使用率超过阈值时,主动限制写入流量,防止内存溢出。
- 开启内存流控。
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”时,表示恢复默认值。
- 关闭内存流控。
PUT /_cluster/settings { "persistent": { "flowcontrol.memory.enabled": false } }
配置一键断流
切断所有客户端连接(OpenSearch Dashboards访问和运维监控类接口除外),快速恢复集群状态。
- 开启一键断流。
PUT /_cluster/settings { "persistent": { "flowcontrol.break.enabled": true } }
表4 一键断流的参数说明 参数
参数类型
描述
flowcontrol.break.enabled
Boolean
一键断流开关,开启后系统将立即切断所有客户端连接(OpenSearch Dashboards访问和运维监控类接口除外)。
- true:开启一键断流。
- false(默认值):关闭一键断流。
- 关闭一键断流。
PUT /_cluster/settings { "persistent": { "flowcontrol.break.enabled": false } }
配置请求采样统计与分析
记录客户端IP的访问量,基于统计结果,帮助识别异常流量。
- 开启请求采样统计。
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”时,表示恢复默认值。
- 查看采样统计结果。
- 查看所有节点的流量控制情况
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
统计当前节点有多少个连接被流控策略暂停数据写入。
- 查看所有节点的流量控制情况
- 关闭请求采样统计。
PUT /_cluster/settings { "persistent": { "flowcontrol.log.access.enabled": false } }
配置访问日志记录
记录HTTP/HTTPS请求的URL和Body,用于分析流量压力和请求行为。
- 开启访问日志。
- 开启集群所有节点的访问日志
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”只要有一个参数达到阈值,访问日志记录就会停止。
- 开启集群所有节点的访问日志
- 查看访问日志。
- 查看集群所有节点的访问日志
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
请求内容,如空字符串 "" 表示无请求体。
- 查看集群所有节点的访问日志
- 删除访问日志。由于日志记录在内存中,查看完毕后,建议删除日志释放资源。
记录访问日志到文件
将访问日志记录到文件,存储在磁盘空间中,便于问题的定位与分析。该功能一般用于定位问题,问题解决后建议关闭此开关,避免影响集群性能。
- 开启访问日志记录到文件。
PUT /_cluster/settings { "persistent": { "flowcontrol.log.file.enabled": true } }
表9 访问日志记录到文件的参数说明 参数
参数类型
描述
flowcontrol.log.file.enabled
Boolean
访问日志记录到文件的开关,开启后将每个请求的访问日志记录到文件。
访问日志文件的名称为“集群名_access_log.log”,仅支持通过日志备份功能查看。
- true:开启访问日志记录到文件。
- false(默认值):关闭访问日志记录到文件。
- 关闭访问日志记录到文件。
PUT /_cluster/settings { "persistent": { "flowcontrol.log.file.enabled": false } }