偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

十張圖說(shuō)清Elasticsearch原理!

開(kāi)發(fā) 后端 開(kāi)發(fā)工具
說(shuō)到 Elasticsearch,其中最明顯的一個(gè)特點(diǎn)就是 near real-time 準(zhǔn)實(shí)時(shí),當(dāng)文檔存儲(chǔ)在 Elasticsearch 中時(shí),將在 1 秒內(nèi)以幾乎實(shí)時(shí)的方式對(duì)其進(jìn)行索引和完全搜索。那為什么說(shuō) ES 是準(zhǔn)實(shí)時(shí)的呢?

 說(shuō)到 Elasticsearch,其中最明顯的一個(gè)特點(diǎn)就是 near real-time 準(zhǔn)實(shí)時(shí),當(dāng)文檔存儲(chǔ)在 Elasticsearch 中時(shí),將在 1 秒內(nèi)以幾乎實(shí)時(shí)的方式對(duì)其進(jìn)行索引和完全搜索。那為什么說(shuō) ES 是準(zhǔn)實(shí)時(shí)的呢?

[[340533]]
圖片來(lái)自 Pexels

 

Lucene 和 ES

Lucene

Lucene 是 Elasticsearch所基于的 Java 庫(kù),它引入了按段搜索的概念:

  • Segment:也叫段,類似于倒排索引,相當(dāng)于一個(gè)數(shù)據(jù)集。
  • Commit point:提交點(diǎn),記錄著所有已知的段。
  • Lucene index:“a collection of segments plus a commit point”。由一堆 Segment 的集合加上一個(gè)提交點(diǎn)組成。

對(duì)于一個(gè) Lucene index 的組成,如下圖所示:

 

ES

一個(gè) Elasticsearch Index 由一個(gè)或者多個(gè) shard(分片)組成。

而 Lucene 中的 Lucene index 相當(dāng)于 ES 的一個(gè) shard。

 

寫入過(guò)程

寫入過(guò)程 1.0(不完善)

寫入過(guò)程 1.0 如下:

  • 不斷將 Document 寫入到 In-memory buffer(內(nèi)存緩沖區(qū))。
  • 當(dāng)滿足一定條件后內(nèi)存緩沖區(qū)中的 Documents 刷新到磁盤。
  • 生成新的 segment 以及一個(gè) Commit point 提交點(diǎn)。
  • 這個(gè) segment 就可以像其他 segment 一樣被讀取了。

畫圖如下:

 

將文件刷新到磁盤是非常耗費(fèi)資源的,而且在內(nèi)存緩沖區(qū)和磁盤中間存在一個(gè)高速緩存(cache),一旦文件進(jìn)入到 cache 就可以像磁盤上的 segment 一樣被讀取了。

寫入過(guò)程 2.0

寫入過(guò)程 2.0 如下:

  • 不斷將 Document 寫入到 In-memory buffer(內(nèi)存緩沖區(qū))。
  • 當(dāng)滿足一定條件后內(nèi)存緩沖區(qū)中的 Documents 刷新到高速緩存(cache)。
  • 生成新的 segment,這個(gè) segment 還在 cache 中。
  • 這時(shí)候還沒(méi)有 commit,但是已經(jīng)可以被讀取了。

畫圖如下:

 

數(shù)據(jù)從 buffer 到 cache 的過(guò)程是定期每秒刷新一次。所以新寫入的 Document 最慢 1 秒就可以在 cache 中被搜索到。

而 Document 從 buffer 到 cache 的過(guò)程叫做 ?refresh。一般是 1 秒刷新一次,不需要進(jìn)行額外修改。

當(dāng)然,如果有修改的需要,可以參考文末的相關(guān)資料。這也就是為什么說(shuō) Elasticsearch 是準(zhǔn)實(shí)時(shí)的。

使文檔立即可見(jiàn):

  1. PUT /test/_doc/1?refresh 
  2. {"test""test"
  3.  
  4. // 或者 
  5. PUT /test/_doc/2?refresh=true 
  6. {"test""test"

Translog 事務(wù)日志

此處可以聯(lián)想 MySQL 的 binlog,ES 中也存在一個(gè) translog 用來(lái)失敗恢復(fù):

  • Document 不斷寫入到 In-memory buffer,此時(shí)也會(huì)追加 translog。
  • 當(dāng) buffer 中的數(shù)據(jù)每秒 refresh 到 cache 中時(shí),translog 并沒(méi)有進(jìn)入到刷新到磁盤,是持續(xù)追加的。
  • translog 每隔 5s 會(huì) fsync 到磁盤。
  • translog 會(huì)繼續(xù)累加變得越來(lái)越大,當(dāng) translog 大到一定程度或者每隔一段時(shí)間,會(huì)執(zhí)行 flush。

 

flush 操作會(huì)分為以下幾步執(zhí)行:

  • buffer 被清空。
  • 記錄 commit point。
  • cache 內(nèi)的 segment 被 fsync 刷新到磁盤。
  • translog 被刪除。

 

值得注意的是:

  • translog 每 5s 刷新一次磁盤,所以故障重啟,可能會(huì)丟失 5s 的數(shù)據(jù)。
  • translog 執(zhí)行 flush 操作,默認(rèn) 30 分鐘一次,或者 translog 太大也會(huì)執(zhí)行。

手動(dòng)執(zhí)行 flush:

  1. POST /my-index-000001/_flush 

刪除和更新

segment 不可改變,所以 docment 并不能從之前的 segment 中移除或更新。

所以每次 commit, 生成 commit point 時(shí),會(huì)有一個(gè) .del 文件,里面會(huì)列出被刪除的 document(邏輯刪除)。

而查詢時(shí),獲取到的結(jié)果在返回前會(huì)經(jīng)過(guò) .del 過(guò)濾。更新時(shí),也會(huì)標(biāo)記舊的 docment 被刪除,寫入到 .del 文件,同時(shí)會(huì)寫入一個(gè)新的文件。

此時(shí)查詢會(huì)查詢到兩個(gè)版本的數(shù)據(jù),但在返回前會(huì)被移除掉一個(gè)。

 

segment 合并

每 1s 執(zhí)行一次 refresh 都會(huì)將內(nèi)存中的數(shù)據(jù)創(chuàng)建一個(gè) segment。

segment 數(shù)目太多會(huì)帶來(lái)較大的麻煩。每一個(gè) segment 都會(huì)消耗文件句柄、內(nèi)存和 cpu 運(yùn)行周期。

更重要的是,每個(gè)搜索請(qǐng)求都必須輪流檢查每個(gè) segment ;所以 segment 越多,搜索也就越慢。

在 ES 后臺(tái)會(huì)有一個(gè)線程進(jìn)行 segment 合并:

  • refresh 操作會(huì)創(chuàng)建新的 segment 并打開(kāi)以供搜索使用。
  • 合并進(jìn)程選擇一小部分大小相似的 segment,并且在后臺(tái)將它們合并到更大的 segment 中。這并不會(huì)中斷索引和搜索。
  • 當(dāng)合并結(jié)束,老的 segment 被刪。

說(shuō)明合并完成時(shí)的活動(dòng):

  • 新的 segment 被刷新(flush)到了磁盤。 寫入一個(gè)包含新 segment 且排除舊的和較小的 segment的新 commit point。
  • 新的 segment 被打開(kāi)用來(lái)搜索。
  • 老的 segment 被刪除。

 

物理刪除:在 segment merge 這塊,那些被邏輯刪除的 document 才會(huì)被真正的物理刪除。

總結(jié)

主要介紹了內(nèi)部寫入和刪除的過(guò)程,需要了解 refresh、fsync、flush、.del、segment merge 等名詞的具體含義。

完整畫圖如下:

 

以上就是個(gè)人分享的 ES 相關(guān)的內(nèi)容,主要目的是組內(nèi)技術(shù)分享,進(jìn)行掃盲。不對(duì)之處,希望大家留言指正。

相關(guān)資料:

  • 準(zhǔn)實(shí)時(shí)搜索:

https://www.elastic.co/guide/en/elasticsearch/reference/7.9/near-real-time.html

  • Refresh API:

https://www.elastic.co/guide/en/elasticsearch/reference/7.9/indices-refresh.html

  • Flush API:

https://www.elastic.co/guide/en/elasticsearch/reference/7.9/indices-flush.html

作者:劉志航

編輯:陶家龍

出處:轉(zhuǎn)載自公眾號(hào)劉志航(ID:liuzhihangs)

責(zé)任編輯:武曉燕 來(lái)源: 劉志航
相關(guān)推薦

2021-05-07 17:11:19

負(fù)載均衡運(yùn)維服務(wù)

2022-03-07 17:43:30

注冊(cè)微服務(wù)架構(gòu)

2022-09-26 11:32:14

用戶分層服務(wù)業(yè)務(wù)

2021-03-18 12:16:44

用戶分層業(yè)務(wù)

2021-01-28 11:39:01

數(shù)據(jù)分析銷售

2022-07-05 11:18:50

數(shù)據(jù)分析銷售業(yè)績(jī)

2018-05-28 21:17:57

大數(shù)據(jù)分析軟件

2014-03-25 10:38:30

機(jī)器學(xué)習(xí)非線性

2021-10-22 09:28:15

開(kāi)發(fā)技能代碼

2017-04-19 10:55:20

機(jī)器學(xué)習(xí)基本概念

2024-01-05 16:27:06

2015-04-01 13:57:49

2011-11-30 09:57:57

2017-10-13 12:51:36

語(yǔ)言PHP、Python、差異比較

2022-04-11 11:55:34

架構(gòu)技術(shù)調(diào)優(yōu)

2025-05-19 08:50:34

MCP可視化服務(wù)器

2023-10-10 08:16:07

Spring依賴注入SpEL表達(dá)式

2018-10-24 09:25:03

數(shù)據(jù)中心現(xiàn)狀差異

2024-03-20 10:32:29

跨域JSONP后端

2021-11-02 06:58:53

架構(gòu)線程池參數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)