这两周主要看了下 Elasticsearch(其实是Lucene)的 segments 的 merge 流程。事情起因是,线上的ES有些大索引,其中的segments 个数几十个,每个大小100M+,小 segments 若干,而遇到问题就是这些大的 segments 不再做 merge 了,除非强制进行forceMerge 操作,由于我们第一次ES上线,其实也不清楚这究竟是个问题还是本来 Lucene 就是这样,网上找了一些关于ES 或者 Lucene 的 merge 的策略介绍,除了说道大家都了解的一些常规的参数,如最大size,最大doc 下不会再做merge云云,就是没提到到了多少个 segments 之后就不 merge ,接着问了Elasticsearch 圈子的一些人,也没有找到非常确定的答案。查找几天资料无果,顺带就看看源码,最终在昨天又瞄了几眼终于发现一段算法,虽无验证,但应八九不离十,故记录分享之。


Segments

首先还是先重温一下 Lucene 下的 segments,对这个比较陌生的可以阅读三斗大神的这一节

  • segment、buffer和translog对实时性的影响

Lucene产生segments示意图

我只引用最下面那张图介绍一下,绿色的就是已经固化的一个个的 segments 文件,不会再更新,左下角就是当前在内存的 Lucene 维护的查询可见的仍为持久化的segment,当Elasticsearch 配置的refresh_invterval (默认是1s,可调)到时,这些in in-memory buffer就会推送到OS的文件系统缓存中去,注意这里只是到缓存,很可能OS仍未持久化到文件系统,成为一个单独的 segment 文件,而啥时commit 到文件系统永不丢失,则由Lucene 的flush 机制保证,当Lucene 做完flush 则表明该 segment 真正推送到文件系统,此时才会在translog做标记并可以删除commit之前的translog 了。

注意这里只是一个简化描述,据三斗和赖总介绍,Lucene 仍有很多因素会促使产生一个segment 而不是百分百由Elasticsearch的refresh_interval 决定。这里就不继续讨论究竟在哪些情况会立即生成一个segment了。

Segment 的merge

详细信息可看三斗这一节 这里只引用两个图介绍一下

merge前

merge后

从图上看,Lucene每次会选取一些小的segments 进而merge到一个大的segment,我这里不再赘述流程和策略,这里只补充一句就是,如果你之前用的scroll查询,之前的scroll还是会指向老的segments,也就是说老的segments 的引用会知道scroll失效后才会被回收。


Elasticsearch 5.x merge 参数的变化

在老的Elasticsearch 中,merge 被认为是一个非常消耗资源的操作,甚至只有一个线程来做这事,并且会影响indexing的request。在之前的版本里,merge 操作用的是一类 merge throttle limit这样的配置来限制各种峰值数据,如下面这些参数,注意这些参数都已经在5.x 中移除掉了。

  • indices.store.throttle.type
  • indices.store.throttle.max_bytes_per_sec

因为在Elasticsearch 5.x 想采用多线程和动态调整这种方式来更加智能地去执行merge操作。如检测是否使用SSD硬盘,应该启动多少个merge线程等。
在Elasticsearch 5.x 下,tired merge policy 成为了唯一的merge策略。因此下面的参数同样也在5.x 下被移除了。

  • index.merge.policy.type
  • index.merge.policy.min_merge_size
  • index.merge.policy.max_merge_size
  • index.merge.policy.merge_factor
  • index.merge.policy.max_merge_docs
  • index.merge.policy.calibrate_size_by_deletes
  • index.merge.policy.min_merge_docs
  • index.merge.policy.max_merge_docs

如上面说的,ES希望采用一种更智能的方式去调整这些参数,达到一个性能的折中。在5下我们可以配置这些参数:

  • index.merge.policy.expunge_deletes_allowed: 指删除了的文档数在一个segment里占的百分比,默认是10,大于这个值时,在执行expungeDeletes 操作时将会merge这些segments.
  • index.merge.policy.floor_segment: 官网的解释我没大看懂,我的个人理解是ES会避免产生很小size的segment,小于这个阈值的所有的非常小的segment都会做merge直到达到这个floor 的size,默认是2MB.
  • index.merge.policy.max_merge_at_once: 一次最多只操作多少个segments,默认是10.
  • index.merge.policy.max_merge_at_once_explicit: 显示调用optimize 操作或者 expungeDeletes时可以操作多少个segments,默认是30.
  • index.merge.policy.max_merged_segment: 超过多大size的segment不会再做merge,默认是5g.
  • index.merge.policy.segments_per_tier: 每个tier允许的segement 数,注意这个数要大于上面的at_once数,否则这个值会先于最大可操作数到达,就会立刻做merge,这样会造成频繁
  • index.reclaim_deletes_weight: 考虑merge的segment 时删除文档数量多少的权重,默认即可.
  • index.compund_format: 还不知道干啥用的,默认即可.

merge 线程调整

Elasticsearch 5 采用了多线程去执行merge,可以通过修改index.merge.scheduler.max_thread_count 来动态调整这个线程数,默认的话是通过下面公式去计算:

elasticsearch merge相关推荐

  1. elasticsearch index 之merge

    merge是lucene的底层机制,merge过程会将index中的segment进行合并,生成更大的segment,提高搜索效率.segment是lucene索引的一种存储结构,每个segment都 ...

  2. Elasticsearch 5.x segments merge 流程分析

    2019独角兽企业重金招聘Python工程师标准>>> Elasticsearch 5.x  segments merge 流程分析 这两周主要看了下 Elasticsearch(其 ...

  3. 【elasticsearch】es直接put一个数据到es Can‘t merge because of conflicts Cannot update enabled setting _source

    1.背景 执行命令,然后想直接建立索引,并且添加数据,但是报错了,到页面查看的时候,发现索引已经建立了. PUT /re_index_one3/product/1 {"id":2, ...

  4. Elasticsearch 知识点目录

    2019独角兽企业重金招聘Python工程师标准>>> 经过一段时间的编写,完成了第一个版本的Elasticsearch书籍的编写,目录结构如下: 1 Elasticsearch入门 ...

  5. 解密Elasticsearch技术,腾讯开源的万亿级分布式搜索分析引擎

    「免费学习 60+ 节公开课:投票页面,点击讲师头像」 作者 | johngqjiang,腾讯 TEG 云架构平台部研发工程师 来源 | 腾讯技术工程(ID:Tencent_TEG) [导读]Elas ...

  6. 图解ElasticSearch 搜索原理

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:https://www.cnblogs.com/ri ...

  7. 腾讯Elasticsearch海量规模背后的内核优化剖析

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:黄华,腾讯 TEG 云架构平台部研发工程师 背景 Elast ...

  8. 腾讯万亿级 Elasticsearch 技术解密

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者: johngqjiang,腾讯 TEG 云架构平台部研发工程 ...

  9. 别再说你不会 ElasticSearch 调优了,都给你整理好了

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://tinyurl.com/y4gnzbje 第一 ...

最新文章

  1. MIT用19个神经元实现自动驾驶控制,灵感来自秀丽隐杆线虫
  2. C 语言编程 — 使用 assert 断言进行程序设计
  3. pytorch randomresizedcrop
  4. azkaban工作流调度器及相关工具对比
  5. PHP 学习总结之变量
  6. 如何区分Oracle的数据库,实例,服务名,SID
  7. 我的世界方块云服务器bug,我的世界:两个方块能无限刷经验?这装置太BUG了
  8. windows添加删除程序打不开解决方案
  9. springboot使用JdbcTemplate完成对数据库的增删改查
  10. 7000块招不了一个工人
  11. 用java编写一个学生类
  12. NLP 自然语言分析理解
  13. 《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)--宋宝华...
  14. 极客大学架构师训练营-架构师技术图谱-大作业二
  15. 韩语输入法,了解一下
  16. 洛谷P3332 K大数查询
  17. linux开机自动启动sh脚本
  18. Your account has been flagged. Because of that, your profile is hidden from the public. If you belie
  19. java使用bks双向认证_GitHub - wanglijun93/RxHttpUtils: Rxjava+Retrofit封装,便捷使用
  20. 课设复习之信息论自适应算术编码与译码

热门文章

  1. 购物兔下载量突破17万!
  2. 关于我对stm32看门狗的一些理解(基于正点原子)
  3. MAC OS获取root权限方法
  4. uniapp - 最详细 H5 网页接入腾讯地图的完整流程,提供地图显示、IP 属地定位、地理位置名称、获取经纬度等超多功能示例(可一键复制并运行的功能源代码,详细的注释及常见问题汇总)小白直接上手!
  5. ip子网掩码计算及子网划分
  6. MT6572 flash验证过的时序放到6571上面无法下载
  7. select语句如何过五关斩六将
  8. 人生三大陷阱:大意、轻信、贪婪
  9. 如何用测量工具测试电容器
  10. 本地缓存天花板-Caffeine