1. 程式人生 > 實用技巧 >Elasticsearch實戰一

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後臺啟動

瀏覽器驗證:

http://localhost:9200/

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、分段合併