讀《Elasticsearch 權威指南》叢集內的原理
ElasticSearch 的主旨是隨時可用和按需擴容。真正的擴容能力是來自於水平擴容,為叢集新增更多的節點,並且將負載壓力和穩定性分散到這些節點中。
空叢集
如果我們啟動了一個單獨的節點,裡面不包含任何的資料和索引,那我們的叢集看起來就是一個“包含空內容節點的叢集”。
一個執行中的 Elasticsearch 例項稱為一個 節點 ,而叢集是由一個或者多個擁有相同 cluster.name 配置的節點組成,它們共同承擔資料和負載的壓力。當有節點加入叢集中或者從叢集中移除節點時,叢集將會重新平均分佈所有的資料。
當一個節點被選舉成為 主節點時 , 它將負責管理叢集範圍內的所有變更,例如增加、刪除索引,或者增加、刪除節點等。而主節點並不需要涉及到文件級別的變更和搜尋等操作,所以當叢集只擁有一個主節點的情況下,即使流量的增加它也不會成為瓶頸。任何節點都可以成為主節點。
作為使用者,我們可以將請求傳送到叢集中的任何節點,包括主節點。每個節點都知道任意文件所處的位置,並且能夠將我們的請求直接轉發到儲存我們所需文件的節點。無論我們將請求傳送到哪個節點,它都能負責從各個包含我們所需文件的節點收集回資料,並將最終結果返回給客戶端。 Elasticsearch 對這一切的管理都是透明的。
叢集健康
Elasticsearch 的叢集監控資訊中包含了許多的統計資料,其中最為重要的一項就是 叢集健康 , 它在 status 欄位中展示為 green、yellow 或者 red。
GET /_cluster/health
在一個不包含任何索引的空叢集中,它將會有一個類似於如下所示的返回內容:
{ "cluster_name":"elasticsearch", "status":"green", "timed_out":false, "number_of_nodes":1, "number_of_data_nodes":1, "active_primary_shards": 0, "active_shards":0, "relocating_shards":0, "initializing_shards":0, "unassigned_shards":0 }
status 欄位指示著當前叢集在總體上是否工作正常。它的三種顏色含義如下:
-
green 所有的主分片和副本分片都正常執行。
-
yellow 所有的主分片都正常執行,但不是所有的副本分片都正常執行。
-
red 有主分片沒能正常執行。
新增索引
索引實際上是指向一個或者多個物理 分片 的 邏輯名稱空間 。
一個 分片 是一個底層的 工作單元 ,它僅儲存了全部資料中的一部分。 我們簡單的認為一個分片是一個 Lucene 的例項,以及它本身就是一個完整的搜尋引擎。我們的文件被儲存和索引到分片內,但是應用程式是直接與索引而不是與分片進行互動。
Elasticsearch 是利用分片將資料分發到叢集內各處的。分片是資料的容器,文件儲存在分片內,分片又被分配到叢集內的各個節點裡。當你的叢集規模擴大或者縮小時,Elasticsearch 會自動的在各節點中遷移分片,使得資料仍然均勻分佈在叢集裡。
一個分片可以是 主 分片或者 副本 分片。索引內任意一個文件都歸屬於一個主分片,所以主分片的數目決定著索引能夠儲存的最大資料量。
一個副本分片只是一個主分片的拷貝。 副本分片作為硬體故障時保護資料不丟失的冗餘備份,併為搜尋和返回文件等讀操作提供服務。
在索引建立的時候就已經確定了主分片數,但是副本分片數可以隨時修改。
擁有一個索引的單節點叢集:
新增故障轉移
擁有兩個節點的叢集——所有主分片和副本分片都已被分配:
水平擴容
擁有三個節點的叢集——為了分散負載而對分片進行重新分配:
Node 1 和 Node 2 上各有一個分片被遷移到了新的 Node 3 節點,現在每個節點上都擁有2個分片,而不是之前的3個。這表示每個節點的硬體資源(CPU, RAM, I/O)將被更少的分片所共享,每個分片的效能將會得到提升。
分片是一個功能完整的搜尋引擎,它擁有使用一個節點上的所有資源的能力。
更多的擴容
主分片的數目在索引建立時就已經確定了下來。但是,讀操作——搜尋和返回資料——可以同時被主分片或副本分片所處理,所以當你擁有越多的副本分片時,也將擁有越高的吞吐量。
將引數 number_of_replicas 調大到 2:
當然,如果只是在相同節點數目的叢集上增加更多的副本分片並不能提高效能,因為每個分片從節點上獲得的資源會變少。你需要增加更多的硬體資源來提升吞吐量。
但是更多的副本分片數提高了資料冗餘量:按照上面的節點配置,我們可以在失去2個節點的情況下不丟失任何資料。
應對故障
關閉了一個節點後的叢集:
在我們關閉 Node 1 的同時也失去了主分片 1 和 2 ,並且在缺失主分片的時候索引也不能正常工作。所以新的主節點立即將這些分片在 Node 2 和 Node 3 上對應的副本分片提升為主分片。
如果我們同樣關閉了 Node 2 ,我們的程式 依然 可以保持在不丟任何資料的情況下執行,因為 Node 3 為每一個分片都保留著一份副本。
如果我們重新啟動 Node 1 ,叢集可以將缺失的副本分片再次進行分配。如果 Node 1 依然擁有著之前的分片,它將嘗試去重用它們,同時僅從主分片複製發生了修改的資料檔案。
Reference:
https://www.elastic.co/guide/cn/elasticsearch/guide/cn/distributed-cluster.html