Elasticsearch 資料寫入原理分析
本文轉自 | 泥瓦匠BYSocket
的底層結構,然後詳細描述新資料寫入 ES 和 Lucene 的流程和原理。這是基礎理論知識,整理了一下,希望能對 Elasticsearch 感興趣的同學有所幫助。
一、Elasticsearch & Lucene 是什麼?
Elasticsearch 是一個基於 Apache Lucene(TM) 的開源搜尋引擎。
無論在開源還是專有領域,Lucene 可以被認為是迄今為止最先進、效能最好的、功能最全的搜尋引擎庫,並透過簡單的 RESTful API 來隱藏 Lucene 的複雜性,從而讓全文搜尋變得簡單。
分散式的實時檔案儲存,每個欄位都被索引並可被搜尋
分散式的實時分析搜尋引擎
可以擴充套件到上百臺伺服器,處理 PB 級結構化或非結構化資料
二、Elasticsearch & Lucene 的關係
因此,入門 ES 的同學,稍微瞭解下 Lucene 即可。如果往高階走,還是需要學習 Lucene 底層的原理。因為倒排索引、打分機制、全文檢索原理、分詞原理等等,這些都是不會過時的技術。
三、新文件寫入流程
3.1 資料模型
如圖
一個 ES Index (索引,比如商品搜尋索引、訂單搜尋索引)叢集下,有多個 Node (節點)組成。每個節點就是 ES 的例項。
每個節點上會有多個 shard (分片), P1 P2 是主分片 R1 R2 是副本分片
每個分片上對應著就是一個 Lucene Index(底層索引檔案)
Lucene Index 是一個統稱。由多個 Segment (段檔案,就是倒排索引)組成。每個段檔案儲存著就是 Doc 文件。
3.2 Lucene Index
lucene 中,單個倒排索引檔案稱為 segment。其中有一個檔案,記錄了所有 segments 的資訊,稱為 commit point:
文件 create 新寫入時,會生成新的 segment。同樣會記錄到 commit point 裡面
文件查詢,會查詢所有的 segments
當一個段存在文件被刪除,會維護該資訊在 .liv 檔案裡面
3.3 新文件寫入流程
資料持久化步驟如下:write -> refresh -> flush -> merge
3.3.1 write 過程
一個新文件過來,會儲存在 in-memory buffer 記憶體快取區中,順便會記錄 Translog。
in-memory buffer 中的文件寫入到新的 segment 中,但 segment 是儲存在檔案系統的快取中。此時文件可以被搜尋到
最後清空 in-memory buffer。注意: Translog 沒有被清空,為了將 segment 資料寫到磁碟
文件經過 refresh 後, segment 暫時寫到檔案系統快取,這樣避免了效能 IO 操作,又可以使文件搜尋到。refresh 預設 1 秒執行一次,效能損耗太大。一般建議稍微延長這個 refresh 時間間隔,比如 5 s。因此,ES 其實就是準實時,達不到真正的實時。
3.3.3 flush 過程
上個過程中 segment 在檔案系統快取中,會有意外故障文件丟失。那麼,為了保證文件不會丟失,需要將文件寫入磁碟。那麼文件從檔案快取寫入磁碟的過程就是 flush。寫入磁碟後,清空 translog。
保證檔案快取中的文件不丟失
系統重啟時,從 translog 中恢復
新的 segment 收錄到 commit point 中
具體可以看官方文件:
3.3.4 merge 過程
上面幾個步驟,可見 segment 會越來越多,那麼搜尋會越來越慢?怎麼處理呢?
就是各個小段檔案,合併成一個大段檔案。段合併過程
段合併結束,舊的小段檔案會被刪除
.liv 檔案維護的刪除文件,會透過這個過程進行清除
四、小結
如這個圖,ES 寫入原理不難,記住關鍵點即可。
write:文件資料到記憶體快取,並存到 translog
refresh:記憶體快取中的文件資料,到檔案快取中的 segment 。此時可以被搜到
flush 是快取中的 segment 文件資料寫入到磁碟
《深入理解 Elasticsearch》
~
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545820/viewspace-2656265/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Elasticsearch Lucene 資料寫入原理 | ES 核心篇Elasticsearch
- ElasticSearch寫入資料的工作原理是什麼?Elasticsearch
- Elasticsearch Lucene是怎樣資料寫入的Elasticsearch
- 用 logstash 從 kafka 讀取資料寫入 Elasticsearch(qbit)KafkaElasticsearch
- Elasticsearch 如何保證寫入過程中不丟失資料的Elasticsearch
- Elasticsearch 技術分析(九):Elasticsearch的使用和原理總結Elasticsearch
- Elasticsearch核心技術(四):索引原理分析Elasticsearch索引
- Elasticsearch批量匯入資料指令碼(python)Elasticsearch指令碼Python
- 極速匯入elasticsearch測試資料Elasticsearch
- spark寫入hive資料SparkHive
- MongoDB寫入資料策略MongoDB
- Elasticsearch和向量資料庫的快速入門Elasticsearch資料庫
- 基於Lucene查詢原理分析Elasticsearch的效能Elasticsearch
- 從查詢重寫角度理解elasticsearch的高亮原理Elasticsearch
- elasticsearch查詢之大資料集分頁效能分析Elasticsearch大資料
- 如何將 EXCEL 資料寫入資料庫Excel資料庫
- 按需載入原理分析
- Python資料分析入門Python
- Python資料分析入門(十四):資料分析中常用圖Python
- 通過ES-Hadoop實現Hive讀寫Elasticsearch資料HadoopHiveElasticsearch
- elasticsearch索引原理Elasticsearch索引
- Mysql增量寫入Hdfs(一) --將Mysql資料寫入Kafka TopicMySqlKafka
- 大資料分析的原理和潛力大資料
- JAVA常用資料結構及原理分析Java資料結構
- java資料list寫入檔案Java
- Python資料分析入門(五)Python
- Python資料分析入門(四)Python
- Python資料分析入門(一)Python
- Spark資料分析概念入門Spark
- Python資料分析入門(三)Python
- Python資料分析入門(二)Python
- 資料分析 | 零基礎入門資料分析(一):從入門到摔門?
- vue資料入口initSate開始分析資料驅動更新原理Vue
- 【GO】Elasticsearch的簡單寫入和讀取示例GoElasticsearch
- 刪除elasticsearch資料Elasticsearch
- 新一代資料分析利器:Google Dremel原理分析KLGoREM
- ElasticSearch效能原理拆解Elasticsearch
- 分散式資料庫Google Spanner原理分析KP分散式資料庫Go