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

ES的Refresh、Flush、Merge操作对性能的影响? ES如何实现近实时(NRT)搜索? ES聚合查询的Terms和Cardinality区别?

一、Refresh/Flush/Merge机制与性能影响
  1. Refresh(刷新)
  • 作用:将内存缓冲区(In-memory buffer)数据写入文件系统缓存生成新段(Segment),使文档可被搜索
  • 性能影响:
    • 默认每秒自动执行,保证近实时搜索(NRT)
    • 频繁手动刷新会降低索引吞吐量
    • 配置建议:index.refresh_interval = 30s(写入密集型场景)
  1. Flush(刷盘)
  • 作用:
    1. 将文件系统缓存数据持久化到磁盘
    2. 清空事务日志(Translog)
    
  • 性能影响:
    • 触发条件:Translog大小阈值(默认512MB)或时间阈值(30分钟)
    • 涉及磁盘IO,高频率刷盘会显著影响集群性能
  1. Merge(段合并)
  • 作用:合并多个小段为更大段,提升查询性能
  • 性能影响:
    // 合并策略配置示例
    PUT /index/_settings {"index.merge.policy": {"max_merged_segment": "5gb",    // 最大合并段大小"segments_per_tier": 10         // 每层段数量}
    }
    
    • 后台线程自动执行,消耗大量IO/CPU资源
    • 强制合并(_forcemerge)建议在业务低峰期执行

开发建议 :

  1. 优先使用默认配置,确有性能瓶颈时再调整
  2. 高负载场景可增大Refresh间隔减少IO压力
  3. 避免频繁执行_flush和_forcemerge等手动操作
  4. 监控 indices.refresh.time 和 merges 相关指标辅助调优
二、近实时(NRT)搜索原理
一、全称与核心原理
  1. 全称
    Near Real-Time(近实时)

  2. 实现原理

数据写入流程:
1. 文档写入内存缓冲区(1ms内完成)
2. 通过refresh操作将数据刷到文件系统缓存(默认1秒)
3. 新生成的段(Segment)对搜索可见
4. Translog保障数据持久化(崩溃恢复)
二、开发者实践指南
  1. 配置优化
// 调整refresh间隔(trade-off实时性与吞吐量)
PUT /your_index/_settings {"index.refresh_interval": "30s"  // 默认1s,写入密集型场景建议调大
}
  1. 强制刷新API
# 立即刷新使新文档可搜索(生产环境慎用)
POST /your_index/_refresh?pretty
  1. 近实时写入模式
// Java客户端写入时指定刷新策略
IndexRequest request = new IndexRequest("your_index");
request.source(jsonMap, XContentType.JSON);
request.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL);  // 可选值:IMMEDIATE, WAIT_UNTIL, NONE
  1. 可靠性保障
通过Translog机制实现:
- 每个分片维护自己的事务日志
- 默认配置下每隔5s刷盘(index.translog.sync_interval)
- 超过512MB自动刷盘(index.translog.flush_threshold_size)
三、性能优化建议
  1. 写入场景
高吞吐场景:- refresh_interval调至30s-1min- 关闭副本(index.number_of_replicas: 0)初始化时- 使用bulk API批量写入
  1. 查询场景
实时性要求高时:
PUT /your_index/_settings {"index.search.idle.after": "0s"  // 禁用查询缓存自动过期
}
  1. 监控指标
# 查看refresh统计
GET /_stats/refresh?pretty# 查看segment状态
GET /_cat/segments?v&h=index,segment,size,committed,search
三、Terms vs Cardinality聚合
特性Terms聚合Cardinality聚合
用途统计每个唯一值的出现次数估算字段唯一值数量(基数)
精度精确统计基于HyperLogLog++算法(误差率0.5%)
内存消耗高(存储所有唯一值)低(固定大小寄存器)
适用场景分类统计(如热门商品TOP10)UV统计(如独立访客数)

示例场景:

// Terms聚合 - 统计热门商品
{"aggs": {"popular_items": {"terms": { "field": "product_id","size": 10}}}
}// Cardinality聚合 - 统计独立用户数 
{"aggs": {"unique_users": {"cardinality": {"field": "user_id","precision_threshold": 1000}}}
}

相关文章:

  • Linux的读写屏障
  • Matlab实战训练项目推荐
  • 每日c/c++题 备战蓝桥杯(洛谷P1873 EKO砍树问题详解)
  • 打卡day35
  • 嵌入式开发之STM32学习笔记day10
  • DNS Server在高可用高并发系统中的应用
  • 探秘Transformer系列之(34)--- 量化基础
  • 【VBA中的集合(Collection)的引用和方法参数】 VS 字典(Dictionary)
  • 【无标题】python执行系统命令
  • Python 训练营打卡 Day 34
  • 基于Springboot + vue3实现的养老系统
  • 电子电路:再谈滤波原理及其应用
  • 卷积神经网络优化与应用实践:参数设置、泛化能力提升及多领域应用解析
  • LeetCode 3362.零数组变换 III:贪心+优先队列+差分数组——清晰题解
  • 6个月Python学习计划 Day 3
  • 【第四篇】 SpringBoot整合第三方技术
  • 【Linux 学习计划】-- git 在Linux远端服务器上的部署与简单使用
  • Ubuntu24安装Ollama
  • Java三十而立:Java 的30岁与Spring AI 1.0正式发布
  • ABC406E 题解
  • 自己开发app的软件下载/seo提供服务
  • 宁夏网站建设优化/百度一下首页网址
  • 韩国flash网站/百度seo关键词优化方案
  • 动漫制作教学/网站建设优化的技巧
  • 附近学电脑在哪里报名/重庆seo公司
  • 怎么成立网站/黑龙江网络推广好做吗