圖解Elasticsearch的核心概念

本文講解大綱,分8個核心概念講解說明:node

  • NRT
  • Cluster
  • Node
  • Document&Field
  • Index
  • Type
  • Shard
  • Replica

Near Realtime(NRT)近實時

Elasticsearch的核心優點就是(Near Real Time NRT)近乎實時,咱們稱之爲近實時。
NRT有兩個意思,下面舉例說明下:mysql

  • 從寫入索引數據到數據能夠被搜索到有一個小延遲(大概1秒);

舉個例子:電商平臺新上架一個新商品,1秒後用戶就可搜索到這個商品信息,這就是近實時。sql

  • 基於Elasticsearch執行搜索和分析能夠達到秒級查詢

也舉個例子說明,好比我如今想查詢我在淘寶,最近一年都買過幾件商品,總共花了多少錢,最貴的商品多少錢,哪一個月買到東西最多,什麼類型的商品買的最多這樣的信息,若是淘寶說,你要等待10分鐘才能出結果,你是否是很崩潰,這個延遲的時間就不是近實時,若是淘寶能夠秒級別返回給你,就是近實時了。編程

下面畫一個圖,解釋下三個基本概念的服務器

Cluster:集羣

包含多個節點,每一個節點屬於哪一個集羣是經過一個配置(集羣名稱,默認是elasticsearch)來決定的,對於中小型應用來講,剛開始一個集羣就一個節點很正常。集羣的目的爲了提供高可用和海量數據的存儲以及更快的跨節點查詢能力。數據結構

Node:節點

集羣中的一個節點,節點也有一個名稱(默認是隨機分配的),節點名稱很重要(在執行運維管理操做的時候),默認節點會去加入一個名稱爲「elasticsearch」的集羣,若是直接啓動一堆節點,那麼它們會自動組成一個elasticsearch集羣,固然一個節點也能夠組成一個elasticsearch集羣負載均衡

Document&field:文檔和字段

document 是es中的最小數據單元,一個document能夠是一條客戶數據,一條商品分類數據,一條訂單數據,一般用JSON數據結構表示,每一個index下的type中,均可以去存儲多個document。一個document裏面有多個field,每一個field就是一個數據字段。運維

至關於mysql裏的行,能夠簡單這麼理解,舉個例子。一個商品的文檔數據一條以下:elasticsearch

product document
{
  "product_id": "1000",
  "product_name": "mac pro 2019 款筆記本",
  "product_desc": "高性能,高分辨率,編程必備神器",
  "category_id": "2",
  "category_name": "電子產品"
}

Index:索引

包含一堆有類似結構的文檔數據,好比能夠有一個客戶索引,商品分類索引,訂單索引,索引有一個名稱。
一個index包含不少document,一個index就表明了一類相似的或者相同的document。好比說創建一個product index,商品索引,裏面可能就存放了全部的商品數據,全部的商品document。性能

Type:類型

每一個索引裏均可以有一個或多個type,type是index中的一個邏輯數據分類,一個type下的document,都有相同的field,好比博客系統,有一個索引,能夠定義用戶數據type,博客數據type,評論數據type。

商品index,裏面存放了全部的商品數據,商品document

可是商品分不少種類,每一個種類的document的field可能不太同樣,好比說電器商品,可能還包含一些諸如售後時間範圍這樣的特殊field;生鮮商品,還包含一些諸如生鮮保質期之類的特殊field

type,日化商品type,電器商品type,生鮮商品type

日化商品type:product_id,product_name,product_desc,category_id,category_name
電器商品type:product_id,product_name,product_desc,category_id,category_name,service_period
生鮮商品type:product_id,product_name,product_desc,category_id,category_name,eat_period

每個type裏面,都會包含一堆document

{
"product_id": "2",
"product_name": "長虹電視機",
"product_desc": "4k高清",
"category_id": "3",
"category_name": "電器",
"service_period": "1年"
}

{
"product_id": "3",
"product_name": "基圍蝦",
"product_desc": "純自然,冰島產",
"category_id": "4",
"category_name": "生鮮",
"eat_period": "7天"
}

Shard 分片,也稱 Primary Shard

單臺機器沒法存儲大量數據,es能夠將一個索引中的數據切分爲多個shard,分佈在多臺服務器上存儲。有了shard就能夠橫向擴展,存儲更多數據,讓搜索和分析等操做分佈到多臺服務器上去執行,提高吞吐量和性能。

每一個shard都是一個lucene index。

Replica 副本,也稱 Replica Shard

任何一個服務器隨時可能故障或宕機,此時shard可能就會丟失,所以能夠爲每一個shard建立多個replica副本。replica能夠在shard故障時提供備用服務,保證數據不丟失,多個replica還能夠提高搜索操做的吞吐量和性能。

primary shard(創建索引時一次設置,不能修改,默認5個),

replica shard(隨時修改數量,默認1個),

默認每一個索引10個shard,5個primary shard,5個replica shard,最小的高可用配置,是2臺服務器。

相關索引解釋說明:

  • index包含多個shard
  • 每一個shard都是一個最小工做單元,承載部分數據,lucene實例,完整的創建索引和處理請求的能力
  • 增減節點時,shard會自動在nodes中負載均衡
  • primary shard和replica shard,每一個document確定只存在於某一個primary shard以及其對應的replica shard中,不可能存在於多個primary shard
  • replica shard是primary shard的副本,負責容錯,以及承擔讀請求負載
  • primary shard的數量在建立索引的時候就固定了,replica shard的數量能夠隨時修改
  • primary shard的默認數量是5,replica默認是1,默認有10個shard,5個primary shard,5個replica shard
  • primary shard不能和本身的replica shard放在同一個節點上(不然節點宕機,primary shard和副本都丟失,起不到容錯的做用),可是能夠和其餘primary shard的replica shard放在同一個節點上

索引在集羣中分配圖:

本文由博客一文多發平臺 OpenWrite 發佈!

相關文章
相關標籤/搜索