ElasticSearch数据写入原理

整体写入流程分为四步:

  • write(数据写入buffer和translog)
  • refresh(buffer数据提交刷新到segment file和os cache,此步骤以后,数据才可见)
  • flush(os cache缓存数据同步到磁盘,清空当前时间段内translog)
  • merge(每次refresh产生的小segment file合并成大的segment file)
  1. write:数据先写入内存buffer(基于内存的缓冲),在buffer里的时候数据是搜索不到的;同时将数据写入translog日志文件。

  2. refresh:如果buffer快满了,或者到一定时间(默认1s),就会将内存buffer数据refresh 到一个新的segment file中,同时将数据同步到os cache(操作系统缓存),os cache马上响应,将segment file的状态置为open,当状态为open时,数据即可查到。这个过程就是 refresh。每隔1秒钟,执行一次refresh,将buffer中的数据写入一个新的segment file,这个segment file中就存储最近1秒内 buffer中写入的数据。(refresh发生在JVM堆中,频率越小越好),但是如果buffer里面此时没有数据,那当然不会执行refresh操作, 每秒创建换一个空的segment file 。重复上面的步骤,新的数据不断进入buffer和translog,不断将buffer数据写入一个又一个新的segment file中去,每次refresh完buffer清空,translog保留。

  3. flush:随着数据的不断写入,translog会变得越来越大。当translog达到一定长度的时候,就会触发commit操作。第一步,就是将buffer中现有的数据refresh到os cache中去,清空buffer。然后将一个commit point写入磁盘文件,里面标识着这个commit point 对应的所有segment file,同时强行将os cache中目前所有的数据都fsync到磁盘文件中去。最后清空现有 translog日志文件,重启一个translog,此时commit操作完成。这个commit操作叫做flush。默认30分钟自动执行一次flush,但如果translog过大,也会触发flush。flush操作就对应着commit的全过程,我们可以通过es api,手动执行flush操作,手动将os cache中数据fsync强刷到磁盘上去。

  4. merge: buffer每次refresh一次,就会产生一个segment file,所以默认情况下是1秒钟一个segment file,segment file会越来越多,此时会定期执行merge,每次merge的时候,会将多个segment file合并成一个,同时这里会将标识为deleted的doc给物理删除掉,然后将新的segment file写入磁盘,这里会写一个commit point,标识所有新的segment file,然后打开segment file供搜索使用,同时删除旧的segment file。

posted on   玖伍贰柒9527  阅读(207)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示