天天看點

es叢集節點數和分片數關系_ES--索引、分片、節點、叢集等概念淺析-搜雲庫

FAQ

1、為什麼一個分片隻能存放 Integer.MAX_VALUE – 128 = 2,147,483,519 個 docs?

索引

一般意義上的索引是一種基于文檔(資料)生成、建立的,用于快速定位指定文檔的工具。

es叢集節點數和分片數關系_ES--索引、分片、節點、叢集等概念淺析-搜雲庫

而 ElasticSearch 對索引的定義有所不同,ElasticSearch 中的索引對應 MySQL 中的 Database ,也就說 ElasticSearch 中的索引更像是一種資料存儲集合,即用于存儲文檔。

ElasticSearch 中的資料根據業務以索引為機關進行劃分,Type(類型) 就像 MySQL 中的 Table 一樣,用于區分同一業務中不同的資料集合,如下圖:

es叢集節點數和分片數關系_ES--索引、分片、節點、叢集等概念淺析-搜雲庫

當然上圖并不是指 ElasticSearch 中就真的這麼存儲資料,而是大概的表現方式。

不過在 6.x 版本後,就廢棄了 Type ,因為設計者發現 ElasticSearch 這種與關系型資料類比的設計方式有缺陷。在關系型資料庫中,每個資料表都是互相獨立的,即在不同表中相同的資料域是互不關聯的。而 ElasticSearch 底層所用的 Lucene 并沒有關系型資料中的這種特性,在 ElasticSearch 同一個索引中,不同映射類型但是名稱相同的資料域在 Lucene 中是同一個資料域,即作為同一類資料存放在一起。

ElasticSearch 6.x 版本廢棄掉 Type 後,建議的是每個類型(業務)的資料單獨放在一個索引中,這樣其實回歸到一般意義上的索引定義,索引定位文檔。如下圖:

es叢集節點數和分片數關系_ES--索引、分片、節點、叢集等概念淺析-搜雲庫

上圖也是一種大概的表現方式,不代表 ElasticSearch 以這種方式處理文檔。

P.S.:如果 ElasticSearch 還是使用 5.x 或以下版本,建議每個索引隻設定一個類型,做到一個索引存儲一種資料。

分片

單個節點由于實體機硬體限制,存儲的文檔是有限的,如果一個索引包含海量文檔,則不能在單個節點存儲。ES 提供分片機制,同一個索引可以存儲在不同分片(資料容器)中。

分片分為主分片 (primary shard) 以及從分片 (replica shard)。主分片會被盡可能平均地 (rebalance) 配置設定在不同的節點上(例如你有 2 個節點,4 個主分片(不考慮備份),那麼每個節點會分到 2 個分片,後來你增加了 2 個節點,那麼你這 4 個節點上都會有 1 個分片,這個過程叫 relocation,ES 感覺後自動完成)。從分片隻是主分片的一個副本,它用于提供資料的備援副本,從分片和主分片不會出現在同一個節點上(防止單點故障),預設情況下一個索引建立 5 個主分片,每個主分片會有一個從分片 (5 primary + 5 replica = 10 個分片)。如果你隻有一個節點,那麼 5 個 replica 都無法被配置設定 (unassigned),此時 cluster status 會變成 Yellow。

分片是獨立的,對于一個 Search Request 的行為,每個分片都會執行這個 Request。每個分片都是一個 Lucene Index,是以一個分片隻能存放 Integer.MAX_VALUE – 128 = 2,147,483,519 個 docs。

replica 的作用主要包括:

1、 容災:primary 分片丢失,replica 分片就會被頂上去成為新的主分片,同時根據這個新的主分片建立新的 replica,叢集資料安然無恙;

2、 提高查詢性能:replica 和 primary 分片的資料是相同的,是以對于一個 query 既可以查主分片也可以查從分片,在合适的範圍内多個 replica 性能會更優(但要考慮資源占用也會提升 [cpu/disk/heap]),另外 Index Request 隻能發生在主分片上,replica 不能執行 Index Request。

注意:對于一個索引,除非重建索引否則不能調整主分片的數目 (number_of_shards),但可以随時調整 replica 的數目 (number_of_replicas)。

節點

一個 ES 節點就是一個運作的 ES 執行個體,可以實作資料存儲并且搜尋的功能。每個節點都有一個唯一的名稱作為身份辨別,如果沒有設定名稱,預設使用 UUID 作為名稱。最好給每個節點都定義上有意義的名稱,在叢集中區分出各個節點。

一個機器可以有多個執行個體,是以并不能說一台機器就是一個 node,大多數情況下每個 node 運作在一個獨立的環境或虛拟機上。

節點類型

master 節點: 叢集中的一個節點會被選為 master 節點,它将負責管理叢集範疇的變更,例如建立或删除索引,添加節點到叢集或從叢集中删除節點。master 節點無需參與文檔層面的變更和搜尋,這意味着僅有一個 master 節點并不會因流量增長而成為瓶頸。任意一個節點都可以成為 master 節點。

data 節點: 持有資料和反向索引。預設情況下,每個節點都可以通過設定配置檔案 elasticsearch.yml 中的 node.data 屬性為 true (預設) 成為資料節點。如果需要一個專門的主節點 (一個節點既可以是 master 節點,同時也可以是 data 節點),應将其 node.data 屬性設定為 false。

client 節點: 如果将 node.master 屬性和 node.data 屬性都設定為 false,那麼該節點就是一個用戶端節點,扮演一個負載均衡的角色,将到來的請求路由到叢集中的各個節點。

叢集

節點通過設定叢集名稱,在同一網絡中發現具有相同叢集名稱的節點,組成叢集。每個叢集都有一個 cluster name 作為辨別,預設的叢集名稱為 elasticsearch。如果在同一網絡中隻有一個節點,則這個節點成為一個單節點叢集。

叢集狀态

Green:所有主分片和從分片都準備就緒(配置設定成功),即使有一台機器挂了(假設一台機器一個執行個體),資料都不會丢失,但會變成 Yellow 狀态。

Yellow:所有主分片準備就緒,但存在至少一個主分片(假設是 A)對應的從分片沒有就緒,此時叢集屬于警告狀态,意味着叢集高可用和容災能力下降,如果剛好 A 所在的機器挂了,而從分片還處于未就緒狀态,那麼 A 的資料就會丢失(查詢結果不完整),此時叢集進入 Red 狀态。

Red:至少有一個主分片沒有就緒(直接原因是找不到對應的從分片成為新的主分片),此時查詢的結果會出現資料丢失(不完整)。

總結

1、 從 ES 6.x 版本開始,已不建議在索引中設定多個類型。正确的結構:一個叢集中有多個索引,一個索引中僅設定一種類型;

2、 一個節點運作在一個獨立的環境或虛拟機上,一個節點可以包含多個分片,一個索引由多個分片組成;

3、 索引的主分片被盡可能平均的配置設定給各個節點;

4、 主分片與對應的從分片不能存儲于同一個節點上。

參考閱讀