溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Elasticsearch寫(xiě)入數(shù)據(jù)底層的示例分析

發(fā)布時(shí)間:2021-12-03 14:53:55 來(lái)源:億速云 閱讀:165 作者:柒染 欄目:云計(jì)算

這篇文章給大家介紹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組成。

內(nèi)存分配

  • 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。

寫(xiě)入流程--數(shù)據(jù)底層

Elasticsearch寫(xiě)入數(shù)據(jù)底層的示例分析

  • 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。

參數(shù)說(shuō)明

Refresh

PUT my-index/_settings
{
  "refresh_interval": "60s" #默認(rèn)1s
}

Translog

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ò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI