1、refresh操作:buffer快满时或到一定的时间,默认一秒钟,会将buffer的数据生成为新的segment文件(os cache之中),
只要buffer中的数据被refresh到OS cache之中,就代表这个数据可以被搜索到了。当然可以通过restful api 和Java api实现refresh,
官网提示:尽管刷新是比提交轻量很多的操作,它还是会有性能开销。当写测试的时候, 手动刷新很有用,但是不要在生产环境下每次索引一个文档都去手动刷新。
相反,你的应用需要意识到 Elasticsearch 的近实时的性质,并接受它的不足。
修改buffer的refresh时间。
官网提示:
refresh_interval 需要一个 持续时间 值, 例如 1s (1 秒) 或 2m (2 分钟)。 一个绝对值 1 表示的是 1毫秒 --无疑会使你的集群陷入瘫痪。
2、translog日志事物文件的作用:为防止故障时,数据还在内存中的buffer与内存中的segment的数据时丢数据的日志文件,
2.1、每5秒钟将translog的内存文件入到translog磁盘,也可以直接fsync到磁盘,但是性能会比较差
因为内存中会存处5秒钟的translog日志文件,所有如果出现故障会丢失5秒钟的数据
3.1、flush(commit)操作:
触发条件:
每30分钟或translog文件大到阀值,
执行过程:
1、将buffer内存数据生成新的segment文件(OS cache之中)将OS cache中的所有segment 文件merge为一个新segment文件(内存中),将新的segment文件写入到磁盘,并记录commit point文件。
说明:提交(Commiting)操作会有一个新segment到磁盘需要一个 fsync 来确保段被物理性地写入磁盘,这样在断电的时候就不会丢失数据。 但是 fsync 操作写到磁盘的代价很大;所以segment会在内存中合并并写入磁盘。
2、translog进行commit(flush),新启一个translog文件(无数据),清空旧的translog文件,
4、ES删除数据:将一个document标记为delete状态,
5、ES更新数据:就是讲原来的doc标识为delete状态,然后重新写入一条数据。
6、merge 操作:
说明:merge发生在内存中,buffer每次更新一次,就会产生一个segment file(OS cache之中) 文件,所以在默认情况之下,就会产生很多的segment file 文件。不会中断索引和搜索。
触发条件:
会定期执行merge操作,或segment file到一定的数量
执行过程:
1、合并的时候会将那些旧的已删除文档清除,被删除的docment不会被拷贝到新的segment中
2、将内存中的segment file合并后新的segment被刷新(flush)到了磁盘。
3、写入新的segment file的commit point,排除了旧的和较小的segment file。
4、删除旧的segment file.
4、commit point文件,记录了merge时包含哪些segment file文件,
4.1、记录commit point文件的节点:
1、translog文件commit(flush)时,因为发生的merge,记录了包含哪些segment
2、segment file 文件merge的时候,更新commit point文件,记录了包含哪些segment
5、segment file就是倒排索引的文件,最终的ES文件,会存在于内存、磁盘当中
Elasticsearch 写入原理详解|refresh|translog|flush|merge |commit point
最新推荐文章于 2023-03-10 13:27:18 发布