首页 > 其他分享 >如何防止 Elasticsearch 服务 OOM ?

如何防止 Elasticsearch 服务 OOM ?

时间:2024-03-03 20:47:28浏览次数:20  
标签:THROTTLE env OOM max INDEXING flow BULK Elasticsearch 防止

ES 和传统关系型数据库有很多区别, 比如传统数据中普遍都有一个叫“最大连接数”的设置。目的是使数据库系统工作在可控的负载下,避免出现负载过高,资源耗尽,谁也无法登录的局面。

那 ES 在这方面有类似参数吗?答案是没有,这也是为何 ES 会被流量打爆的原因之一。

针对大并发访问 ES 服务,造成 ES 节点 OOM,服务中断的情况,极限科技旗下的 INFINI Gateway 产品(以下简称 “极限网关”)可从两个方面入手,保障 ES 服务的可用性。

  1. 限制最大并发访问连接数。
  2. 限制非重要索引的请求速度,保障重要业务索引的访问速度。

下面我们来详细聊聊。

架构图


所有访问 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 的过程中也遇到过各种各样的问题。欢迎大家来我们这个平台分享自己的问题、解决方案等。如有任何问题,请随时联系我,期待与您交流!

标签:THROTTLE,env,OOM,max,INDEXING,flow,BULK,Elasticsearch,防止
From: https://www.cnblogs.com/infinilabs/p/18050656

相关文章

  • 自如月租计算 ziroom
    前言自如的房子月租看似不高,实际上它是收中介费的,加上中介费和未满一年的押金,房租其实非常高。普通中介费一般收1个月,自如的中介费美名其曰服务费(除了网费想不到有什么用的),一年为1.2个月租金。下面的程序帮助你计算月付和季付平均每个月的房租。(在不退押金的情况下)因为未......
  • ElasticSearch系列---【linux离线安装elasticsearch7.8集群】
    linux离线安装elasticsearch7.81.官网下载地址https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-8-02.上传到服务器指定目录例如这里我上传到/opt/app/middles/目录下3.解压软件#解压缩tar-zxvfelasticsearch-7.8.0-linux-x86_64.tar.gz4.创建用户......
  • ElasticSearch系列---【es设置开机启动】
    1.在/etc/systemd/system目录下创建elasticsearch1.service注意:如果您的系统使用的不是Systemd,请根据您的init系统调整命令(如Upstart或SysVinit)。如果在同一台机器启动多个节点,就按照本文再创建elasticsearch2.service就行了。下面是elasticsearch1.service脚本内容把目录/......
  • 华企盾DSC数据防泄密系统如何防止文件被非法复制?
    华企盾DSC数据防泄密系统通过一系列精细的控制策略防止文件被非法复制:文件加密:将敏感文件加密,只有授权的用户才能解密进行访问,非授权用户即便复制了文件,也无法打开查看文件内容。U盘管制:通过设定U盘使用规则,例如禁止U盘读写或限制U盘读写速度,防止敏感数据被直接复制到U盘。......
  • Linux 环境下搭建 ElasticSearch
    centos8环境下搭建ElasticSearch7.8一、安装:复制下载链接地址,并使用wget命令下载对应的压缩包。例如:wgethttps://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.0-linux-x86_64.tar.gz下载完成后,解压压缩包:tar-xzvfelasticsearch-7.8.0-linux-x86......
  • Elasticsearch 系列(三)- ES的基本操作
    本章将和大家分享Elasticsearch的一些基本操作。话不多说,下面我们直接进入主题。一、索引库操作1、settings属性settings属性可以设置索引库的一些配置信息,例如:配置分片数和副本数、配置自定义分词器等。其中分片数量只能在一开始创建索引库的时候指定,后期不能修改。副本数......
  • elasticsearch开启慢查询
    环境:OS:Centos7ES:6.8.5 1.查看索引的设置curl-uelastic:123456-XGET"http://192.168.1.69:19200/hospital_info_demo3/_settings?pretty" 2.搜索部分设置query和fetch慢查询curl-uelastic:123456-XPUT"http://192.168.1.69:19200/hospital_info_demo3/_setting......
  • iexcel-excel 读取和写入,解决 excel OOM 问题
    项目简介IExcel用于优雅地读取和写入excel。避免大excel出现oom,简约而不简单。特性一行代码搞定一切OO的方式操作excel,编程更加方便优雅。sax模式读取,SXSS模式写入。避免excel大文件OOM。基于注解,编程更加灵活。设计简单,注释完整。方便大家学习改造......
  • 美团面试:说说OOM三大场景和解决方案? (绝对史上最全)
    首先,咱们先聊聊,什么是OOM?小伙伴们,有没有遇到过程序突然崩溃,然后抛出一个OutOfMemoryError的异常?这就是我们俗称的OOM,也就是内存溢出。简单来说,就是你的Java应用想要的内存超过了JVM愿意给的极限,就会抛出这个错误。那么为什么会出现OOM呢?一般都是由这些问题引起:分配过少:JVM......
  • 安卓开发一个功能并将数据存储到Room中的流程以及注意事项
    开发流程与注意事项添加Room依赖:确保在build.gradle文件中添加了Room的依赖项。注意使用kapt插件而不是annotationProcessor来处理注解以及这二者之间的兼容性关系。定义实体(Entity):创建一个或多个实体类,用@Entity注解标记,表示数据库中的表。创建数据访问对象(DAO):定义一个接口,使......