【HBZ分享】ES索引分片的写入原理 及 流程

当一条数据写到ES要经历哪些过程?

  1. 当插入一条新的数据时, 数据会进入Translog 和 MemoryBuffer两个内存中,并添加了事务日志,此时该文档不可查询

  2. 当translog大到一定程度时,会发生一个commit操作,也就是全量提交,会把translog中的数据全部刷到磁盘

  3. translog也会先写到os cache中,默认每隔5秒刷一次到磁盘中

  4. 所以默认情况下,可能会有5秒钟数据停留在【buffer】 或者 【translog文件的os cache中】,所以如果在5秒内宕机了,数据就会丢失,所以最多会有5秒的数据丢失

  5. 随后MemoryBuffer会每隔1秒,刷新到Segment段中,每次刷新都会生成新的Segment段,Refresh操作默认是每秒执行一次,即每秒会刷一次到Segment中(总结就是:内存缓冲区数据 ---> 文件系统缓冲区, 都是缓存,内存缓冲区数据不可读,文件系统缓冲区才能读)

  6. 因此在MemoryBuffer中的那1秒是搜不到数据的,有1秒的延迟,只有刷到Segment中才会被搜索

  7. 当文档从MemoryBuffer刷到Segment时,MemoryBuffer会全部被清空,但这个刷新过程是非常耗时的,因此针对实时性不高的数据,可以配置刷洗时间比如30秒刷一次,不要1秒一次,这也是优化性能的重要方法

  8. Segment中的数据默认30分钟会flush刷盘的磁盘中,并且同时会清空translog,而这个过程中,如果translog满了,也会把translog中的数据刷到DISK中,并清空translog。
    注意:5秒一次是针对Translog的,而默认30分钟是针对Segment中的数据刷盘,注意分清这两个刷盘时间的含义

  9. 这个过程中,refresh, flush的刷新刷盘时间可以配置,translog的达到临界size刷盘的这个size也可以配置

    MemoryBuffer配置刷新时间:
    PUT /refreshTest
    {
    "settings": {
    "refresh_interval": "30s"
    }
    }

合并(merge)

  1. 默认每秒都会有新的segment生成,因为MemoryBuffer默认每秒刷一次Segment,所以如果没有合并,则Segment的数量会暴涨,每个段都将消耗文件句柄,内存,和CPU资源。因为搜索的时候也会遍历segment。
  2. 所以ES会在后台合并这些段,ES会定期将一些小的Segment 或 没用的Segment段进行合并,减少存储占用空间
  3. 小段被合并成大段,再合并成更大的段,然后将新的大Segment打开提供搜索,旧的会删除
  4. 不合并segment的影响:
    (1). 每个segment占据的内存【不会】随着gc释放的。导致系统内存不足,进一步导致超时问题
    (2). 查询时会遍历每个segment,过多的segment会导致查询速度下降

刷盘(flush)

  1. 实现文档数据从文件系统缓存中刷到磁盘的过程

  2. 会定期触发,也可以当translog的数据达到某个上限的时候触发flush刷盘操作

  3. 默认条件是: 每30分钟主动进行一次flush, 或者当translog文件大于512MB主动进行一次flush

    配置代码:
    index.translog.flush_threshold_period 和 index.translog.flush_threshold_size

  4. 再ES中,要保证被索引的文档能够立即被搜索到,有两种方法: _refresh 或 _flush。

相关推荐
Jackyzhe1 小时前
Flink源码阅读:JobManager的HA机制
大数据·flink
鲨莎分不晴1 小时前
大数据基石深度解析:系统性读懂 Hadoop 与 ZooKeeper
大数据·hadoop·zookeeper
毕设源码-郭学长7 小时前
【开题答辩全过程】以 基于SpringBoot技术的美妆销售系统为例,包含答辩的问题和答案
java·spring boot·后端
梨落秋霜7 小时前
Python入门篇【文件处理】
android·java·python
Sylvan Ding7 小时前
度量空间数据管理与分析系统——大数据泛构课程作业-2025~2026学年. 毛睿
大数据·深圳大学·大数据泛构·度量空间数据管理与分析系统·毛睿·北京理工大学珠海校区
Java 码农8 小时前
RabbitMQ集群部署方案及配置指南03
java·python·rabbitmq
哈库纳玛塔塔8 小时前
放弃 MyBatis,拥抱新一代 Java 数据访问库
java·开发语言·数据库·mybatis·orm·dbvisitor
S***q3778 小时前
Spring Boot管理用户数据
java·spring boot·后端
天“码”行空9 小时前
java面向对象的三大特性之一多态
java·开发语言·jvm
毕设源码-郭学长9 小时前
【开题答辩全过程】以 基于SpringBoot框架的民俗文化交流与交易平台的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端