共计 3220 个字符,预计需要花费 9 分钟才能阅读完成。
ES 和传统关系型数据库有很多区别,比方传统数据中广泛都有一个叫“最大连接数”的设置。目标是使数据库系统工作在可控的负载下,避免出现负载过高,资源耗尽,谁也无奈登录的场面。
那 ES 在这方面有相似参数吗?答案是没有,这也是为何 ES 会被流量打爆的起因之一。
针对大并发拜访 ES 服务,造成 ES 节点 OOM,服务中断的状况,极限科技旗下的 INFINI Gateway 产品(以下简称“极限网关”)可从两个方面动手,保障 ES 服务的可用性。
- 限度最大并发拜访连接数。
- 限度非重要索引的申请速度,保障重要业务索引的访问速度。
上面咱们来具体聊聊。
架构图
所有拜访 ES 的申请都发给网关,可部署多个网关。
限度最大连接数
在网关配置文件中,默认有最大并发连接数限度,默认最大 10000。
entry: | |
- name: my_es_entry | |
enabled: true | |
router: my_router | |
max_concurrency: 10000 | |
network: | |
binding: $[[env.GW_BINDING]] | |
# See `gateway.disable_reuse_port_by_default` for more information. | |
reuse_port: true |
应用压测程序测试,看看达到 10000 个连贯后,是否限度新的连贯。
超过的连贯申请,被抛弃。更多信息参考官网文档。
限度索引写入速度
咱们先看看不做限度的时候,测试环境的写入速度,在 9w – 15w docs/s 之间稳定。尽管峰值很高,但不稳固。
接下来,咱们通过网关把写入速度管制在最大 1w docs/s。
对网关的配置文件 gateway.yml,做以下批改。
env: # env 下增加 | |
THROTTLE_BULK_INDEXING_MAX_BYTES: 40485760 #40MB/s | |
THROTTLE_BULK_INDEXING_MAX_REQUESTS: 10000 #10k docs/s | |
THROTTLE_BULK_INDEXING_ACTION: retry #retry,drop | |
THROTTLE_BULK_INDEXING_MAX_RETRY_TIMES: 10 #1000 | |
THROTTLE_BULK_INDEXING_RETRY_DELAY_IN_MS: 100 #10 | |
router: # route 局部批改 flow | |
- name: my_router | |
default_flow: default_flow | |
tracing_flow: logging_flow | |
rules: | |
- method: | |
- "*" | |
pattern: | |
- "/_bulk" | |
- "/{any_index}/_bulk" | |
flow: | |
- write_flow | |
flow: #flow 局部减少上面两段 | |
- name: write_flow | |
filter: | |
- flow: | |
flows: | |
- bulking_indexing_limit | |
- elasticsearch: | |
elasticsearch: prod | |
max_connection_per_node: 1000 | |
- name: bulking_indexing_limit | |
filter: | |
- bulk_request_throttle: | |
indices: | |
"test-index": | |
max_bytes: $[[env.THROTTLE_BULK_INDEXING_MAX_BYTES]] | |
max_requests: $[[env.THROTTLE_BULK_INDEXING_MAX_REQUESTS]] | |
action: $[[env.THROTTLE_BULK_INDEXING_ACTION]] | |
retry_delay_in_ms: $[[env.THROTTLE_BULK_INDEXING_RETRY_DELAY_IN_MS]] | |
max_retry_times: $[[env.THROTTLE_BULK_INDEXING_MAX_RETRY_TIMES]] | |
message: "bulk writing too fast" #触发限流告警 message 自定义 | |
log_warn_message: true |
再次压测,test-index 索引写入速度被限度在了 1w docs/s。
限度多个索引写入速度
下面的配置是针对 test-index 索引的写入速度管制。如果想增加其余的索引,新增一段配置即可。
比方,我容许 abc 索引写入达到 2w docs/s,test-index 索引最多不超过 1w docs/s,可配置如下。
- name: bulking_indexing_limit | |
filter: | |
- bulk_request_throttle: | |
indices: | |
"abc": | |
max_requests: 20000 | |
action: drop | |
message: "abc doc 写入超阈值" #触发限流告警 message 自定义 | |
log_warn_message: true | |
"test-index": | |
max_bytes: $[[env.THROTTLE_BULK_INDEXING_MAX_BYTES]] | |
max_requests: $[[env.THROTTLE_BULK_INDEXING_MAX_REQUESTS]] | |
action: $[[env.THROTTLE_BULK_INDEXING_ACTION]] | |
retry_delay_in_ms: $[[env.THROTTLE_BULK_INDEXING_RETRY_DELAY_IN_MS]] | |
max_retry_times: $[[env.THROTTLE_BULK_INDEXING_MAX_RETRY_TIMES]] | |
message: "bulk writing too fast" #触发限流告警 message 自定义 | |
log_warn_message: true |
限速成果如下
更多信息参考官网文档。
限度读申请速度
咱们先看看不做限度的时候,测试环境的读取速度,7w qps。
接下来咱们通过网关把读取速度管制在最大 1w qps。
持续对网关的配置文件 gateway.yml 做以下批改。
- name: default_flow | |
filter: | |
- request_path_limiter: | |
message: "Hey, You just reached our request limit!" rules: | |
- pattern: "/(?P<index_name>abc)/_search" | |
max_qps: 10000 | |
group: index_name | |
- elasticsearch: | |
elasticsearch: prod | |
max_connection_per_node: 1000 |
再次进行测试,读取速度被限度在了 1w qps。
限度多个索引读取速度
下面的配置是针对 abc 索引的写入速度管制。如果想增加其余的索引,新增一段配置即可。
比方,我容许 abc 索引读取达到 1w qps,test-index 索引最多不超过 2w qps,可配置如下。
- name: default_flow | |
filter: | |
- request_path_limiter: | |
message: "Hey, You just reached our request limit!" | |
rules: | |
- pattern: "/(?P<index_name>abc)/_search" | |
max_qps: 10000 | |
group: index_name | |
- pattern: "/(?P<index_name>test-index)/_search" | |
max_qps: 20000 | |
group: index_name | |
- elasticsearch: | |
elasticsearch: prod | |
max_connection_per_node: 1000 |
更多信息参考官网文档。
多个网关限速
限速是每个网关本身的管制,如果有多个网关,那么后端 ES 集群收到的申请数等于多个网关限速的总和。
本次介绍就到这里了。置信大家在应用 ES 的过程中也遇到过各种各样的问题。欢送大家来咱们这个平台分享本人的问题、解决方案等。如有任何问题,请随时分割我,期待与您交换!