配置Elasticsearch集群读写流量控制策略1.0
场景描述
流量控制1.0提供节点级别的流量控制功能,可提供单个节点基于黑白名单的访问限制、HTTP并发连接数限制、HTTP最大连接数限制、基于请求Path的堆内存最大使用量流控能力、基于CPU最大占用率流控能力,一键断流能力,同时也提供节点访问IP统计和URL的采样统计能力。开启流控功能会使请求在入口处直接阻塞,可以缓解节点高并发场景下的集群压力,降低P99时延,减少节点不可用的风险。
策略 |
描述 |
相关文档 |
---|---|---|
HTTP/HTTPS流控 |
|
|
内存流控 |
基于节点堆内存使用量限制请求Path,支持设置内存流控白名单、全局内存使用阈值和基于单个Path设置堆内存使用阈值。全局内存流控阈值优先于单个Path内存阈值,白名单配置Path不参与内存流控。 |
|
Path全局免流控白名单 |
可以根据客户需要,设置Path白名单全局免流控,当用户需要自定义插件时,可适当配置。 |
|
请求采样统计 |
可以记录客户端IP的访问数量和采样用户的请求Path,用户可以基于统计值识别客户端IP的访问流量和分析哪些请求Path访问量大。 |
|
一键断流 |
可以切断节点的所有访问流量,不包括kibana访问和elasticsearch monitor类接口。 |
|
流量控制 |
提供单独的流量统计查看接口,记录触发流控的数量,用户可以基于统计值评估流控配置阈值和衡量集群压力。 |
|
访问日志 |
可以记录一段时间内节点接收的HTTP/HTTPS请求URL和Body,用户可以基于访问日志信息分析当前的流量压力。 |
|
访问日志记录 |
客户端访问集群节点,会记录为{集群名_access_log.log}访问日志文件,通过日志备份功能可以在OBS详细查看访问日志。 |
|
CPU流控 |
基于节点配置的最大CPU占用率来限制节点访问流量。 |
约束限制
- 2023年02月及之后创建的Elasticsearch 7.6.2和Elasticsearch 7.10.2集群仅支持流量控制2.0版本,之前创建Elasticsearch 7.6.2和Elasticsearch 7.10.2集群仅支持流量控制1.0版本。
- 开启流量控制功能会消耗部分节点性能。
- 开启流量控制会直接拒绝超过阈值的用户请求。
- 开启内存流控会消耗部分请求性能,开启内存流控会导致Kibana的部分search请求失败。
- 开启访问日志会影响集群性能。
- 内存流控和CPU流控都是基于请求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 } }
开启内存流控
Elasticsearch 5.5.1版本的集群开启内存流控会导致“_mget”请求被拦截,Kibana访问异常,可以通过把“_mget”请求加入请求白名单规避。
- 开启内存流控。
- 执行如下命令,开启内存流控。
PUT /_cluster/settings { "persistent": { "flowcontrol.memory.enabled": true, "flowcontrol.memory.allow_path": "/index/_search", "flowcontrol.memory.heap_limit": "85%" } }
- 执行如下命令,开启单个请求Path的内存流控。
当基于单个索引和请求Path设置堆内存使用阈值时,可以基于此规则做优先级调度。
PUT /_cluster/settings { "persistent": { "flowcontrol.memory.enabled": true, "flowcontrol.memory": { "flowcontrol_search": { "filter_path": "index1/_search", "heap_limit": "50%" }, "flowcontrol_bulk": { "filter_path": "index*/_bulk", "heap_limit": "50%" } } } }
表3 内存流控的配置项说明 配置项
类型
说明
flowcontrol.memory.enabled
Boolean
内存流控开关,默认关闭,开启内存流控对节点性能有些许影响。
取值范围:true、false
默认值:false
flowcontrol.memory.allow_path
List<String>
内存流控白名单Path。
配置的路径不参与内存流控,可以支持通配符配置。集群控制的查询类接口默认放通,不参与内存流控,避免内存达到阈值,不能查询集群信息。
例如:
- "flowcontrol.memory.allow_path": "/index/_search",
- "flowcontrol.memory.allow_path": "/index*/_search",
- "flowcontrol.memory.allow_path": ["/index/_search", "/index1/_bulk"],
支持最大配置10个Path,每个Path最大长度限制小于32。
默认值为空。
flowcontrol.memory.heap_limit
String
限制节点全局堆内存的最大使用率。不能低于堆内存的10%。
取值范围:10%-100%
默认值:90%
flowcontrol.memory.*.filter_path
String
配置需要进行内存流控的访问Path,控制单个请求Path的堆内存使用阈值。
默认值 "**", 表示匹配所有的路径。如果只配置了单路径“flowcontrol.memory.heap_limit”,没有配置“flowcontrol.memory.*.filter_path”,表示除去白名单外的所有path都影响。白名单规则优先于单路径规则,如果一个路径同时配置了“flowcontrol.memory.allow_path”和“flowcontrol.memory.*.filter_path”, 此请求路径会被允许。
例如同时配置了“flowcontrol.memory.allow_path”和“flowcontrol.memory.*.filter_path”,其中flowcontrol.memory.*.filter_path="abc/_search"且flowcontrol.memory.allow_path="abc/_search",此种情况abc/_search将不被流控。
最大长度:32
flowcontrol.memory.*.heap_limit
String
配置请求Path的堆内存阈值,堆内存超过阈值触发流控。
取值范围:0%-100%
默认值:90%
当所有参数值设置为“null”时,表示恢复配置默认值。
- 执行如下命令,开启内存流控。
- 执行如下命令,关闭集群内存流控。
- 执行如下命令,删除单个请求Path的内存流控。
PUT /_cluster/settings { "persistent": { "flowcontrol.memory.enabled": true, "flowcontrol.memory": { "flowcontrol_search": { "filter_path": null, "heap_limit": null } } } }
- 执行如下命令,关闭内存流控。
PUT /_cluster/settings { "persistent": { "flowcontrol.memory.enabled": false } }
- 执行如下命令,删除单个请求Path的内存流控。
添加Path全局免流控白名单
PUT _cluster/settings { "persistent": { "flowcontrol.path.white_list": "xxxx" } }
配置项 |
类型 |
说明 |
---|---|---|
flowcontrol.path.white_list |
List<String> |
Path全局免流控白名单,配置的路径不参与内存、CPU流控和一键断流,IP流控除外。 支持最大配置10个Path,每个Path最大长度限制小于32。 默认值为空。
说明:
一般不建议配置此值,仅在自定义插件时根据业务需求配置。 |
当所有参数值设置为“null”时,表示恢复配置默认值。
开启请求采样统计
- 执行如下命令,开启请求采样统计。
PUT /_cluster/settings { "persistent": { "flowcontrol.statics.enabled": true, "flowcontrol.statics.threshold": 100, "flowcontrol.statics.sample_frequency": 50 } }
表5 请求采样统计的配置项说明 配置项
类型
说明
flowcontrol.statics.enabled
Boolean
请求采样统计开关。开启请求采样统计对节点性能会有影响。
取值范围:true、false
默认值:false
flowcontrol.statics.threshold
Integer
统计最近时间访问的请求数量。配置为100,表示会统计出最近访问最多的100个IP地址和基于采样统计的访问最多的100个URL。
最小值:10
最大值:1000
默认值:100
说明:- IP统计和URL采样统计基于访问时间缓存策略,节点会记录最近访问的IP和请求URL,如果缓存空间达到设置的阈值(即“flowcontrol.statics.threshold”配置值),访问时间距离现在最久的记录将被清除掉。
- URL采样统计当前基于URL hash值确认访问Path的一致性。
flowcontrol.statics.sample_frequency
Integer
Path采样频率。配置为100,表示每100个请求采样统计一次。
最小值:50
默认值:100
当所有参数值设置为“null”时,表示恢复配置默认值。
- 执行如下命令,关闭请求采样统计。
PUT /_cluster/settings { "persistent": { "flowcontrol.statics.enabled": false } }
开启一键断流
- 执行如下命令,开启一键断流。
PUT /_cluster/settings { "persistent": { "flowcontrol.break.enabled": true } }
- 执行如下命令,关闭一键断流。
PUT /_cluster/settings { "persistent": { "flowcontrol.break.enabled": false } }
查看流量控制信息
- 查看所有节点的流量控制情况
GET /_nodes/stats/filter
- 查看某个具体节点的流量控制情况
GET /_nodes/{nodeId}/stats/filter
“{nodeId}”为需要查看流量控制的节点ID。
返回值以Node级别分开,http记录并发和新建连接数据统计,memory记录内存流控统计,ip_address记录最近最多访问的客户端IP,url_sample记录采样的最近最多请求URL。cpu记录CPU流控统计。
{ "_nodes" : { "total" : 1, "successful" : 1, "failed" : 0 }, "cluster_name" : "css-flowcontroller", "nodes" : { "ElBRNCMbTj6L1C-Wke-Dnw" : { "name" : "css-flowcontroller-ess-esn-1-1", "host" : "10.0.0.133", "timestamp" : 1613979513747, "flow_control" : { "transport" : { "concurrent_req" : 0, "rejected_concurrent" : 0, "rejected_new" : 0, "rejected_deny" : 0 }, "http" : { "concurrent_req" : 0, "rejected_concurrent" : 0, "rejected_new" : 0, "rejected_deny" : 0 }, "memory" : { "memory_allow" : 41, "memory_rejected" : 0 }, "cpu": { "rejected_cpu" : 0 } "ip_address" : [ { "ip" : "/10.0.0.198", "count" : 453 }, { "ip" : "/198.19.49.1", "count" : 42 } ], "url_sample" : [ { "url" : "/*/_search?pretty=true", "method" : "GET", "remote_address" : "/10.0.0.198:16763", "count" : 1 } ] } } }
参数名 |
说明 |
---|---|
concurrent_req |
节点实际的TCP连接数据信息, 没有开启流控这个配置也会记录,参考GET /_nodes/stats/http接口current_open值, 但是会比这个值小,这里忽略了白名单IP和内部节点IP。 |
rejected_concurrent |
HTTP流控开启生效,关闭后不清零,开启流控期间拒绝的并发连接数。 |
rejected_new |
HTTP流控开启生效,关闭后不清零,开启流控期间拒绝的新建连接数。 |
rejected_deny |
HTTP流控开启生效,关闭后不清零,配置黑名单拒绝的请求数。 |
memory_allow |
内存流控开启生效,关闭后不清零,内存流控允许的请求数,触发内存流控后允许的请求数量,allow_path白名单中通过请求不会被记录,如果allow_path配置为“**”,所有请求都不会被记录。 |
memory_rejected |
内存流控开启生效,关闭后不清零,内存流控拒绝的请求数,触发内存流控后拒绝的请求数量,allow_path白名单中通过请求不会被记录,如果allow_path配置为“**”,所有请求都不会被记录。 |
rejected_cpu |
CPU流控开启生效,关闭后不清零,超过CPU流控阈值拒绝的请求数。 |
ip_address |
|
url_sample |
请求Path采样统计,基于配置时间和采样间隔统计相同请求URL数量。参数说明请参见表8。 |
开启并查看访问日志
- 执行如下命令,开启访问日志。
- 开启集群所有节点的访问日志
PUT /_access_log?duration_limit=30s&capacity_limit=1mb
- 开启集群中某一节点的访问日志
PUT /_access_log/{nodeId}?duration_limit=30s&capacity_limit=1mb
“{nodeId}”为节点ID。
表9 访问日志的配置项说明 配置项
类型
说明
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" : "" } ] } } }
表10 响应参数说明 参数名
说明
name
节点名称。
host
节点对应的IP地址。
count
统计周期内,访问节点的请求数量。
access
统计周期内,访问节点的请求详情。参数说明请参见表11。
- 查看集群所有节点的访问日志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 } }
表12 访问日志记录到文件的配置项说明 参数
类型
说明
flowcontrol.log.file.enabled
Boolean
是否将每个请求的日志详情记录到后台日志文件。
取值范围:- true
- false(默认值)
- 执行如下命令,关闭访问日志记录到文件。
PUT /_cluster/settings { "persistent": { "flowcontrol.log.file.enabled": false } }
开启CPU流控
- 执行如下命令,开启CPU流控。
PUT /_cluster/settings { "persistent": { "flowcontrol.cpu.enabled": true, "flowcontrol.cpu.percent_limit": 80, "flowcontrol.cpu.allow_path": ["index/_search"] } }
表13 访问日志的配置项说明 配置项
类型
说明
flowcontrol.cpu.enabled
Boolean
是否开启CPU流控。
取值范围:- true
- false(默认值)
flowcontrol.cpu.percent_limit
Integer
流控的阈值,在CPU使用率超过此阈值时触发流控。
默认值:90
flowcontrol.cpu.allow_path
List<String>
CPU流控白名单Path。
配置的路径不参与CPU流控,支持通配符配置。集群控制的查询类接口默认放通,不参与CPU流控,避免CPU达到阈值导致不能查询集群信息。
例如:
- "flowcontrol.memory.allow_path": "/index/_search",
- "flowcontrol.memory.allow_path": "/index*/_search",
- "flowcontrol.memory.allow_path": ["/index/_search", "/index1/_bulk"],
支持最大配置10个Path,每个Path最大长度限制小于32。
默认值为空。
当所有参数值设置为“null”时,表示恢复配置默认值。
- 执行如下命令,关闭CPU流控。
PUT /_cluster/settings { "persistent": { "flowcontrol.cpu.enabled": false } }