日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

深度解析:Elasticsearch 寫入請求處理流程

來源: 責編: 時間:2024-05-28 09:11:20 165觀看
導讀版本:Elasticsearch 8.x今天來看下 Elasticsearch 中的寫入流程。不想看過程可以直接跳轉文章末尾查看總結部分。最后附上個人理解的一個圖。從我們發出寫入請求,到 Elasticsearch 接收請求,處理請求,保存數據到磁盤,這個

版本:Elasticsearch 8.xEkr28資訊網——每日最新資訊28at.com

Ekr28資訊網——每日最新資訊28at.com

今天來看下 Elasticsearch 中的寫入流程。Ekr28資訊網——每日最新資訊28at.com

不想看過程可以直接跳轉文章末尾查看總結部分。最后附上個人理解的一個圖。Ekr28資訊網——每日最新資訊28at.com

Ekr28資訊網——每日最新資訊28at.com

從我們發出寫入請求,到 Elasticsearch 接收請求,處理請求,保存數據到磁盤,這個過程中經歷了哪些處理呢?Elasticsearch 又做了哪些操作?對于 Elasticsearch 寫入一篇文檔相信大家不陌生,但是Elasticsearch 的底層究竟是如何處理的呢,讓我們一起來一探究竟。Ekr28資訊網——每日最新資訊28at.com

寫入流程

Ekr28資訊網——每日最新資訊28at.com

(1) 客戶端發送寫請求時,發送給任意一個節點,這個節點就是所謂的協調節點(coordinating node)。(對應圖中的序號1)Ekr28資訊網——每日最新資訊28at.com

(2) 計算文檔要寫入的分片位置,使用 Hash 取模算法(最新版 Hash 算法)(對應圖中序號2)。Ekr28資訊網——每日最新資訊28at.com

routing_factor = num_routing_shards / num_primary_shardsshard_num = (hash(_routing) % num_routing_shards) / routing_factor

(3) 協調節點進行路由,將請求轉發給對應的 primary sharding 所在的 datanode(對應圖中序號2)。Ekr28資訊網——每日最新資訊28at.com

(4) datanode 節點上的 primary sharding 處理請求,寫入數據到索引庫,并且將數據同步到對應的 replica sharding(對應圖中序號3)。Ekr28資訊網——每日最新資訊28at.com

(5) 等 primary sharding 和 replica sharding 都保存好之后返回響應(對應圖中序號 4,5,6)。Ekr28資訊網——每日最新資訊28at.com

路由分片算法

在7.13版本之前,計算方式如下:Ekr28資訊網——每日最新資訊28at.com

shard_num = hash(_routing) % num_primary_shards

從7.13 版本開始,不包括 7.13 ,計算方式就改為了上述步驟2的計算方式。Ekr28資訊網——每日最新資訊28at.com

routing_factor = num_routing_shards / num_primary_shardsshard_num = (hash(_routing) % num_routing_shards) / routing_factor
  • num_routing_shards 就是配置文件中 index.number_of_routing_shard 的值。
  • num_primary_shard 就是配置文件中 index.number_of_shard 的值。
  • _routing 默認就是文檔的 ID,但是我們可以自定義該路由值。

等待激活的分片

此處以 Create index API 舉例說明,其中有一個請求參數 wait_for_active_shards。 該參數的作用就是寫入請求發送到ES之后,需要等待多少數量的分片處于激活狀態后再繼續執行后續操作。如果所需要數量的分片副本不足,則寫入操作需等待并重試,直到所有的分片副本都已經啟動或者發生超時。Ekr28資訊網——每日最新資訊28at.com

默認情況下,寫入操作僅等待主分片處于活動狀態后繼續執行(即 wait_for_active_shard=1)。Ekr28資訊網——每日最新資訊28at.com

  • (可選)的字符串值。
  • 默認1。
  • 可以設置為all,或者任意一個正整數,最多是索引的副本分片數+1(number_of_replicas+1)。

該設置極大的降低了寫操作未寫入所需數量分片副本的機會,但是并沒有完全避免。Ekr28資訊網——每日最新資訊28at.com

Ekr28資訊網——每日最新資訊28at.com

寫入原理

先來一個官網的寫入流程圖(地址在文末獲取)。Ekr28資訊網——每日最新資訊28at.com

Ekr28資訊網——每日最新資訊28at.com

Elasticsearh 寫入流程圖Ekr28資訊網——每日最新資訊28at.com

近實時

對于 Elasticsearch 的寫入流程來說,就三部分:Ekr28資訊網——每日最新資訊28at.com

  • 寫入到內存緩沖區。
  • 寫入打開新的 segment。
  • 寫入 disk。

為什么稱為近實時,是因為在寫入到內存緩沖區的時候,我們是還無法進行檢索的,等到寫入到segment之后,就可以進行檢索到了,所以這是近實時的原因。Ekr28資訊網——每日最新資訊28at.com

因為相對于寫到磁盤,打開 segment 寫入文件系統緩存的代價比寫入磁盤的代價低的多。Ekr28資訊網——每日最新資訊28at.com

第一步、寫入文檔到內存緩沖區(此時文檔不可被檢索)。Ekr28資訊網——每日最新資訊28at.com

Ekr28資訊網——每日最新資訊28at.com

第二步、緩沖區的內容寫入到 segment,但是還未提交(可被檢索)。Ekr28資訊網——每日最新資訊28at.com

Ekr28資訊網——每日最新資訊28at.com

在 Elasticsearch 中,寫入和打開一個新segment的過程稱為 refresh,refresh操作會自上次刷新(refresh)以來執行的所有操作都可用搜索。Ekr28資訊網——每日最新資訊28at.com

refresh觸發的方式有如下三種:Ekr28資訊網——每日最新資訊28at.com

  • 刷新間隔到了自動刷新。
  • URL增加?refresh參數,需要傳空或者true。
  • 調用Refresh API手動刷新

默認情況下,Elasticsearch 每秒定期刷新,但是僅限于在過去的30s內收到的一個或者多個 search請求。這個也就是近實時的一個點,文檔的更改不會立即顯示在下一次的檢索中,需要等待 refresh 操作完成之后才可以檢索出來。Ekr28資訊網——每日最新資訊28at.com

我們可以通過如下方式觸發refresh操作或者調整自動刷新的間隔。Ekr28資訊網——每日最新資訊28at.com

POST /_refresh POST /blogs/_refresh

調整刷新間隔,每 30s 刷新:Ekr28資訊網——每日最新資訊28at.com

PUT /my_logs{  "settings": {    "refresh_interval": "30s"   }}

關閉自動刷新:Ekr28資訊網——每日最新資訊28at.com

PUT /my_logs/_settings{ "refresh_interval": -1 } 

設置為每秒自動刷新:Ekr28資訊網——每日最新資訊28at.com

PUT /my_logs/_settings{ "refresh_interval": "1s" 

refresh_interval 需要一個 持續時間 值, 例如 1s (1 秒) 或 2m (2 分鐘)。 一個絕對值 1 表示的是 1毫秒 --無疑會使你的集群陷入癱瘓。Ekr28資訊網——每日最新資訊28at.com

Ekr28資訊網——每日最新資訊28at.com

段(segment)合并

由于 refresh 操作會每秒自動刷新生成一個新的段(segment),這樣的話短時間內,segment會暴增,segment數量太多,每一個都會造成文件句柄、內存、CPU的大量消耗,還有一個更重要的點就是,每個檢索請求也會輪流檢查每一個segment,所以segment越多,檢索也就越慢。Ekr28資訊網——每日最新資訊28at.com

Elasticsearch 通過在后臺自動合并 segment 來解決這個問題的。小的segment被合并到大的segment,然后大的segment在被合并到更大的segment。Ekr28資訊網——每日最新資訊28at.com

Ekr28資訊網——每日最新資訊28at.com

segment 合并的時候會自動將已刪除的文檔從文件系統中刪除,已經刪除的文檔或者更新文檔的舊版本不會被合并到新的 segment中。Ekr28資訊網——每日最新資訊28at.com

Ekr28資訊網——每日最新資訊28at.com

  • 當 index 的時候,refresh操作會創建新的segment,并將segment打開以供檢索。
  • 合并進行會選擇一小部分大小相似的segment,在后臺將他們合并到更大的segment中,這個操作不會中斷 index 與 search 操作。

optimize API

optimize API 不應該用在經常更新的索引上。Ekr28資訊網——每日最新資訊28at.com

Ekr28資訊網——每日最新資訊28at.com

該 optimize API 可以控制分片最大的 segment數量,對于有的索引,例如日志,每天、每周、每月的日志被單獨存在一個索引上,老得索引一般都是只讀的,也不太可能發生變化,所以我們就可以使用這個 optimize API 優化老的索引,將每個分片合并為一個單獨的segment。這樣既可以節省資源,也可以加快檢索速度。Ekr28資訊網——每日最新資訊28at.com

合并索引中的每個分片為一個單獨的段:Ekr28資訊網——每日最新資訊28at.com

POST /logstash-2014-10/_optimize?max_num_segments=1 

持久化

上述的refresh操作是 Elasticsearch 近實時 的原因,那么數據的持久化就要看fsync操作把數據從文件系統緩沖區flush到磁盤了。所以只有當translog被fsync操作或者是提交時,translog中的數據才會持久化到磁盤。Ekr28資訊網——每日最新資訊28at.com

如果沒有持久化操作,當 Elasticsearch 宕機發生故障的時候,就會發生數據丟失了,所以 Elasticsearch 依賴于translog進行數據恢復。Ekr28資訊網——每日最新資訊28at.com

在 Elasticsearch 進行提交操作的時候,成本是非常高的,所以策略就是在寫入到內存緩沖區的時候,同步寫入一份數據到translog,所有的index與delete操作都會在內部的lucene索引處理后且未確認提交之前寫入teanslog。Ekr28資訊網——每日最新資訊28at.com

如果發生了異常,當分片數據恢復時,已經確認提交但是并沒有被上次lucene提交操作包含在內的最近操作就可以在translog中進行恢復。Ekr28資訊網——每日最新資訊28at.com

Elasticsearch 的 flush操作是執行 Lucene提交并開始生成新的translog的過程,為了確保translog文件不能過大,flush操作在后臺自動執行,否則在恢復的時候也會因為文件過大花費大量的時間。Ekr28資訊網——每日最新資訊28at.com

對于translog有如下設置選項:Ekr28資訊網——每日最新資訊28at.com

  • index.translog.durability 默認設置為request ,意思就是只有當主分片和副本分片fsync且提交translog之后,才會向客戶端響應index,delete,update,bulk請求成功。
  • index.translog.durability 設置為async,則 Elasticsearch 會在每個index.translog.sync_interval 提交 translog,如果遇到節點恢復,則在這個區間執行的操作就可能丟失。

對于上述的幾個參數,都可以動態更新:Ekr28資訊網——每日最新資訊28at.com

(1) index.translog.sync_interval:將 translog fsync到磁盤并提交的頻率。默認5s,不允許小于100ms。Ekr28資訊網——每日最新資訊28at.com

(2) index.translog.durability:是否在每次index,delete,update,bulk操作之后提交translog。Ekr28資訊網——每日最新資訊28at.com

  • request: 默認,fsync 每次請求之后提交,如果發生故障,所有已確認的寫入操作到已經提交到磁盤
  • async: fsync在后臺每個sync_interval時間間隔提交。如果發生故障,自上次提交以來所有已確認的寫入操作將被丟棄。

(3) index.translog.flush_threshold_size:防止 translog 文件過大的設置,一旦達到設置的該值,就會發生 flush 操作,并生成一個新的 commit point。默認512mb。Ekr28資訊網——每日最新資訊28at.com

總結

(1) 一個文檔被index之后,添加內存緩存區,同時寫入 translog。Ekr28資訊網——每日最新資訊28at.com

Ekr28資訊網——每日最新資訊28at.com

(2) refresh 操作完成后,緩存被清空,但是 translog 不會Ekr28資訊網——每日最新資訊28at.com

  • 內存緩沖區的文檔被寫入到一個新的segment中,且沒有進行fsync操作。
  • segment 打開,可供檢索。
  • 內存緩沖區清空。

Ekr28資訊網——每日最新資訊28at.com

(3) 更多的文檔被添加到內存緩沖區并追加到 translog。Ekr28資訊網——每日最新資訊28at.com

Ekr28資訊網——每日最新資訊28at.com

(4) 每隔一段時間,translog 變得越來越大,索引被刷新(flush),一個新的 translog 被創建,并且一個提交執行。Ekr28資訊網——每日最新資訊28at.com

  • 所有內存緩沖區的文檔都被寫入到一個新的段。
  • 緩沖區被清空。
  • 一個提交點寫入磁盤。
  • 文件系統緩存通過fsync被刷新(flush)。
  • 老的 translog 被刪除。

translog 提供所有還沒有被刷到磁盤的操作的一個持久化記錄。當 Elasticsearch 啟動的時候,它會從磁盤中使用的最后一個提交點(commit point)去恢復已知的 segment ,并且會重放 translog 中所有在最后一次提交后發生的變更操作。Ekr28資訊網——每日最新資訊28at.com

translog 也被用來提供實時的CRUD,當我們通過ID進行查詢、更新、刪除一個文檔、它會嘗試在相應的 segment 中檢索之前,首先檢查 translog 中任何最近的變更操作。也就是說這個是可以實時獲取到文檔的最新版本。Ekr28資訊網——每日最新資訊28at.com

Ekr28資訊網——每日最新資訊28at.com

最后送上一個我自己理解的圖,參考了官網的描述,以及網上畫的,如有錯誤歡迎指出。Ekr28資訊網——每日最新資訊28at.com

Ekr28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-91168-0.html深度解析:Elasticsearch 寫入請求處理流程

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 六個Python開發者很少用到但功能強大的模塊

下一篇: 關于 Python 的 24 個常用模塊簡介

標簽:
  • 熱門焦點
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • 6月iOS設備性能榜:M2穩居榜首 A系列只能等一手3nm來救

    沒有新品發布,自然iOS設備性能榜的上榜設備就沒有什么更替,僅僅只有跑分變化而產生的排名變動,畢竟蘋果新品的發布節奏就是這樣的,一年下來也就幾個移動端新品,不會像安卓廠商,一
  • Automa-通過連接塊來自動化你的瀏覽器

    1、前言通過瀏覽器插件可實現自動化腳本的錄制與編寫,具有代表性的工具就是:Selenium IDE、Katalon Recorder,對于簡單的業務來說可快速實現自動化的上手工作。Selenium IDEKat
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數量是否小于或等于一個數字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • 得物效率前端微應用推進過程與思考

    一、背景效率工程隨著業務的發展,組織規模的擴大,越來越多的企業開始意識到協作效率對于企業團隊的重要性,甚至是決定其在某個行業競爭中突圍的關鍵,是企業長久生存的根本。得物
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 小米汽車電池信息疑似曝光:容量101kWh,支持800V高壓快充

    7月14日消息,今日一名博主在社交媒體發布了一張疑似小米汽車電池信息的照片,顯示該電池包正是寧德時代麒麟電池,容量為101kWh,電壓為726.7V,可以預測小
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記?! ”本┛萍冀逃w驗基
Top 主站蜘蛛池模板: 东山县| 和平县| 光山县| 商城县| 册亨县| 渭南市| 苍梧县| 清镇市| 柏乡县| 岱山县| 淮北市| 买车| 永年县| 克东县| 龙井市| 万源市| 武城县| 宜川县| 上虞市| 通州区| 宁安市| 宁河县| 苍南县| 九龙坡区| 原平市| 共和县| 霍邱县| 靖江市| 即墨市| 敦煌市| 洪雅县| 安新县| 交口县| 陆川县| 遂宁市| 高邑县| 双鸭山市| 阿尔山市| 犍为县| 佳木斯市| 大兴区|