欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > ES的Refresh、Flush、Merge操作对性能的影响? ES如何实现近实时(NRT)搜索? ES聚合查询的Terms和Cardinality区别?

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

2025/5/29 3:46:00 来源:https://blog.csdn.net/weixin_45762066/article/details/148193160  浏览:    关键词: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}}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词