当前位置: 首页 > 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}}}
}
http://www.xdnf.cn/news/625123.html

相关文章:

  • R基于多元线性回归模型实现汽车燃油效率预测及SHAP值解释项目实战
  • TDengine 高可用——双活方案
  • 爬虫实战之爬微博图片:xpath的具体运用
  • maven 3.0多线程编译提高编译速度
  • C++类型转换
  • Flink运行架构及并行度设置
  • 9.4在 VS Code 中配置 Maven
  • [C++]洛谷B3626 跳跃机器人(题干 + 详细讲解, BFS练习题)
  • 安卓11 不带谷歌包默认桌面布局
  • android studio 开启无线调试
  • JVM 的垃圾回收机制 GC
  • QT写槽函数的注意事项
  • 第1周 神经网络基石: 从零构建你的第一个模型
  • 深入理解设计模式之适配器模式
  • 类和对象(1)
  • ai陪伴项目——Android app开发
  • Spring框架--IOC技术
  • 国际前沿知识系列三:解决泛化能力不足问题
  • pytest+allure+allure-pytest 报告输出遇到的问题汇总
  • 计算机网络学习(五)——TCP
  • 【JVM 05-JVM内存结构之-堆】
  • 2025.5个人感悟
  • xdvipdfmx:fatal: File ended prematurely. No output PDF file written.
  • 企业批量处理刚需PrintPDF 网络财务办公打印 网页到 Office 一键转 PDF
  • 二十五、面向对象底层逻辑-SpringMVC九大组件之HandlerMapping接口设计
  • webpack中常见语句命令
  • 使用CodeBuddy实现网页自动连点器
  • OSPF ABR汇总路由
  • 网络层IP协议
  • 无法同步书签,火狐浏览器修改使用国内的账号服务器