Elasticsearch知識

目錄

  • Elasticsearch邏輯設計和物理設計
    • 邏輯設計
    • 物理設計
  • Elasticsearch原理
    • 倒排索引
    • 文檔的分析過程
    • 保存文檔
    • 搜索文檔
    • 寫數據的底層原理
      • 數據刷新(fresh)
      • 事務日志的寫入
  • ES在大數據量下的性能優化
    • 文件系統緩存優化
    • 數據預熱
    • 文檔(Document)模型設計
    • 分頁性能優化
  • Elasticsearch和DB的差異
  • 參考

Elasticsearch邏輯設計和物理設計

邏輯設計

  • 索引(Index):類似于ES中的一張表,可以通過映射(Mapping)定義索引的結構和設置。
  • 類型(Type):可以對ES的索引進一步做劃分。ES 7中已經移除類型,建議一個索引一個類型即可
  • 映射(Mapping):索引結構的定義,包括索引的字段,字段類型,索引的設置等。
  • 文檔(Document):索引中的一條記錄。

物理設計

Elasticsearch本身是分布式搜索引擎。它的高可用高性能就是通過分片實現的。

  • 主分片:一個索引可以劃分成多個主分片,通過將主分片分布到不同的ES節點,從而實現高性能。
  • 副本分片:副本分片和主分片保持數據同步,和主分片不能分布在同一個節點,從而實現主分片的讀能力的橫向擴展,同時保證主分片不可用時實現故障轉移

Elasticsearch原理

倒排索引

每個文檔都有唯一的文檔ID,一個文檔經過分析器變成一組詞條

倒排索引:記錄詞條以及詞條出現的文檔ID的數據結構,同時倒排索引還會記錄詞條在文檔中出現的頻率

文檔的分析過程

示例引用自《Elasticsearch實戰》。

在文檔加入倒排索引之前,需要經過分析器執行分析,轉換成一組詞條(Term)。

以下是文檔“share your experience with Nosql & big data technologies”的分析過程。

  1. 過濾字符:字符過濾器轉換個別字符。如:將&轉換成and
  2. 切分文本:分詞器將文本切分成多個詞條
  3. 過濾分詞:一組分詞過濾器按序轉換每個分詞。如:小寫分詞過濾器,將所有的分詞轉換成小寫。
  4. 創建索引:為詞條創建倒排索引

保存文檔

保存文檔是寫入主分片,然后,同步到副本分片;搜索文檔是根據輪詢算法,從主分片副本分片讀取。

  1. 通過計算文檔ID哈希值,決定文檔的目標分片。如果文檔的目標分片不在當前節點,將文檔轉發到目標分片的節點。
  2. 將文檔加入倒排索引
  3. 數據同步所有的副本分片,即在副本分片創建倒排索引
  4. 所有的副本分片創建倒排索引成功,節點響應結果給客戶端

說明:

  • 協調節點:接收客戶端請求/響應客戶端的節點,負責數據的請求轉發,數據的匯總。

搜索文檔

  1. 協調節點使用round-robin隨機循環算法,將請求轉發到包含完整數據集合的分片集合(包括主分片和副本分片)。

  2. 協調節點收集各節點的返回結果,將結果返回客戶端:

    2.1 查詢階段(Query Phase):每個分片將自己的搜索結果的文檔ID返回給協調節點,協調節點進行數據的合并排序分頁,得到最終結果。

    2.2 拉取階段(Fetch Phase):協調節點根據文檔ID取各個節點上拉取文檔數據,最終返回給客戶端。
    ?

寫數據的底層原理

Elasticsearch會將數據先寫入內存的緩沖區,這時數據并不能用于查詢。

  • 刷新數據:緩沖區過大或者默認每隔1秒,將緩沖區中的數據寫入段文件(segment file),然后清空緩沖區。數據在緩沖區時是不可見的,變成段文件后,就可以用于查詢。段文件不可變,所以每隔一秒ES就會生成一個新的段文件。
  • 事務日志的寫入:為了防止數據丟失,ES會實時將數據寫入事務日志(tranlog)文件,事務日志文件是在磁盤里的。
  • 數據沖刷:事務日志過大或者默認每隔30分鐘,會觸發數據沖刷,會將一個提交點(commit point)中的所有段文件(在操作系統緩沖區中的數據)和緩沖區所有的數據寫入磁盤,然后,刪除事務日志

數據刷新(fresh)

數據刷新負責將緩沖區的數據寫入段文件。段文件實際上就Lucene索引。出于性能考慮,數據并不是直接寫入磁盤的,而是默認每隔1秒,數據從緩沖區寫入系統緩存(OS Cache),變成段文件。之后,就可以通過搜索接口查詢到對應的數據了。因為,數據都是在內存中的,所以一旦宕機,數據會丟失。ES通過事務日志保存了數據,所以,能夠保證數據的恢復。

ES是接近實時的(Near Real-time)

因為,數據是每1秒刷新的系統緩存,之后才可以訪問,所以是接近實時的。

事務日志的寫入

為了防止數據丟失,數據在寫入緩沖區的同時寫入事務日志文件。事務日志同樣是先寫入系統緩存(OS Cache),然后刷新到磁盤。

index.translog.durability參數- 刷盤策略

index.translog.durability取值:

  • request:每次請求都執行fsync刷盤,ES要等待日志文件刷盤后才返回成功響應。能夠保證數據基本不丟失,但是,性能低下,不推薦使用。
  • async:每隔5秒fsync一次translog數據到磁盤,默認值。兼顧數據的持久化和性能。

數據丟失

因為事務日志的默認刷盤方式是每隔5秒fsync一次,所以如果ES宕機,最多可能丟失5秒的數據。

ES在大數據量下的性能優化

文件系統緩存優化

ES中的索引數據會持久化到磁盤中,查詢的時候,索引數據從磁盤加載到系統緩存中。

這里的filesystem cache就是上文的OS cache,都是指系統緩存。

ES搜索性能非常依賴于系統緩存,因為系統緩存是在內存中的。如果查詢走系統緩存,可以達到幾毫秒幾百毫秒不等的查詢效率;但是,查詢走磁盤的話,搜索性能就要達到秒級。

最佳的情況下,機器的內存要達到容納總數據量的一半。

ES + HBase

為了減少ES的數據量,可以僅在ES索引中保存用于檢索的幾個字段,將完整的記錄保存在HBase中。查詢時,先通過ES獲取doc id,然后,根據doc id到HBase獲取完整的數據。

數據預熱

開啟定時任務,定時加載一些頻繁被訪問的熱點數據。如:電商系統中,如iphone,后臺開個任務,每隔1分鐘訪問一次相關數據,刷新到系統緩存中。

文檔(Document)模型設計

ES盡量不要使用復雜的操作,如:join(關聯)/nested/parent-child,對性能影響很大。

可以在Java應用里完成關聯,將關聯好的數據寫入ES中。

分頁性能優化

如果要取第100頁的10條數據,那么ES的分頁流程如下:

  1. 每個分片上的前1000條數據都查到協調節點上,如果有5個分片,那就是5000條數據。
  2. 接著協調節點對這5000條數據做合并、排序
  3. 返回第100頁的10條數據。

所以,ES的分頁越深,查詢越慢。

有兩種優化方案:

  1. 不允許深度分頁:系統直接不允許深度的分頁。
  2. 通過scroll API:類似于游標,或者Java中的迭代器,訪問效率可以達到毫秒級。不過只能一頁頁的訪問,不能隨機跳到任意一頁訪問

Elasticsearch和DB的差異

  • Elasticsearch不支持事務,表連接。
  • ES是個自帶分布式屬性的,高可用、可擴展、高性能,傳統關系型數據庫存在單機的性能瓶頸
  • ES單個字段的數據類型豐富,除了核心的數據類型,還支持多字段,對象類型、數組類型等。

參考

部分圖片引用自:advanced-Java

  • 《Elasticsearch實戰》
  • Elasticsearch如何做到億級數據查詢毫秒級返回的:Elasticsearch如何做到億級數據查詢毫秒級返回的? - 掘金
  • 互聯網 Java 工程師進階知識完全掃盲 - Doocs 技術社區
  • 互聯網 Java 工程師進階知識完全掃盲 - Doocs 技術社區

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167011.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167011.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167011.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據分享】2023年我國省市縣三級的瞪羚企業數量(免費獲取/Excel/Shp格式)

企業是經濟活動的參與主體。一個城市的企業數量決定了這個城市的經濟發展水平!比如一個城市的金融企業較多,那這個城市的金融產業肯定比較發達;一個城市的制造業企業較多,那這個城市的制造業肯定比較發達。 之前我們給大家分享了…

《opencv實用探索·二》根據RGB的像素排列來理解圖像深度、像素深度和位深度

通常對于RGB圖像主要分為RGB16,RGB24和RGB32。RGB16從高位到低位的排列為R->G->B,RGB24和RGB32從高位到低位的排列為B->G->R。 RGB16: 16 位為一個存儲單元(一個像素),來存儲一個RGB像素;因為人眼對綠色比…

社區物聯網云服務架構設計

文章目錄 1 摘要2 架構圖2.1 社區物聯網云服務網絡拓撲圖2.2 社區物聯網云服務通訊流程圖2.3 社區遠程開鎖功能流程圖 3 應用場景 1 摘要 隨著社區管理越來越智能化,社區物聯網升級與改造的市場空間也越來越大。社區物聯網包含樓宇對講、門禁門鎖、通道閘等等設備系…

Netty 模型理解

參考文章 1 參考文章 2 官網API文檔 Reactor模型 Netty模型 Netty主要基于主從Reactor多線程模型進行了一定的修改,該模型包括以下幾個組件: MainReactor(主Reactor):負責處理客戶端的連接請求。它監聽服務器上的端口…

Linux:大文件查找、切割、統計操作命令

1、查找文件夾某個文件中指定內容 grep -r -l "指定內容" /文件夾路徑 2、統計文件夾里文件個數 ll | grep ^- | wc -l 3、切割日志文件 split -b 200M -d -a 3 filename file_ 4、查看服務器磁盤里有哪些大文件夾 du -h --max-depth1 | sort -nr 5、查找/h…

MySQL數據庫入門到大牛_基礎_15_存儲過程與函數

前面我們介紹了數據自帶的函數,此處提到的函數,指的是用戶自定義函數。存儲函數是一定會有返回值的,存儲過程是可以沒有返回值的。 MySQL從5.0版本開始支持存儲過程和函數。存儲過程和函數能夠將復雜的SQL邏輯封裝在一起,應用程序…

中電金信:守【政】創新,探路保險數字化轉型“新范式”

11月23日,CIIP2023中國保險科技創新合作大會在京舉辦。大會匯集保險科技領域行業專家、學者、國內外頭部險企及保險科技公司負責人等各界人士,立足保險行業高質量發展和創新驅動理念,尋找行業數字化轉型新動能、新視角,為保險科技…

python中range函數的用法

range() 是Python的一個內置函數。語法格式為:range(start, stop, step) start是初始值,stop是最終值,step是步長。range()函數僅適用于整數,所有參數都必須是整數。步長值可以為正數或負數,不得為零。使用range函數時…

如何去掉圖片水印不傷原圖?無痕去水印教程分享!

如何去掉圖片水印不傷原圖?在電商廣告設計和營銷領域,水印已經成為一種常見的版權保護手段。不過,水印也給淘寶商家帶來了一些困擾。那么如何去掉圖片水印還能不傷原圖呢,接下來,將分享簡單好用的無痕去水印教程&#…

Rust UI開發(二):iced中如何為窗口添加icon圖標

注:此文適合于對rust有一些了解的朋友 iced是一個跨平臺的GUI庫,用于為rust語言程序構建UI界面。 想要了解如何構建簡單窗口的可以看本系列的第一篇: Rust UI開發:使用iced構建UI時,如何在界面顯示中文字符 本篇是系…

VMware 虛擬機設置靜態IP

1.橋接模式:無線網卡虛擬機可以橋接的,Vmware0是虛擬機默認進入的虛擬網絡,打開虛擬網絡編輯器把Vmware0橋接到具體的無線網卡上,再打開網卡設置選擇橋接模式即可。 2、.NAT模式下 :window下VMnet8: IPv4 地址 . . . …

Redis分片備庫切換操作

Redis分片備庫切換操作 場景描述: 分片集群: 1.ipa:5001-ipa:5002 2.ipb:5001-ipb:5002 需將兩個分片備庫互置完成災備 操作步驟 準備工作 主機密碼:1qaz!QAZ 獲取節點信息命令 /redispath/bin/redis-cli -a password -h ip -p port red…

軟考信息系統項目管理師考試真的越來越難了

浙江,深圳,青海,寧波,湖南等地都發布了2023年上半年的軟考合格人員名單。根據這份名單再對比一下上半年的各省軟考報名人數,可以看出來,軟考通過率確實有大幅下降的趨勢,信息系統項目管理師考試…

高級IO—select

高級IO—select 文章目錄 高級IO—selectIO的概念 五種IO模型阻塞IO非阻塞IO信號驅動IOIO多路轉接異步IO I/O多路轉接之select IO的概念 通常指數據在內部存儲器和外部存儲器或其他周邊設備之間的輸入和輸出。輸入是系統接收的信號或數據,輸出則是從其發送的信號或…

Jmeter接口測試——使用教程(下)

前言 上一篇我給大家講了jmeter的基本介紹跟參數化和jmeter腳本及jmeter斷言,今天讓我們繼續往下看,學習一下jmeter新的知識點。 一、Jmeter關聯 我們知道斷言是從返回結果中檢查有沒有預期的值,現在有一個問題,有一個購買商品…

【學習筆記】GameFramework的非官方實例TowerDefense-GameFramework-Demo的流程

一、從游戲開始到打開一個Menu GameStart.unity GameEntry.Builtin.cs ProcedureComponent.cs GameStart.unity->GameFramework->Builtin->Procedure ProcedureLaunch.cs ProcedureSplash.cs ProcedurePreload.cs ProcedureLoadingScene.cs DataTables/Scene.txt Pro…

transformers中的data_collator

前言 使用huggingface的Dataset加載數據集,然后使用過tokenizer對文本數據進行編碼,但是此時的特征數據還不是tensor,需要轉換為深度學習框架所需的tensor類型。data_collator的作用就是將features特征數據轉換為tensor類型的dataset。 本文…

小學語文老師重點工作

小學語文老師是學生在語言學習過程中的關鍵引導者,他們的主要職責是幫助學生建立正確的語言基礎,培養良好的閱讀習慣,并提高學生的語文素養。以下是小學語文老師的一些重點工作。 一、教授語言知識 小學語文老師首要的任務是教授學生語言知識…

《DApp開發:開啟全新數字時代篇章》

隨著區塊鏈技術的日益成熟,去中心化應用(DApp)逐漸成為數字世界的新焦點。在這個充滿無限可能的全新領域,DApp開發為創新者們提供了開啟數字時代新篇章的鑰匙。 一、DApp:區塊鏈創新成果 DApp是建立在區塊鏈技術基礎之…

C/C++ 開發SCM服務管理組件

SCM(Service Control Manager)服務管理器是 Windows 操作系統中的一個關鍵組件,負責管理系統服務的啟動、停止和配置。服務是一種在后臺運行的應用程序,可以在系統啟動時自動啟動,也可以由用戶或其他應用程序手動啟動。…