您好,登錄后才能下訂單哦!
這篇文章給大家介紹Elasticsearch寫(xiě)入數(shù)據(jù)底層的示例分析,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
Document(文檔): 文檔是存儲(chǔ)在elasticsearch中的一個(gè)JSON文件,相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)中表的一行數(shù)據(jù)。
Shard(分片):索引數(shù)據(jù)可以拆分為較小的分片,每個(gè)分片放到不同的服務(wù)器上,提高并發(fā)能力。 Lucene 中的 Lucene index 相當(dāng)于 ES 的一個(gè) shard。
Segments(段): 分片由多個(gè)segments組成,每個(gè)segments都是一個(gè)獨(dú)立的倒排索引,且具有不變性,segment 提供了搜索功能。
Transaction Log(translog,事務(wù)日志):Elasticsearch使用translog來(lái)記錄index,delete,update,bulk請(qǐng)求,保障數(shù)據(jù)不丟失,如果Elasticsearch需要恢復(fù)數(shù)據(jù)可以從translog中讀取。每個(gè)分片對(duì)應(yīng)一個(gè)translog文件。
Commit point(提交點(diǎn)):記錄著所有已知的segment,每個(gè)Shard都有一個(gè)Commit point, 其中保存了當(dāng)前Shard成功寫(xiě)入磁盤(pán)的所有Segment。
Lucene index :由一堆 Segment 的集合加上一個(gè)Commit point組成。
OS Cache: Lucene 中的倒排索引 segments 存儲(chǔ)在文件中,為提高訪問(wèn)速度,都會(huì)把它加載到OS Cache中,從而提高 Lucene 性能,所以建議至少留系統(tǒng)一半內(nèi)存給Lucene。
Node Query Cache:負(fù)責(zé)緩存filter 查詢結(jié)果,每個(gè)節(jié)點(diǎn)有一個(gè),被所有 shard 共享,filter query查詢結(jié)果不涉及 scores 的計(jì)算。
Indexing Buffe:索引緩沖區(qū),用于存儲(chǔ)新索引的文檔,當(dāng)其被填滿時(shí),緩沖區(qū)中的文檔被寫(xiě)入磁盤(pán)中的 segments 中。
Shard Request Cache: 用于緩存aggregations,suggestions,hits.total的請(qǐng)求結(jié)果。
Field Data Cache:Elasticsearch 加載內(nèi)存 fielddata 的默認(rèn)行為是延遲加載 。在首次對(duì)text類(lèi)型字段做聚合、排序或者在腳本中使用時(shí),需要設(shè)置字段為fielddata數(shù)據(jù)結(jié)構(gòu),它將會(huì)完整加載這個(gè)字段所有 Segment 中的倒排索引到堆內(nèi)存中。不推薦使用,因?yàn)閒ielddata會(huì)占用大量堆內(nèi)存空間 ,聚合或者排序使用doc_value。
1.數(shù)據(jù)寫(xiě)入Index Buffer緩沖和Translog日志文件。
為了保證數(shù)據(jù)不會(huì)丟失,從高版本開(kāi)始Transaction Log對(duì)每個(gè)index,delete,update,bulk請(qǐng)求都fsync持久化到磁盤(pán)。
2.Refresh:將Index Buffer寫(xiě)入Segment的過(guò)程叫做Refresh。
每隔1s,Index Buffer中的數(shù)據(jù)被寫(xiě)入新的Segment(OS Cache中),此時(shí)Segment被打開(kāi)并提供Search。Refresh后,數(shù)據(jù)就可以被搜索到了,這也是為什么Elasticsearch被稱(chēng)為近實(shí)時(shí)搜索的原因。
當(dāng)Index Buffer被占滿時(shí),會(huì)觸發(fā)Refresh,默認(rèn)值是JVM堆內(nèi)存的10%。
Refresh不執(zhí)行fsync操作,不會(huì)清空Transaction Log。
3.重復(fù)1~2步,新的Segment不斷添加,Index Buffer不斷被清空,而Transaction Log中的數(shù)據(jù)不斷累加。
4.每隔30分鐘或者當(dāng)Transaction Log用滿時(shí)(默認(rèn)512M),ES Flush (Lucene Commit) 操作發(fā)生:
4.1 調(diào)用Refresh清空Index Buffer。
4.2 調(diào)用fsync,將緩存中的Segments寫(xiě)入磁盤(pán)。
4.3 清空(刪除)Transaction Log。
4.4 Commit ponit被寫(xiě)入磁盤(pán),每個(gè)Shard都有一個(gè)Commit point, 其中保存了當(dāng)前Shard成功寫(xiě)入磁盤(pán)的所有Segment。
PUT my-index/_settings { "refresh_interval": "60s" #默認(rèn)1s }
PUT my-index/_settings { "translog.flush_threshold_size": "1gb", #默認(rèn)512M,當(dāng) translog 超過(guò)該值,會(huì)觸發(fā) flush "translog.sync_interval": "60s", #默認(rèn)5s "translog.durability": "async" #默認(rèn)是 request,每個(gè)請(qǐng)求都落盤(pán),忽視translog.sync_interval。設(shè)置成 async,異步寫(xiě)入,根據(jù)index.translog.sync_interval參數(shù)的間隔時(shí)間做fsync。 }
關(guān)于Elasticsearch寫(xiě)入數(shù)據(jù)底層的示例分析就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。