极限科技旗下的 INFINI Gateway 产品(以下简称 “极限网关”)是一款神奇产品,它能够从两个方面入手,保障你的ES服务始终稳定可用:
限制最大并发访问连接数。
限制非重要索引的请求速度,保障重要业务索引的访问速度。
接下来我们来详细聊聊,探索 极限网关 是如何巧妙应对这个问题的秘密!
极限网关架构图
首先,我们来简单了解一下极限网关的构架吧。

极限网关将所有访问ES的请求牢牢掌握在手中。更酷的是,你可以根据需要部署多个网关,就像一支庞大的队伍,全面保障你的ES服务的安全和可用性。
限制最大连接数
就像是一道守门的防线,极限网关在其配置文件中设置了一个默认的最大并发连接数限制,默认最大 10000。当然,你也可以根据实际需求进行自定义调整,让极限网关更贴合你的业务需求。
entry:- name: my_es_entryenabled: truerouter: my_routermax_concurrency: 10000network:binding: $[[env.GW_BINDING]]# See `gateway.disable_reuse_port_by_default` for more information.reuse_port: true
让我们通过一个压测程序测试来验证一下极限网关的能力。在测试中,模拟超过10000个并发连接,然后观察极限网关是否能够有效地限制新的连接。

根据测试结果的观察,当连接请求超过极限网关的最大并发连接数时,多余的连接请求确实会被极限网关丢弃。

Tips

如果对此功能想要了解更多详细信息,可以参考极限网关的官方文档,其中将提供更全面的解释和指南。
限制索引写入速度
在开始测试极限网关在限制索引写入速度之前,我们先测试一下不作限制时的测试环境写入速度。在不作限制的情况下,测试环境的写入速度在 9w - 15w docs/s 之间波动。

尽管峰值很高,但它的不稳定性可能会导致系统的可靠性受到影响。接下来,我们通过修改极限网关的配置文件gateway.yml 让极限网关把写入速度控制在最大 1w docs/s 。
env: # env 下添加THROTTLE_BULK_INDEXING_MAX_BYTES: 40485760 #40MB/sTHROTTLE_BULK_INDEXING_MAX_REQUESTS: 10000 #10k docs/sTHROTTLE_BULK_INDEXING_ACTION: retry #retry,dropTHROTTLE_BULK_INDEXING_MAX_RETRY_TIMES: 10 #1000THROTTLE_BULK_INDEXING_RETRY_DELAY_IN_MS: 100 #10router: # route 部分修改 flow- name: my_routerdefault_flow: default_flowtracing_flow: logging_flowrules:- method:- "*"pattern:- "/_bulk"- "/{any_index}/_bulk"flow:- write_flowflow: #flow 部分增加下面两段- name: write_flowfilter:- flow:flows:- bulking_indexing_limit- elasticsearch:elasticsearch: prodmax_connection_per_node: 1000- name: bulking_indexing_limitfilter:- 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
通过对配置文件进行修改,成功地控制了写入速度。现在,进行再次的压测测试。

我们可以观察到写入速度稳定在 1w docs/s。这表明极限网关成功限制了写入速度,确保了系统的稳定性和可靠性。
限制多个索引写入速度
当你想要限制多个索引的写入速度时,可以在极限网关的配置文件中新增一段配置来实现。

Example

让我们来设定一个场景,在该场景中,我允许 abc 索引写入达到 2w docs/s,test-index 索引最多不超过 1w docs/s 。下面是我的配置文件:
- name: bulking_indexing_limitfilter:- bulk_request_throttle:indices:"abc":max_requests: 20000action: dropmessage: "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
限速效果如下:

我们可以观察到两个索引的写入速度稳定在我所设定的限制下。

Tips

如果对此功能想要了解更多详细信息,可以参考极限网关的官方文档,其中将提供更全面的解释和指南。
限制读请求速度
让我们先看看对读请求速度不做限制的时候的吞吐请情况。

在没有限制的情况下,测试环境的读取速度为 7w qps 。通过对极限网关的配置进行适当的修改,我们可以将读取请求的速度限制在 1w qps。
- name: default_flowfilter:- request_path_limiter:message: "Hey, You just reached our request limit!" rules:- pattern: "/(?P<index_name>abc)/_search"max_qps: 10000group: index_name- elasticsearch:elasticsearch: prodmax_connection_per_node: 1000
再次进行测试,可以发现读取速度被限制在了 1w qps 。

限制多个索引读取速度
如果要限制多个索引的读取速度,和限制多个索引写入速度一样,我们也可以在极限网关的配置文件中新增配置就能实现了。

Example

让我们来设定一个场景,在该场景中,我们允许 abc 索引读取达到 1w qps,test-index 索引最多不超过 2w qps 。下面是我的配置文件:
- name: default_flowfilter:- request_path_limiter:message: "Hey, You just reached our request limit!"rules:- pattern: "/(?P<index_name>abc)/_search"max_qps: 10000group: index_name- pattern: "/(?P<index_name>test-index)/_search"max_qps: 20000group: index_name- elasticsearch:elasticsearch: prodmax_connection_per_node: 1000
限速效果如下:

我们可以观察到两个索引的读取速度稳定在我们所设定的限制下。

Tips

如果对此功能想要了解更多详细信息,可以参考极限网关的官方文档,其中将提供更全面的解释和指南。
多个网关限速
限速是每个网关自身的控制,如果有多个网关,那么后端 ES 集群收到的请求数等于多个网关限速的总和。


Conclusion

本次介绍就到这里了!!在使用ES的旅程中,我们都曾面对各种挑战和困惑。但是,别担心!我们的平台随时欢迎你,和大家一起分享问题、解决方案以及那些让你犯难的情况。
现在就行动起来,加入我们的社区,让我们一起探索ES的奇妙之处吧!
无论你遇到什么问题,都请毫不犹豫地与我联系。我将竭诚为你提供帮助,解答你的疑问。期待与你展开一场精彩的交流,让我们共同成长,共同面对ES世界的挑战!

关于 INFINI Gateway

极限网关 (INFINI Gateway) 是一个面向 Elasticsearch 的高性能应用网关,它包含丰富的特性,使用起来也非常简单。极限网关工作的方式和普通的反向代理一样,我们一般是将网关部署在 Elasticsearch 集群前面, 将以往直接发送给 Elasticsearch 的请求都发送给网关,再由网关转发给请求到后端的 Elasticsearch 集群。因为网关位于在用户端和后端 Elasticsearch 之间,所以网关在中间可以做非常多的事情, 比如可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。
官网文档:
https://infinilabs.com/docs/latest/gateway





