【ES】ElasticSearch 叢集
ES(ElasticSearch)叢集基礎知識02
叢集結構
節點:
一個執行中的 Elasticsearch 例項稱為一個 節點
叢集:
是由一個或者多個擁有相同 cluster.name 配置的節點組成, 它們共同承擔資料和負載的壓力。
當有節點加入叢集中或者從叢集中移除節點時,叢集將會重新平均分佈所有的資料。
單節點叢集:
僅啟動一個單獨的節點,構成一個單節點叢集
空節點叢集:
叢集中至於一個節點,且裡面沒有任何資料和索引
上圖只有一個節點,節點內沒有資料和索引
上圖有一個節點,但是節點內有一個索引(3個主分片)
主節點:
被選中用來管理叢集內所有變更(索引的增加、刪除,節點的增加刪除)的節點。
主節點不需要涉及文件級別的變更和搜尋等操作。所以當叢集只擁有一個主節點的情況下,即使流量的增加它也不會成為瓶頸。
請求可以傳送到叢集中的任何節點(含主節點)每個節點都知道任意文件儲存的位置,能夠將我們的請求直接轉發到儲存我們所需文件的節點
啟動多個節點
和啟動單個節點方式一致。
統一機器:只要cluster.name 配置相同就可以自動識別加入叢集並平衡資源
不同機器:需要配置
分片與索引
分片:
ES的底層物理工作單元,資料儲存的容器,全部資料可以有多個分片儲存。
一個分片是一個 Lucene 的例項,以及它本身就是一個完整的搜尋引擎
分片是一個功能完整的搜尋引擎,它擁有使用一個節點上的所有資源的能力
應用程式通過索引與其間接打交道
索引:
儲存相關資料的地方,當需要新增資料時會用到。
本質為物理分片的邏輯名稱空間
應用程式直接與其打交道
主分片:
主分片簡單解釋為已儲存文件的源,索引內任意文件都屬於某一個主分片。
主分片個數決定了索引能夠儲存的文件最大數,而單個主分片能夠儲存的最大文件數由Integer.MAX_VALUE - 128 決定,具體值需要參考使用場景。
副分片:
副分片是主分片的一個拷貝,用於資料容災以及平衡負載,可提供搜尋和返回文件等讀操作的服務。
一般情況下副分片的個數要比主分片多(倍數增加),個別情況(叢集亞健康yellow)下存在部分主分片無副分片的情形。
當主分片故障後,副分片可以轉換成主分片(因此主分片副分片無本質的差異)
上圖一個叢集3個節點,6個分片(3主3副)
建立索引與分片設定:
在索引建立的時候就已經確定了主分片數(預設5個主分片),但是副本分片數可以隨時修改。
讓我們在包含一個空節點的叢集內建立名為 blogs 的索引。我們將分配3個主分片和一份副本(每個主分片擁有一個副本分片):
PUT /blogs
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
叢集健康狀態
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
}
Green |
所有的主分片和副本分片都正常執行。 |
Yellow |
所有的主分片都正常執行,但不是所有的副本分片都正常執行。 |
Red |
有主分片沒能正常執行。 |
叢集擴容與容災
擴容方式:
垂直擴容:通過提升效能的擴容方式
水平擴容:通過增加更多的裝置擴容方式
真正的擴容能力:水平擴容,而ES天生分散式的可以有效的支援水平擴容
水平擴容:
單一節點的狀態,3個分片
{
"cluster_name": "elasticsearch",
"status": "yellow",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 3,
"active_shards": 3,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 3,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 50
}
unassigned_shards:沒有被分配到任何節點的副本數。
啟動第二個節點後的狀態,6個分片
{
"cluster_name": "elasticsearch",
"status": "green",
"timed_out": false,
"number_of_nodes": 2,
"number_of_data_nodes": 2,
"active_primary_shards": 3,
"active_shards": 6,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 100
}
啟動三個節點的狀態,6個分片
增加副本擴容
PUT /blogs/_settings
{
"number_of_replicas" : 2
}
兩倍副本擴容後狀態,9個分片
故障容災
刪除一個主節點後,重新分配主節點node2,以及副分片轉換成主分片(R1->P1,R2->P2)