初次接觸到這兩個(gè)概念政鼠,估計(jì)都會覺得他們沒什么差別碘菜,都是為了在操作索引之后讓索引可以被實(shí)時(shí)性的搜索,不過它們還是有點(diǎn)不同的米苹。
Elasticsearch底層依賴Lucene糕伐,這里我們介紹下Lucene的segment, Reopen,commit蘸嘶。
Segment
在ES中良瞧,基本的存儲單元是shard(分片),但是在更底層的Lucene上稍微有點(diǎn)不同训唱,ES的每一個(gè)shard是Lucene的一個(gè)index(索引)褥蚯,Lucene的索引由多個(gè)segment組成,每個(gè)segment就是ES文檔的倒序索引雪情,里面包含了一些term(詞)的mapping(映射)遵岩。
當(dāng)每個(gè)ES的文檔創(chuàng)建的時(shí)候你辣,都會寫入一個(gè)新的segment中巡通,因此每次寫入的都是新的segment,所以不需要修改之前的segment舍哄。在刪除文檔的時(shí)候宴凉,只是在它屬于的segment哪里標(biāo)記為已刪除就可,沒有真正的從磁盤中抹除表悬。更新也是同樣的弥锄,只是在對應(yīng)之前segment哪里標(biāo)記為邏輯刪除,然后新建一個(gè)新的segment蟆沫。
Lucene Reopen
Reopen是為了讓數(shù)據(jù)可以可以被搜索到籽暇,盡管這個(gè)時(shí)候數(shù)據(jù)可以被搜索到,但是不一定保證數(shù)據(jù)已經(jīng)被持久化到磁盤中饭庞。
Lucene Commit
Commit就是為了讓數(shù)據(jù)持久化戒悠,每一次的Commit,不同segment的數(shù)據(jù)都會被持久化到磁盤中舟山,雖然這樣可以讓數(shù)據(jù)更安全绸狐,但是每一次操作都會消耗系統(tǒng)資源卤恳,會有大量的IO操作。
Translog
ES在持久化的時(shí)候引入了一種新的方式寒矿,translog(transaction log)突琳,一個(gè)文檔被索引之后,就會被添加到內(nèi)存緩沖區(qū)符相,并且 追加到了translog.
ES的Refresh
默認(rèn)情況下拆融,ES會每秒refresh一次,每次操作都會把內(nèi)存緩沖區(qū)的內(nèi)容拷貝到新創(chuàng)建的segment中去啊终,這一步是在內(nèi)存中操作的冠息,這個(gè)時(shí)候新的文檔就會被搜索了。也就是說ES是近實(shí)時(shí)性的搜索孕索,差不多1s鐘逛艰,才能讓數(shù)據(jù)可以被搜索到。
ES的Flush
Flush操作意味著搞旭,所有在內(nèi)存緩沖區(qū)的文檔被寫到新的Lucene Segment中散怖,也就是所有在內(nèi)存中的segment被提交到了磁盤,同時(shí)清除translog肄渗。
一般Flush的時(shí)間間隔會比較久镇眷,默認(rèn)30分鐘,或者當(dāng)translog達(dá)到了一定的大小翎嫡,也會觸發(fā)flush操作欠动。
最后
簡單來說,ES的refresh操作是為了讓最新的數(shù)據(jù)可以立即被搜索到惑申。而flush操作則是為了讓數(shù)據(jù)持久化到磁盤中具伍,另外ES的搜索是在內(nèi)存中處理的,因此Flush操作不影響數(shù)據(jù)能否被搜索到圈驼。
translog一般在進(jìn)行flush的時(shí)候被清空人芽,一般在fsync和commit的時(shí)候被持久化到磁盤,默認(rèn)的translog是在6.x版本以后绩脆,每次請求都會fsync到磁盤萤厅。不過有些index.translog的配置可以設(shè)置