ELK Stack系列之基礎篇(七) – 走進 Elasticsearch

  • 2020 年 2 月 18 日
  • 筆記

前言

Elasticsearch 是實時的分佈式搜索引擎,內部使用Lucene做索引、搜索。那麼接下來,我們了解一下Elasticsearch的相關名詞解釋、分片間的工作原理等知識;

一、Elasticsearch的核心概念、原理

(1)Near Realtime(NRT): 近實時,從寫入數據到數據可以被搜索到有一個小延遲(大概1秒);基於es執行搜索和分析可以達到秒級。新增到ES中的數據在1秒後就可以被檢索到,這種新增數據對搜索的可見性稱為「准實時搜索」;

(2)Cluster:集群,包含多個節點,每個節點屬於哪個集群是通過一個配置(集群名稱,默認是elasticsearch)來決定的,對於中小型應用來說,剛開始一個集群就一個節點很正常,它們協同工作,分享數據和負載。

(3)Node:就是一台運行了ES服務的服務器,就是跑了一個Java進程的節點,節點名稱很重要(在執行運維管理操作的時候),默認節點會去加入一個名稱為「elasticsearch」的集群。

(4)Index:索引,包含一堆有相似結構的文檔數據的集合,比如可以有一個客戶索引,商品分類索引,訂單索引,索引有一個名稱。一個index包含很多document,一個index就代表了一類類似的或者相同的document。比如說建立一個product index,商品索引,裏面可能就存放了所有的商品數據,所有的商品document。

(5) Type:類型,每個索引里都可以有一個或多個type,type是index中的一個邏輯數據分類,一個type下的document,都有相同的field,比如博客系統,有一個索引,可以定義用戶數據type,博客數據type,評論數據type。注意:_type在實際應用中容易引起概念混淆,以及允許索引存在多_type並沒有什麼實際意義,在ES 6.x版本中,一個索引只允許存在一個_type,也就是_doc來表示所有type.未來的ES 7.X版本將完全刪除_type概念。

(6) Document&field:文檔,es中的最小數據單元,一個document可以是一條客戶數據,一條商品分類數據,一條訂單數據,通常用JSON數據結構表示,每個index下的type中,都可以去存儲多個document。一個document裏面有多個field,每個field就是一個數據字段。

(7)shard(分片):單台機器無法存儲大量數據,es可以將一個索引中的數據切分為多個shard,分佈在多台服務器上存儲。有了shard就可以橫向擴展,存儲更多數據,讓搜索和分析等操作分佈到多台服務器上去執行,提升吞吐量和性能。為了應對並發更新問題,ES將數據副本分為主從兩部分,也就是主分片(primary shard簡稱p)和副本分片(replica shard).主數據作為權威數據,寫過程先寫主分片,成功後再寫副分片,恢復階段以主分片為準。他們的搭配原則如下:主分片與副本分片不能在同一個節點上,保重數據的高可用。副本分片之間的多個備份也不能在一個節點上,一個節點上多個副本備份沒有意義。

(8)replica(副本):任何一個服務器隨時可能故障或宕機,此時shard可能就會丟失,因此可以為每個shard創建多個replica副本。replica可以在shard故障時提供備用服務,保證數據不丟失,多個replica還可以提升搜索操作的吞吐量和性能。primary shard(建立索引時一次設置,不能修改,默認5個),replica shard(隨時修改數量,默認1個)。

(9)lucene index :Lucene的核心就是倒排索引,ES就是基於Lucene封裝而來的。Lucene的倒排索引算法、隊列集合是存在一個叫segment裡邊,這個segment的集合我們稱之為Lucene Index. 而我們的ES的每個shard都均勻的存在於ES集群的每個每個Node上。每個shard里的數據都是基於Lunce的倒排索引來排序的。所以,每個shard對應一個lucene index。

(10)索引:這裡的索引這個名詞,不同於上面的index.上面的索引就是創建目錄的意思。這裡的index我們可以理解為是我們根據自身需要按照ES的規則去定義一套合適的數據結構包括字段、字段類型的設置,然後ES自身基於這個數據結構去給我們存進去的數據或者需要分析的數據進行數據建造,進而讓搜索變得非常迅速。這個過程是由Es自身完成的。我們稱這個過程為索引。在大多數據庫中,可以使用幾種不同的方式為字段添加索引。而Lucene使用的是倒排索引,這意味着他將創建一個數據結構,並在其中保存記錄每個單詞出現在哪些數據清單中;

(11)正排索引:文檔->關鍵詞的映射過程,就是你要去找一個關鍵詞的時候,需要全文一行一行去搜索掃描直到搜到為止。所以它的缺點是費時費資源。

(12)倒排索引:也稱為反向索引。它是ES搜索引擎的核心。它的效率是最高的。它是相對於正向索引而言的。它的過程為:關鍵詞->文檔的映射 。首先,它會把存入ES的文檔按照設定的規則進行分詞(後面會講),分詞後會把這些詞進行篩選過濾,然後得到一個單詞集合,然後給所有的文檔也進行一個集合,給每一個文檔ID,讓單詞集合跟文檔集合去進行一個組合計算形成一個矩陣。這個矩陣就會形成一個倒排列表。比如ID為1的單詞在那幾個文檔中的哪些行出現過。倒排索引把單詞和文檔都進行組合運算,然後把每個關鍵詞在文檔裡邊的位置還有信息,通過詳細的信息記錄下來,方便後面查詢調取。

(13)全文搜索:對全部的文本內容進行分析,建立索引,使之可以被搜索,稱為全文搜索。

(14)分詞: 分詞是指將文本轉換成一系列單詞(term or token)的過程,也可以叫做文本分析,在es裏面稱為Analysis

二、操作數據節點工作流程

每個節點都有能力處理任意請求。每個節點都知道任意文檔所在的節點,所以也可以將請求轉發到需要的節點。

新建、索引和刪除請求都是寫(write)操作,它們必須在主分片上成功完成才能複製到相關的複製分片上。

ES節點數據寫入過程
  1. 客戶端給Node 1發送新建、索引或刪除請求。
  2. 節點使用文檔的_id確定文檔屬於分片0。它轉發請求到Node 3,分片0位於這個節點上。
  3. Node 3在主分片上執行請求,如果成功,它轉發請求到相應的位於Node 1和Node 2的複製節點上。當所有的複製節點報告成功,Node 3報告成功到請求的節點,請求的節點再報告給客戶端。

三、節點分片間數據檢索流程

文檔能夠從主分片或任意一個複製分片被檢索

節點數據檢索流程
  1. 客戶端給Node 1發送get請求。
  2. 節點使用文檔的_id確定文檔屬於分片0。分片0對應的複製分片在三個節點上都有。此時,它轉發請求到Node 2。
  3. Node 2返迴文檔(document)給Node 1然後返回給客戶端。

對於讀請求,為了平衡負載,請求節點會為每個請求選擇不同的分片——它會循環所有分片副本。

可能的情況是,一個被索引的文檔已經存在於主分片上卻還沒來得及同步到複製分片上。這時複製分片會報告文檔未找到,主分片會成功返迴文檔。一旦索引請求成功返回給用戶,文檔則在主分片和複製分片都是可用的。

總結:

本節講後面要用到的絕大部分專有名詞進行了初步的講解,後面的文章中講更進一步闡述其原理與應用。接下來,將在API的操作中逐步詮釋各重點、難點。