es写入数据流程
数据写入前的查询定位阶段
写入数据之前是通过协调节点找到应该存放数据的数据分片的主分片的节点。然后就就是ES数据吸入流程。
内存,OSCache,磁盘,这是数据存放的位置。
数据写入第一阶段写入内存
最开始一个写入请求进来,直接写入内存中的buffer,这样做是为了速度。这时候这份写入数据还不能被查询到。与数据写入buffer并行的是数据写入translog,这是为了提高数据的可靠性。如果这时候buffer里面的数据丢了,translog的数据可以恢复。
- translog的数据写入的是流水账结构简单速度快。它可以每次记录流水都刷盘,保证数据不丢,但是默认配置是5秒刷盘一次,这样可以提高效率。
- translog和主流程的区别类似一个银行有两个记账员,主记账员记的总账,比如记录每个用户账号里面还有多少钱,每次要和之前数据比对汇总,次记账员只记录用户干了什么。所以次记账员比较轻松,可以记更加快。如果主记账员的当月账本丢了,次记账员哪里每天做的流水还能恢复主账本。
数据写入第二阶段写入OSCache(refresh)
buffer里面的内容每隔1秒钟就生成一个segment,然后es把segment写入OSCache。OSCache是操作系统管理的,也在内存中,如果计算机正常关闭,操作系统会让、完成OSCache落盘才关机,如果异常关闭OSCache 数据就会丢失。写入OSCache的数据已经可给操作系统了,已经可以读取到了。es每秒生成一个segment,所以es写入到能够读取到数据之间的延时理论最多1秒。
数据写入第三阶段写入磁盘(flush)
OSCache里面的数据并是不可靠的,如果数据丢失,可以通过translog来恢复。前面说了,写入buffer的时候同时在translog里面做了记录,所以translog里面有全部的 位于OSCache中的segment的内容。重放translog就能得到这部分数据。
translog并不能让它无限增长,所以当translog达到一定尺寸,或者一定时间(30分钟),就可以清空一下translog。translog的内容=buffer+OSCache segment。
- 第一步,把buffer里面的内容refresh成一个新的segment。
- 第二步,把OSCache里面的segment合并,并且刷盘,一起刷入磁盘的还有几号以后得segment是已经刷盘了(commit point)。
- 第3步清空translog。
ES写入流程示意图
能耍的时候就一定要耍,不能耍的时候一定要学。
--天道酬勤,贵在坚持posted on 2024-02-08 19:57 zhangyukun 阅读(701) 评论(0) 编辑 收藏 举报