
1、過程
備注:可以先看看《Direct I/O 與 Buffer I/O》會更好理解本文
(1)數(shù)據(jù)在被node寫入以后,不會直接被寫入到磁盤,而是先寫到一塊index buffer的內(nèi)存中,同時寫入translog文件(參數(shù)控制直接寫盤還是寫page cache)。在index buffer中的數(shù)據(jù)達(dá)到閾值以后,會觸發(fā)reflush操作將數(shù)據(jù)寫入到segment file。
(2)在translog file中的數(shù)據(jù)量達(dá)到一定閾值以后,會觸發(fā)flush操作,清空translog,生成commit point文件。
備注:ES通過寫入SegmentFile再M(fèi)erge的方式寫數(shù)據(jù),主要是為了順序?qū)?,并且無鎖。
2、概念
(1)refresh:觸發(fā)數(shù)據(jù)從index buffer中寫入到page cache,清空index buffer里面的數(shù)據(jù)。
(2)flush:An Elasticsearch flush is the process of performing a Lucene commit and starting a new translog。即,觸發(fā)refresh,刪除舊的translog file,防止translog file太大節(jié)點(diǎn)宕機(jī)要恢復(fù)的話會需要很久;生成commit point
(3)commit point:記錄每個index的所有segment(已經(jīng)被fsync以后的數(shù)據(jù),不包括在page cache的部分)。segment在merge的時候也會更新這個文件
(4)index buffer:內(nèi)存緩沖區(qū)。一個node只有一塊index buffer,所有shard共用。數(shù)據(jù)會在index buffer中排序、壓縮。
(5)translog:shard級別,一個translog對應(yīng)一個shard。
3、數(shù)據(jù)完整性以及故障恢復(fù)
數(shù)據(jù)被寫入到index buffer中的時候,如果發(fā)生trash,此時數(shù)據(jù)沒有被持久化的數(shù)據(jù)會丟失?;趖ranlog的機(jī)制,node在恢復(fù)的時候,會從translog文件恢復(fù)那些數(shù)據(jù)(如果不是選擇從page cache同步寫入到file的機(jī)制,其實(shí)也是會丟掉{index.translog.sync_interval}的數(shù)據(jù))
4、參數(shù)
| 參數(shù) | 備注 |
|---|---|
| index.translog.durability | request:每次請求page cache中的數(shù)據(jù)都fsync到磁盤中(同步寫)。async:{index.translog.sync_interval}時間會fsync一次到磁盤。Elasticsearch v2.0以后默認(rèn)是request模式,如果能接受少量數(shù)據(jù)的丟失,可以選擇async |
| index.translog.sync_interval | page cache中的數(shù)據(jù)多久fsync到translog file,默認(rèn)5s |
| index.translog.flush_threshold_size | 控制translog file觸發(fā)flush的閾值。默認(rèn)512MB。 |
| 同上 | |
| 同上 | |
| indices.memory.index_buffer_size | 決定了index buffer的大小,默認(rèn)是10%,即10%的heap大小。index buffer大小是全局配置,無法為每個index配置 |
| index.refresh_interval | 決定了refresh的頻率,默認(rèn)是1s,可以設(shè)置為-1,等到index buffer滿了以后再觸發(fā)refresh。index級別的配置,可單獨(dú)為每個index配置 |
reference
圖解elasticsearch的寫入流程(包含對refresh、fsync、flush操作的理解)
Elasticsearch translog文件介紹