当前位置: 首页 > article >正文

Elasticsearch 集群如何进行读写限流?

随着业务规模的扩大,Elasticsearch(以下简称 ES)集群面临的并发请求压力呈指数级增长。

高并发场景下,集群极易因资源耗尽导致性能雪崩,甚至触发级联故障。

52a636be566b7ac5a14a2907db30fb63.png

本文将介绍如何通过极限网关的节点级流量控制功能,实现对 ES 集群的精准限流保护。

46885f4a0beed04fdebf0b2e8ad8b7fb.jpeg


一、为什么需要节点级流量控制?

1.1 传统限流方案的局限性

E 原生的限流能力较为薄弱,开发者通常只能通过调整 bulk size并发线程数等应用层参数进行间接控制。

786a6b7785e63b2c5b0578a19a963c25.png

——参考:https://elasticsearch.cn/question/11098

这种方式存在两个致命缺陷:

  • 无法精确控制流量带宽:写入场景下突发的大文档可能瞬间打满网络。

  • 缺乏全局视角:单个节点的过载可能引发集群级性能震荡。

1.2 节点级流量控制的价值

极限网关创新性地提出以节点为单位的立体化限流模型,通过四大核心参数实现多维度管控:

  • 流量速率(QPS、带宽)

  • 并发连接数

  • 异常熔断机制

  • 等待队列管理

官方文档地址:

https://docs.infinilabs.com/gateway/main/zh/docs/references/elasticsearch/


二、极限网关限流实战配置详解

2.1 基础架构示例(已验证ok)

f0c81dc186c0af3ed82430bfe89f0e2a.png

elasticsearch:
-name:prod
enabled:true
endpoint:https://127.0.0.1:9200
basic_auth:
      username:elastic
      password:changeme
traffic_control:
      enabled:true
      max_qps_per_node:100     # 单节点每秒最大请求数(测试用)
      max_bytes_per_node:104857600# 单节点每秒100MB带宽
      max_connection_per_node:500   # 单节点最大连接数
      max_wait_time_in_ms:5000     # 超时等待5秒
      
entry:
-name:my_es_entry
    enabled:true
    router:my_router
    max_concurrency:10000
    network:
      binding:0.0.0.0:8000
    tls:
      enabled:true

-name:my_unsecure_es_entry
    enabled:true
    router:my_router
    max_concurrency:10000
    network:
      binding:0.0.0.0:8001
    tls:
      enabled:false

router:
-name:my_router

2.2 参数解析表

参数

类型

说明

生产环境建议值

max_qps_per_node

int

节点级请求速率天花板

根据节点规格动态计算

max_bytes_per_node

int

节点级带宽限制(字节)

网络带宽的70%-80%

max_connection_per_node

int

防止连接风暴

CPU核心数*200

max_wait_time_in_ms

int

排队最大等待时长

根据业务容忍度设置


三、高频问题解答

Q1:如何精确控制写入速率?

通过组合控制实现双重保障:

traffic_control:
  max_qps_per_node: 500       # 控制每秒批量操作次数
  max_bytes_per_node: 52428800 # 限制50MB/s写入带宽

这种组合策略既能防止高频小文档冲击,又能避免大文档突发传输。

Q2:限流触发后的处理策略?

网关提供智能队列管理(可参见如下官方提供参数):

  1. 请求进入缓冲队列等待处理(最长5秒)

    1. traffic_control.max_wait_time_in_ms 参数

      1. 作用:定义请求在缓冲队列中的最长等待时间。

      2. 默认值:10000 毫秒(10 秒)。

      3. 用户配置:若需设置最长 5 秒等待时间,需将此参数设为 5000。

 2.超时请求返回429 Too Many Requests(可以自定义实现)

 3.自动熔断异常节点(结合allow_access_when_master_not_found


四、高级调优技巧

4.1 动态权重分配

为不同业务分配差异化配额(如下没有做验证):

# 日志集群侧重吞吐量
-name:logs-cluster
traffic_control:
    max_bytes_per_node:209715200

# 交易集群侧重低延迟  
-name:order-cluster
traffic_control:
    max_qps_per_node:2000
    max_wait_time_in_ms:2000

4.2 监控联动方案

cacfc93b219f70a45885daf5978bdb0b.png



五、效果对比

未启用限流

bbc6dbb8ead22046d6a565bf0e852a52.png

启用后效果

68ef01e424eb83de69aed376bfbda2ea.png

上述测试方案是使用 Python 脚本对 Elasticsearch 集群执行高并发搜索请求的压力测试,旨在评估指定索引(test_index_0618)在特定查询场景下的性能表现。

代码详见:

https://articles.zsxq.com/id_w070ou36d8rw.html

方案通过并发控制(50个线程),持续60秒,以随机生成的查询条件模拟真实用户请求,并以每秒1000次查询(QPS)为目标,测试Elasticsearch服务的实际承载能力及稳定性,最终输出成功请求数、失败请求数、实际达成的QPS,以及目标QPS的达成率,帮助开发者评估集群性能及优化空间。

8a39d0147713db19c63dccd6d2e53437.png

极限控制台监控结果图1

80a520af7cb902ecbe482569d2ab20c1.png

极限控制台监控结果图2

通过节点级立体化限流,我们可成功保障集群稳定性。

建议生产环境部署时,先进行压力测试确定基线值,再逐步优化参数组合。


让 Kibana 更安全、更灵活——用极限网关一键搞定

极限网关可视化——Elasticsearch 请求流量分析实战

给 Elasticsearch "穿上盔甲"——极限网关一招搞定 TLS  安全防护

极限网关 INFINI Gateway 配置文件核心解读

极限网关 INFINI Gateway  从 0 到 1:简单易懂的入门教程

公司有系统 Elasticsearch 查询传入 10 万个字符的 Query,导致集群爆掉,怎么办?

Elasticsearch 中如何限制和指定 IP 地址的访问?

图片

更短时间更快习得更多干货!

和全球2000+ Elastic 爱好者一起精进!

elastic6.cn——ElasticStack进阶助手

图片

抢先一步学习进阶干货!


http://www.kler.cn/a/583443.html

相关文章:

  • 【Java】——数据类型和变量
  • 【算法】图论 —— Dijkstra算法 python
  • Windows 图形显示驱动开发-WDDM 3.2-用户模式工作提交(一)
  • 卷积神经网络(CNN):深度解析其原理与特性
  • 从数据到决策:Ubuntu工控机的工业应用实践
  • ubuntu2404 安装 过程中 手动设置网络
  • Oracle常用分析诊断工具(9)——ASH
  • 进程(下)【Linux操作系统】
  • Python网络爬虫之requests库的使用方法
  • [论文阅读]Certifiably Robust RAG against Retrieval Corruption
  • [算法] 两数之和(simple)
  • 基于Python实现手写数字识别
  • Dynamics 365 新版的Power apps开发界面中如何找到开发者资源
  • vscode bookmarks插件的安装,方便切换代码
  • 大模型助力自我提升:零基础实用指南
  • Spring(1)——mvc概念,部分常用注解
  • 【MySQL】用户管理和权限
  • 【C++】二叉搜索树(二叉查找树、二叉排序树)详解
  • angular中下载接口返回文件
  • 大一新生备战蓝桥杯c/c++B组——2024年省赛真题解题+心得分享