暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何防止 Elasticsearch 服务 OOM ?极限网关来为你的 ES 服务保驾护航!

嘿,小伙伴们!今天我要和大家聊一个热门话题!

Elasticsearch(ES)和传统关系型数据库到底有什么不同。你知道吗?在传统数据库中,我们经常会碰到一个叫做"最大连接数"的限制。这个设置的目的是为了让数据库在可控的负载范围内运行,避免出现负载过高、资源耗尽的尴尬场景,导致谁都无法登录的窘境。


但是,ES在这方面可不一样哦!它没有类似的参数设定,这也是为什么ES经常被激增的流量打得七零八落的原因之一。别着急,今天我要向大家介绍一款绝佳的解决方案——极限网关


极限科技旗下的 INFINI Gateway 产品(以下简称 “极限网关”)是一款神奇产品,它能够从两个方面入手,保障你的ES服务始终稳定可用:

  1. 限制最大并发访问连接数。

  2. 限制非重要索引的请求速度,保障重要业务索引的访问速度。


接下来我们来详细聊聊,探索 极限网关 是如何巧妙应对这个问题的秘密!


极限网关架构图


首先,我们来简单了解一下极限网关的构架吧。


极限网关将所有访问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个并发连接,然后观察极限网关是否能够有效地限制新的连接。


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

    Tips

    如果对此功能想要了解更多详细信息,可以参考极限网关的官方文档,其中将提供更全面的解释和指南。


    限制索引写入速度


    在开始测试极限网关在限制索引写入速度之前,我们先测试一下不作限制时的测试环境写入速度。在不作限制的情况下,测试环境的写入速度在 9w - 15w docs/s 之间波动。


    尽管峰值很高,但它的不稳定性可能会导致系统的可靠性受到影响。接下来,我们通过修改极限网关的配置文件gateway.yml 让极限网关把写入速度控制在最大 1w docs/s

      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


      通过对配置文件进行修改,成功地控制了写入速度。现在,进行再次的压测测试。


      我们可以观察到写入速度稳定在 1w docs/s。这表明极限网关成功限制了写入速度,确保了系统的稳定性和可靠性。

      限制多个索引写入速度


      当你想要限制多个索引的写入速度时,可以在极限网关的配置文件中新增一段配置来实现。


      Example

      让我们来设定一个场景,在该场景中,我允许 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


        限速效果如下:


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

        Tips

        如果对此功能想要了解更多详细信息,可以参考极限网关的官方文档,其中将提供更全面的解释和指南。


        限制读请求速度


        让我们先看看对读请求速度不做限制的时候的吞吐请情况。


        在没有限制的情况下,测试环境的读取速度为 7w qps 。通过对极限网关的配置进行适当的修改,我们可以将读取请求的速度限制在 1w 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
               - elasticsearch:
                   elasticsearch: prod
                   max_connection_per_node: 1000


          再次进行测试,可以发现读取速度被限制在了 1w qps


          限制多个索引读取速度


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


          Example

          让我们来设定一个场景,在该场景中,我们允许 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


            限速效果如下:


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


            Tips

            如果对此功能想要了解更多详细信息,可以参考极限网关的官方文档,其中将提供更全面的解释和指南。


            多个网关限速


            限速是每个网关自身的控制,如果有多个网关,那么后端 ES 集群收到的请求数等于多个网关限速的总和。


            Conclusion

            本次介绍就到这里了!!在使用ES的旅程中,我们都曾面对各种挑战和困惑。但是,别担心!我们的平台随时欢迎你,和大家一起分享问题、解决方案以及那些让你犯难的情况。


            现在就行动起来,加入我们的社区,让我们一起探索ES的奇妙之处吧!


            提供帮助

            无论你遇到什么问题,都请毫不犹豫地与我联系。我将竭诚为你提供帮助,解答你的疑问。期待与你展开一场精彩的交流,让我们共同成长,共同面对ES世界的挑战!


            关于 INFINI Gateway



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


            官网文档:

            https://infinilabs.com/docs/latest/gateway


            文章转载自铭毅天下Elasticsearch,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论