1、用户发出写入数据请求,写到内存Buffer中。内存Buffer会将写入的数据操作记录在translog中防止机器奔溃数据丢失。
2、内存Buffer每隔一个周期会将内存Buffer中的数据生成一个index segment file(它记录了被删除了的文件),segment本身就是一个文件,从内存buffer写入到segment的过程就是一个写文件的过程。 操作系统层面对新生成的文件不会马上持久化到磁盘,而是写入到OS Cache中,这个写入是通过refresh操作写进去的,refresh的过程除了在OS Cache生成这个文件以外,还会让底层Lucene的index reader打开这个文件,让新生成的这个文件对搜索可见。也就是说当segment写入成功时,这份新数据对外就可以访问了。
3、当OS Cache达到阈值或者达到一定时间(默认30分钟)ES会触发flush:flush主要是做三步事情:
1、commit,就是将当前内存buffer里的数据全部写到index segment file。
2、触发fsync,溢写到磁盘。
3、清空translog。
commitpoint记录当前可用的segment,方便回收。
当segment达到一定阈值(数量或者大小),segment会选择相似的segment进行合并成一个新的segment文件,并触发flush操作,然后创建新的commit point标记这个新生成的segment,将旧有的若干个segment标记删除。 之后将新的segment搜索状态打开。这些被标记了删除的segment将在后续统一进行删除。
好处
读写分离,互不受影响,数据写入到文件系统缓存是很快的,但这时候就已经可以使得数据可以被访问了, 而持久化的工作只需要另外一边系统去慢慢的积攒,异步去同步到磁盘。
参考官方:
https://www.elastic.co/guide/cn/elasticsearch/guide/current/near-real-time.html