Elasticsearch實戰一
一、簡介
Elasticsearch是一個分散式、可擴充套件、近實時的高效能搜尋和資料分析引擎。基於Java編寫,其內部使用Lucene作為索引和搜尋。
Elasticsearch提供了蒐集、分析、儲存資料三大功能,其主要特點有:分散式、零配置、易裝易用、自動發現、索引自動分片、索引副本機制、RESTful風格介面、多資料來源和自動搜尋負載等。
Lucene是一個免費、開源、高效能、純Java編寫的全文檢索引擎。主要模組有Analysis模組、Index模組、Store模組、QueryParser模組、Search模組和Similarity模組。
1、資料搜尋方式
資料型別有兩種型別,即結構化資料和非結構化資料。與資料型別相對應,資料的搜尋分為兩種,即結構化資料搜尋和非結構化資料搜尋。
因為結構化資料可以基於關係型資料庫儲存(支援索引),通過關係型資料進行檢索。
非結構化資料主要有順序掃描(效率低)和全文檢索兩種方式。
2、搜尋引擎工作原理
圖來自《Elasticsearch實戰與原理分析》
資料索引過程先後經歷正向索引和倒排索引階段,最終建立索引庫。
3、理解倒排索引
正排索引:以網頁或文章對映關係為Key、以分詞的列表為Value。
倒排索引:以分詞為Key、以網頁或文章對映關係為Value。
二、環境搭建
1、下載與啟動
版本:elasticsearch-7.2.0-windows-x86_64.zip
啟動使用解壓後壓縮包中有自帶的jdk11,修改bin/elasticsearch-env.bat中JAVA_HOME配置。
if defined JAVA_HOME ( rem set JAVA="%JAVA_HOME%\bin\java.exe" set JAVA="%ES_HOME%\jdk\bin\java.exe" ) else ( set JAVA="%ES_HOME%\jdk\bin\java.exe" set JAVA_HOME="%ES_HOME%\jdk" )
解壓後目錄:
檢視幫助命令:-d後臺啟動
瀏覽器驗證:
2、核心概念
Elasticsearch的核心概念有Node、Cluster、Shards、Replicas、Index、Type、Document、Settings、Mapping和Analyzer。
(1)Node:即節點,組成叢集的基本服務單元,節點型別有兩種:master(主)節點和data(資料)節點。
(2)Cluster:即叢集,同一個叢集內節點的名字不能重複,但是叢集名稱一定要相同。叢集中節點狀態有三種:Green(健康)、Yellow(預警)、Red(無法使用)。
(3)Shards:即分片(分散式儲存)。叢集預設為一個索引建立5個主分片,並且為每個主分片建立一個副本。
(4)Replicas:即副本(高可用性)。
(5)Index:即索引。
(6)Type:即類別。
(7)Document:即文件。
(8)Settings:索引的定義資訊,包含分片、副本等。
(9)Mapping:索引欄位(Field)的儲存型別、分詞方法、是否儲存等資訊。
(10)Analyzer:表示欄位分詞方式的定義。
三、Elasticsearch的架構設計
1、節點自動發現機制
Elasticsearch內嵌自動發現功能,主要提供了4種可供選擇的發現機制。其中一種是預設實現,其他都是通過外掛實現的,具體如下:
(1)Azure discovery外掛方式:多播模式。
(2)EC2 discovery外掛方式:多播模式。
(3)Google Compute Engine(GCE)discovery外掛方式:多播模式。
(4)Zen discovery:預設實現方式,支援單播模式和多播模式(不推薦:大多數作業系統不支援,安全性不高)。
叢集構建及主節點選舉過程:
(1)節點啟動後先執行ping命令(RPC命令),discovery.zen.ping.unicast.hosts配置中ip。ping命令返回結果包含該節點的基本資訊及該節點認為的主節點。
(2)選舉開始是,主節點現充各節點認為的master節點中選。規則表簡單,即按照節點ID(不知道是什麼,感覺應該是節點名稱)的字典順序排序,取第一個。
注意:叢集主節點存在最小值限制條件,discovery.zen.ping.minimum_master控制。未達到數量要求,迴圈上述(2)步驟。
2、分片和路由
對文件的新建、索引和刪除請求等操作,必須在主分片上完成之後才能被複制到相關的副本分配。
索引資料路由到分片演算法:shard_num=hash(routing) % num_primary_shards。
routing欄位的取值預設是id欄位或者parent欄位。
3、資料寫入過程
圖來自《ELK Stack權威指南》
(1)記憶體和translog
寫入資料生成倒排索引segment(分段),進入記憶體buffer;
同時記錄translog檔案。()
(2)磁碟快取
記憶體buffer生成新的segment分段,刷到檔案系統快取中(預設設定為1秒間隔,也提供_refresh介面)。
(3)分段儲存
segment(分段)寫入磁碟,commit檔案更新記錄;清空translog檔案(預設設定:30分鐘或當translog檔案大於512M,也提供_flush介面)。
4、分段合併