1、过程
备注:可以先看看《Direct I/O 与 Buffer I/O》会更好理解本文
(1)数据在被node写入以后,不会直接被写入到磁盘,而是先写到一块index buffer的内存中,同时写入translog文件(基于buffer I/O的原理,数据此时不会被直接写入到文件而是写到page cache中)。在index buffer中的数据达到阈值以后,会触发reflush操作将数据写入到segment(同样,数据也会先被缓存到page cache中)。此时,数据都其实都已经在page cache中。
(2)根据{index.translog.sync_interval}与{index.translog.durability}控制page cache中的数据以哪种频率被写入到translog文件中,写入segment文件的频率则由OS自己控制。
(3)在translog file中的数据量达到一定阈值以后,会触发flus操作,生成commit point文件。
2、数据完整性以及故障恢复
数据被写入到index buffer中的时候,如果发生trash,此时数据没有被持久化的数据会丢失。基于tranlog的机制,node在恢复的时候,会从translog文件恢复那些数据(如果不是选择从page cache同步写入到file的机制,其实也是会丢掉{index.translog.sync_interval}的数据)
3、概念
(1)refresh:触发数据从index buffer中写入到page cache,清空index buffer里面的数据。
(2)flush:An Elasticsearch flush is the process of performing a Lucene commit and starting a new translog。即,触发refresh,生成一个新的commit point file,删除旧的translog file,防止translog file太大节点宕机要恢复的话会需要很久
(3)commit point file:记录每个index的所有segment。segment在merge的时候也会更新这个文件
(4)index buffer:内存缓冲区。一个node只有一块index buffer,所有shard共用。
4、参数
参数 | 备注 |
---|---|
index.translog.durability | request:每次请求page cache中的数据都fsync到磁盘中(同步写)。async:{index.translog.sync_interval}时间会fsync一次到磁盘。Elasticsearch v2.0以后默认是request模式,如果能接收少量数据的丢失,可以选择async |
index.translog.sync_interval | page cache中的数据多久fsync到translog file |
index.translog.flush_threshold_size | 控制translog file触发flush的阈值 |
index.translog.retension.size | 同上 |
index.translog.retension.age | 同上 |
indices.memory.index_buffer_size | 决定了index buffer的大小,默认是10%,即10%的heap大小。 |
index.refresh_interval | 决定了refresh的频率,默认是1s,可以设置为-1,等到index buffer满了以后再触发refresh。 |
reference
图解elasticsearch的写入流程(包含对refresh、fsync、flush操作的理解)
Elasticsearch translog文件介绍
网友评论