配置Elasticsearch集群读写流量控制策略2.0
场景描述
流量控制2.0提供节点级别的流量控制功能,可提供单个节点基于黑白名单的访问限制、HTTPS并发连接数限制、HTTP最大连接数限制,基于节点内存的客户端写入流量反压控制,一键断流能力。同时也提供节点访问IP统计和URL的统计能力。开启客户端写入流量反压控制功能,会在节点堆内存过大时阻止大请求涌入节点占用内存,避免节点崩溃,减少节点不可用的风险。
策略 |
描述 |
相关文档 |
---|---|---|
HTTP/HTTPS流控 |
|
|
内存流控 |
基于节点堆内存使用量限制写入流量,将请求需要读取的内容反压在客户端,暂停请求的接收。同时尽力触发垃圾回收,按堆内存的空闲量继续读取请求。 |
|
请求采样统计 |
可以记录客户端IP的访问和客户端的请求类型,用户可以基于统计值识别客户端IP的访问流量,分析当前客户端的写入和查询访问量。 |
|
一键断流 |
可以切断节点的所有客户端连接,不包括Kibana访问和CSS后台运维、监控类接口。用于应对突发流量场景下的集群异常,达到快速恢复集群的目的。 |
|
流量控制 |
提供单独的流量统计接口,记录当前客户端连接数以及客户端反压连接数,用户可以基于统计值评估流控配置阈值和衡量集群压力。 |
|
访问日志 |
可以记录一段时间内节点接收的HTTP/HTTPS请求URL和Body,用户可以基于访问日志信息分析当前的流量压力。 |
|
访问日志记录 |
客户端访问集群节点,会记录为{集群名_access_log.log}访问日志文件,通过日志备份功能可以在OBS详细查看访问日志。 |
约束限制
- 2023年02月及之后创建的Elasticsearch 7.6.2和Elasticsearch 7.10.2集群仅支持流量控制2.0版本,之前创建Elasticsearch 7.6.2和Elasticsearch 7.10.2集群仅支持流量控制1.0版本。
- 开启流量控制功能会消耗部分节点性能。
- 开启流量控制会直接拒绝超过阈值的用户请求。
- 开启内存流控会消耗部分请求性能,开启内存流控会导致Kibana的部分search请求失败。
- 开启访问日志会影响集群性能。
- 内存流控是基于请求Path的流控,Path长度和个数不应该配置过多,否则影响集群性能。
开启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、false
默认值:false
flowcontrol.http.allow
List<String>
IP地址访问白名单。
支持配置多个IP地址和掩码,或者IP地址列表形式,中间用英文逗号隔开。例如“xx.xx.xx.xx/24,xx.xx.xx.xx/24”或“xx.xx.xx.xx,xx.xx.xx.xx”形式。
默认值为空。
flowcontrol.http.deny
List<String>
IP访问黑名单。
支持配置多个IP和掩码,或者IP列表形式,中间用英文逗号隔开。
默认值为空。
flowcontrol.http.concurrent
Integer
HTTP/HTTPS请求的并发连接数阈值。
默认值:节点可用核数x600
flowcontrol.http.newconnect
Integer
HTTP/HTTPS请求的每秒可以创建的新建连接数阈值。
默认值:节点可用核数x200
flowcontrol.http.warmup_period
Integer
HTTP/HTTPS新建连接数达到最大速率的需要的时间,如果“flowcontrol.http.newconnect”配置为“100”且“flowcontrol.http.warmup_period”配置为“5000ms”,表示5s以后系统的新建连接数才可以达到每秒100。
取值范围:0~10000
单位:ms
默认值:0
当所有参数值设置为“null”时,表示恢复配置默认值。
- 执行如下命令,关闭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%是一个比较保守的阈值,即堆内存大于90%使用量时会停止读取客户端超过64KB的大请求,直至堆内存下降。如堆内存下降到85%,会开始允许最多一次读取“5%×堆内存最大值”的客户端数据量。如果堆内存持续超过90%,则无法放开客户端连接的请求读取,此时会尝试触发GC算法进行垃圾回收,直到堆内存低于所设定的阈值。
- 日常使用时可以将“flowcontrol.memory.heap_limit”阈值设置为80%或以下,保证节点有一定的堆内存余量,供写入内存以外的行为使用,比如:Elasticsearch查询、Segment merge等。
flowcontrol.holding.in_flight_factor
Float
反压释放因子,原理类似于熔断器“network.breaker.inflight_requests.overhead”参数。内存达到限制值时,该值越大反压越强,写入流量将受限。
取值范围:≥0.5
默认值:1.0
flowcontrol.holding.max
TimeValue
每个请求最长的延迟时间,当延迟超过此值时可以设置断开该请求反压或断开请求链路。详见“flowcontrol.holding.max_strategy”配置。
取值范围:≥15s
默认值:60s
flowcontrol.holding.max_strategy
String
超过最大延迟时间后的运行策略。
取值范围:- keep(默认值):如果堆内存仍在高位,选择继续反压 - 何时执行请求仍由服务器根据实时内存自主决定。
- soft:如果堆内存仍在高位,也必须执行该请求。执行/拒绝权力交给inFlight熔断器。
- hard:如果堆内存仍在高位,丢弃该请求,同时断开该请求的客户端连接。
flowcontrol.memory.once_free_max
String
被暂停的请求队列一次性最大重新打开的内存,防止强压场景下短暂的低内存现象一次性冲挂集群。
取值范围:1%-50%
默认值:10%
flowcontrol.memory.nudges_gc
Boolean
写入压力过大时(1s检查一次反压连接池,所有现有连接均被阻塞无法放开新的写入请求),是否尽力触发垃圾回收,保证写入稳定性。取值:
- true(默认值)
- false
当所有参数值设置为“null”时,表示恢复配置默认值。
- 执行如下命令,关闭集群内存流控。
PUT /_cluster/settings { "persistent": { "flowcontrol.memory.enabled": false } }
开启请求采样统计
- 执行如下命令,开启请求采样统计。
PUT _cluster/settings { "transient": { "flowcontrol.log.access.enabled": true } }
表4 请求采样统计的配置项说明 配置项
类型
说明
flowcontrol.log.access.enabled
Boolean
请求采样统计开关,统计最近访问Elasticsearch集群的客户端IP地址及其请求数量,会统计bulk写入和search、msearch查询请求的个数。
取值范围:- true
- false(默认值)
flowcontrol.log.access.count
Integer
统计最近IP地址访问集群的客户端来源个数。IP统计分为请求类型统计和日志记录开关。
取值范围:0-100
默认值:10
当所有参数值设置为“null”时,表示恢复配置默认值。
- 执行如下命令,关闭请求采样统计。
PUT /_cluster/settings { "persistent": { "flowcontrol.log.access.enabled": false } }
开启一键断流
- 执行如下命令,开启一键断流。
PUT /_cluster/settings { "persistent": { "flowcontrol.break.enabled": true } }
- 执行如下命令,关闭一键断流。
PUT /_cluster/settings { "persistent": { "flowcontrol.break.enabled": false } }
查看流量控制信息
- 查看所有节点的流量控制情况
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 } } } }
参数名 |
说明 |
---|---|
current_connect |
节点实际的HTTP连接数据信息, 没有开启流控这个配置也会记录,等同于GET /_nodes/stats/http接口current_open值, 可以看到节点当前的客户端连接数。 |
rejected_concurrent |
HTTP流控开启生效,关闭后不清零,开启流控期间拒绝的并发连接数。 |
rejected_rate |
HTTP流控开启生效,关闭后不清零,开启流控期间拒绝的新建连接数。 |
rejected_black |
HTTP流控开启生效,关闭后不清零,配置黑名单拒绝的请求数。 |
rejected_breaker |
一键断流开启,拒绝的新建连接数。 |
remote_address |
IP地址统计,基于配置值统计节点访问的IP地址和请求数量。 |
search_count |
该客户端以_search、_msearch访问的次数。 |
bulk_count |
该客户端以_bulk访问的次数。 |
other_count |
该客户端其他请求的访问次数。 |
开启并查看访问日志
- 执行如下命令,开启访问日志。
- 开启集群所有节点的访问日志
PUT /_access_log?duration_limit=30s&capacity_limit=1mb
- 开启集群中某一节点的访问日志
PUT /_access_log/{nodeId}?duration_limit=30s&capacity_limit=1mb
“{nodeId}”为节点ID。
表6 访问日志的配置项说明 配置项
类型
说明
duration_limit
String
访问日志记录时间。
取值范围:10~120
单位:s
默认值:30
capacity_limit
String
访问日志记录大小。统计开启访问日志后记录的请求大小,当统计的大小大于该配置值,访问日志记录终止。
取值范围:1~5
单位:MB
默认值:1
- “duration_limit”和“capacity_limit”只要有一个参数达到阈值,访问日志记录就会停止。
- 当所有参数值设置为“null”时,表示恢复配置默认值。
- 开启集群所有节点的访问日志
- 执行如下命令,查看访问日志。
- 查看集群所有节点的访问日志API
GET /_access_log
- 查看集群中某一节点的访问日志API
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" : "" } ] } } }
表7 响应参数说明 参数名
说明
name
节点名称。
host
节点对应的IP地址。
count
统计周期内,访问节点的请求数量。
access
统计周期内,访问节点的请求详情。参数说明请参见表8。
- 查看集群所有节点的访问日志API
- 执行命令删除访问日志。
- 删除集群所有节点的访问日志API
DELETE /_access_log
- 删除集群中某一节点的访问日志API
DELETE /_access_log/{nodeId}
“{nodeId}”为节点ID。
- 删除集群所有节点的访问日志API
开启访问日志记录到文件
- 开启访问日志记录到文件后,客户端访问集群节点,会记录为{集群名_access_log.log}文件,通过日志备份功能可以在OBS详细查看访问日志。
- 该功能一般用于定位问题,问题解决后,建议关闭此开关。
- 执行如下命令,开启访问日志记录到文件。
PUT /_cluster/settings { "persistent": { "flowcontrol.log.file.enabled": true } }
表9 访问日志记录到文件的配置项说明 参数
类型
说明
flowcontrol.log.file.enabled
Boolean
是否将每个请求的日志详情记录到后台日志文件。
取值范围:- true
- false(默认值)
- 执行如下命令,关闭访问日志记录到文件。
PUT /_cluster/settings { "persistent": { "flowcontrol.log.file.enabled": false } }