在ElasticSearch中,集群(Cluster),節點(Node),分片(Shard),Indices(索引),replicas(備份)之間是什麼關係?
被分散式搜索引擎ElasticSearch中的幾個基礎概念弄得有點暈,似懂非懂。比如它們在搜索引擎中都起著什麼樣的作用?在配置上需要把握什麼樣的原則?是一台機器一個節點(Node)嗎?
Cluster包含多個node,Indices不應該理解成動詞索引,Indices可理解成關係資料庫中的databases,Indices可包含多個Index,Index對應關係資料庫中的database,它是用來存儲相關文檔的。Elasticsearch與關係數據的類比對應關係如下:
Relational DB ? Databases ? Tables ? Rows ? Columns
Elasticsearch ? Indices ? Types
? Documents ? Fields
這裡的document的可以理解為一個JSON序列對象。每個document可包含多個field。
再來說說Shard,每個Index(對應Database)包含多個Shard,默認是5個,分散在不同的Node上,但不會存在兩個相同的Shard存在一個Node上,這樣就沒有備份的意義了。Shard是一個最小的Lucene索引單元。
當來一個document的時候,Elasticsearch通過對docid進行hash來確定其放在哪個shard上面,然後在shard上面進行索引存儲。
replicas就是備份,Elasticsearch採用的是Push Replication模式,當你往 master主分片上面索引一個文檔,該分片會複製該文檔(document)到剩下的所有 replica副本分片中,這些分片也會索引這個文檔。我個人覺得這種模式很nice,有些時候對於一個document的進行索引可能生成很大的索引文件,會很占帶寬,而只傳輸原始文件會好很多。
當進行查詢是,如果提供了查詢的DocID,Elasticsearch通過hash就知道Doc存在哪個shard上面,再通過routing table查詢就知道再哪個node上面,讓後去node上面去取就好了。如果不提供DocID,那麼Elasticsearch會在該Index(indics)shards所在的所有node上執行搜索預警,然後返回搜索結果,由coordinating node gather之後返回給用戶。
配置上需要把握什麼樣的原則,應該去看一個ES優化方面的資料,推薦兩本書
ElasticSearch Server (豆瓣),Mastering ElasticSearch (豆瓣)一個機器不應定只部署一個node,一台機器可以虛擬化出多個虛擬機(至於虛擬化出多少看性能),每個虛擬機都可以部署一個node.尤其在雲計算環境下,如果租用雲虛擬主機,誰知道它們是不是在同一台機器上。。。以上是個人理解,僅供參考;如有不對,多提意見。
【Cluster】
集群,一個ES集群由一個或多個節點(Node)組成,每個集群都有一個cluster name作為標識。==================================================================【node】節點,一個ES實例就是一個node,一個機器可以有多個實例,所以並不能說一台機器就是一個node,大多數情況下每個node運行在一個獨立的環境或虛擬機上。==================================================================【index】索引,即一系列documents的集合。==================================================================【shard】
1. 分片,ES是分散式搜索引擎,每個索引有一個或多個分片,索引的數據被分配到各個分片上,相當於一桶水用了N個杯子裝。
2. 分片有助於橫向擴展,N個分片會被儘可能平均地(rebalance)分配在不同的節點上(例如你有2個節點,4個主分片(不考慮備份),那麼每個節點會分到2個分片,後來你增加了2個節點,那麼你這4個節點上都會有1個分片,這個過程叫relocation,ES感知後自動完成)。
3. 分片是獨立的,對於一個Search Request的行為,每個分片都會執行這個Request。
4. 每個分片都是一個Lucene Index,所以一個分片只能存放 Integer.MAX_VALUE - 128 = 2,147,483,519 個docs。[LUCENE-5843] IndexWriter should refuse to create an index with more than INT_MAX docs
==================================================================【replica】1. 複製,可以理解為備份分片,相應地有primary shard(主分片)。2. 主分片和備分片不會出現在同一個節點上(防止單點故障),默認情況下一個索引創建5個分片一個備份(即5primary+5replica=10個分片)
3. 如果你只有一個節點,那麼5個replica都無法分配(unassigned),此時cluster status會變成Yellow。
ES集群狀態有三種:
- Green:所有主分片和備份分片都準備就緒(分配成功),即使有一台機器掛了(假設一台機器一個實例),數據都不會丟失,但會變成Yellow狀態
- Yellow:所有主分片準備就緒,但存在至少一個主分片(假設是A)對應的備份分片沒有就緒,此時集群屬於警告狀態,意味著集群高可用和容災能力下降,如果剛好A所在的機器掛了,並且你只設置了一個備份(已處於未就緒狀態),那麼A的數據就會丟失(查詢結果不完整),此時集群進入Red狀態
- Red:至少有一個主分片沒有就緒(直接原因是找不到對應的備份分片成為新的主分片),此時查詢的結果會出現數據丟失(不完整)
4. replica的作用主要包括:
a. 容災:primary分片丟失,replica分片就會被頂上去成為新的主分片,同時根據這個新的主分片創建新的replica,集群數據安然無恙
b. 提高查詢性能:replica和primary分片的數據是相同的,所以對於一個query既可以查主分片也可以查備分片,在合適的範圍內多個replica性能會更優(但要考慮資源佔用也會提升[cpu/disk/heap]),另外index request只能發生在主分片上,replica不能執行index request。
5. 對於一個索引,除非重建索引否則不能調整分片的數目(主分片數, number_of_shards),但可以隨時調整replica數(number_of_replicas)。
==================================================================
不熟悉es
但估計都差不多cluster是整個集群包含n個node
node通常掌控獨立的資源,cpu內存什麼的一台機器可以多個nodeshard一般是從數據角度來說的
1000條數據按id分,存10份,就是10個shardshards分散在多個node上副本好理解
同樣的數據再來一份同樣的shard再來一份副本是乘法,越多越浪費,也越保險
分片是除法,越多單片數據就越少,也越分散如此如此。。。nnd手機打字太累以下是內容來源於:基本概念 | elasticsearch中文指南侵刪!--------------------------------------------------------------------------------------------------------------------集群(cluster)
一個集群就是由一個或多個節點組織在一起, 它們共同持有你全部的數據, 並一起提供索引和搜索功能。 一個集群由一個唯一的名字標識, 這個名字默認就是「elasticsearch」。 這個名字很重要, 因為一個節點只能通過指定某個集群的名字,來加入這個集群。在生產環境中顯式地設定這個名字是一個好習慣,但是使用默認值來進行測試/開發也是不錯的。
注意,一個集群中只包含一個節點是合法的。另外,你也可以擁有多個集群,集群以名字區分。
節點(node)
一個節點是你集群中的一個伺服器,作為集群的一部分,它存儲你的數據,參與集群的索引和搜索功能。 和集群類似, 一個節點也是由一個名字來標識的, 默認情況下, 這個名字是一個隨機的Marvel角色的名字,這個名字會在節點啟動時分配給它。這個名字對於管理工作來說很重要,因為在這個管理過程中,你會去確定網路中的哪些 伺服器對應於Elasticsearch集群中的哪些節點。
一個節點可以通過配置集群名稱的方式來加入一個指定的集群。 默認情況下,每個節點都會被安排加入到一個叫做「elasticsearch」的集群中,這意味著,如果你在你的網路中啟動了若干個節點, 並假定它們能夠相互發現彼此,它們將會自動地形成並加入到一個叫做「elasticsearch」 的集群中。
在一個集群里可以擁有任意多個節點。而且,如果當前你的網路中沒有運行任何Elasticsearch節點,這時啟動一個節點,會默認創建並加入一個叫做「elasticsearch」的單節點集群。
索引(index)一個索引就是一個擁有相似特徵的文檔的集合。比如說,你可以有一個客戶數據的索引,另一個產品目錄的索引,還有一個訂單數據的索引。一個索引由一個名字來 標識(必須全部是小寫字母的),並且當我們要對這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。在一個集群中,你能夠創建任意多個索引。
類型(type)在一個索引中,你可以定義一種或多種類型。一個類型是你的索引的一個邏輯上的分類/分區,其語義完全由你來定。通常,會為具有一組相同欄位的文檔定義一個類型。比如說,我們假設你運營一個博客平台 並且將你所有的數據存儲到一個索引中。在這個索引中,你可以為用戶數據定義一個類型,為博客數據定義另一個類型,當然,也可以為評論數據定義另一個類型。
文檔(document)一個文檔是一個可被索引的基礎信息單元。比如,你可以擁有某一個客戶的文檔、某一個產品的一個文檔、某個訂單的一個文檔。文檔以JSON格式來表示,而JSON是一個到處存在的互聯網數據交互格式。
在一個index/type裡面,你可以存儲任意多的文檔。注意,一個文檔物理上存在於一個索引之中,但文檔必須被索引/賦予一個索引的type。
分片和複製(shards and replicas)一個索引可以存儲超出單個結點硬體限制的大量數據。比如,一個具有10億文檔的索引佔據1TB的磁碟空間,而任一節點可能沒有這樣大的磁碟空間來存儲或者單個節點處理搜索請求,響應會太慢。
為了解決這個問題,Elasticsearch提供了將索引劃分成多片的能力,這些片叫做分片。當你創建一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善並且獨立的「索引」,這個「索引」 可以被放置到集群中的任何節點上。
分片之所以重要,主要有兩方面的原因:
- 允許你水平分割/擴展你的內容容量
- 允許你在分片(位於多個節點上)之上進行分散式的、並行的操作,進而提高性能/吞吐量
至於一個分片怎樣分布,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的,對於作為用戶的你來說,這些都是透明的。
在一個網路/雲的環境里,失敗隨時都可能發生。在某個分片/節點因為某些原因處於離線狀態或者消失的情況下,故障轉移機制是非常有用且強烈推薦的。為此, Elasticsearch允許你創建分片的一份或多份拷貝,這些拷貝叫做複製分片,或者直接叫複製。
複製之所以重要,有兩個主要原因:
- 在分片/節點失敗的情況下,複製提供了高可用性。複製分片不與原/主要分片置於同一節點上是非常重要的。
- 因為搜索可以在所有的複製上並行運行,複製可以擴展你的搜索量/吞吐量
總之,每個索引可以被分成多個分片。一個索引也可以被複制0次(即沒有複製) 或多次。一旦複製了,每個索引就有了主分片(作為複製源的分片)和複製分片(主分片的拷貝)。 分片和複製的數量可以在索引創建的時候指定。在索引創建之後,你可以在任何時候動態地改變複製的數量,但是你不能再改變分片的數量。
默認情況下,Elasticsearch中的每個索引分配5個主分片和1個複製。這意味著,如果你的集群中至少有兩個節點,你的索引將會有5個主分片和另外5個複製分片(1個完全拷貝),這樣每個索引總共就有10個分片。
更多資料參考:jacksu/awesome-es
(ES插件Kopf截圖,來自:Elasticsearch Primary Shards not balanced)
這張圖可以展示出ES各組件之間的關係,整張表是一個Cluster,橫行是Nodes,豎列是Indices,深綠色方塊是Primary Shards,淺綠色方塊是Replica Shards。至於單個Host上的Node數目問題,在硬體資源有限的情況下,一般的做法是一個Host只運行一個ES進程,也就是一個Node。例外情況是,由於ES內存配置上的特殊要求(JVM Heap不能超過32G),如果你的Host特別NB(16 Core CPU + 128G RAM + SSD 這種),完全可以在單個Host上運行多個ES進程以避免硬體資源的浪費。集群=一堆節點。索引=一堆分片。副本=分片的備份
個人的理解,僅供參考:(1)cluster node 可以看做是物理視圖概念。(2)shard 可以看做是業務層的概念,業務總是部署在 cluster中。shard呢就是運行在node上的。一個node可以運行多個shard,從資源高可用,當然是多shard疊加一個node,從隔離安全性看,最好一個shard部署一個node。(3)replicas通常是對indices,也時常說是對shard更大粒度的。(4)單排結構、雙排結構;虛擬機、物理機。如果是已經虛擬好的vm,在日常、預發環境,還是疊加部署了。一個node儘可能部署更多的shard。線上環境,可以考慮預分配不同規格的vm,然後讓每個vm部署一個合適的node,一個node運行一個shard。底層對應物理機,考慮jvm垃圾回收,多進程代替多shard。 中小應用,可以考慮單排結構。對應大應用,依然建議走兩排結構,帶來系統的高可以運維、性能的優化、擴容的便利、資源調度等。
elasticsearch 中文文檔:13428282016/elasticsearch-CN 有解析
通常在官方說明看不太懂的概念,我一般會抽象成自己的表述,所以以下答案非官方且不太嚴謹,僅供參考.
你有2個卡包(卡包是node節點,你的腦袋是master節點,三個節點都屬於你,組成一個單集群,這裡是master和node分離的情況),每個卡包有5個卡位(卡位是分片,這裡忽略複製分片概念),每個卡位可以放1張或者多張卡片(卡片是索引的文檔,卡片的類型是索引的類型);
集群
es集群的功能跟平常我們所知的分散式應用集群功能一樣(高可用);
擁有相同集群名稱的多個es實例組成一個集群(一台機器上可以多個實例,即一台機器也可以是一個集群),可以有單集群和多集群.
節點
粗暴點可以等同上面集群概念中的實例,有master和node之分,master用來統籌集群的所有狀態以及分片的分配等調度工作.
分片
分片有主分片和複製分片(就是你說的replicas),分片是用來存儲數據的,是es裡面最小操作(CRUD)單位(主分片還多一個操作:索引[這裡是動詞]),es會根據你的yml配置,在你的節點上面分片主分片和複製分片(主和複製不會再同一節點)
索引
名詞的時候(Indices):根據你指定的規則劃定的某一類數據,索引可以分多個類型,類型可以有多個文檔,文檔才是真正的數據
動詞的時候:就是相當於你的搜索操作
集群裡面多台機器(可以是虛擬機)就是節點。節點中可以有多個分片分布在集群中不同的節點上。一個分片其實就是一個完整的es實例,就是一個功能獨立的搜索引擎。這個實例裡面可以有多個索引,可以理解為多個db
推薦閱讀:
※請問卡飯網是怎麼欺騙搜索引擎的?
※如何高效地使用搜索引擎?
※人們不用搜狗搜索的原因有哪些?
※DuckDuckGo 會動搖 Google 搜索的地位嗎?
※微軟是否應該放棄必應?