1.集群狀態:
(1)綠色—最健康的狀態,代表所有的主分片和副本分片都可用;
(2)黃色—所有的主分片可用,但是部分副本分片不可用;
(3)紅色—部分主分片不可用。(此時執行查詢部分數據仍然可以查到,遇到這種情況,還是趕快解決比較好。)
2.查看集群中不同節點,不同索引的狀態
GET _cat/shards?h=index,shard,prirep,state,unassigned.reason
3.導致未分配分片unassigned可能的原因
1)INDEX_CREATED:由於創建索引的API導致未分配。 2)CLUSTER_RECOVERED :由於完全集群恢復導致未分配。 3)INDEX_REOPENED :由於打開open或關閉close一個索引導致未分配。 4)DANGLING_INDEX_IMPORTED :由於導入dangling索引的結果導致未分配。 5)NEW_INDEX_RESTORED :由於恢復到新索引導致未分配。 6)EXISTING_INDEX_RESTORED :由於恢復到已關閉的索引導致未分配。 7)REPLICA_ADDED:由於顯式添加副本分片導致未分配。 8)ALLOCATION_FAILED :由於分片分配失敗導致未分配。 9)NODE_LEFT :由於承載該分片的節點離開集群導致未分配。 10)REINITIALIZED :由於當分片從開始移動到初始化時導致未分配(例如,使用影子shadow副本分片)。 11)REROUTE_CANCELLED :作為顯式取消重新路由命令的結果取消分配。 12)REALLOCATED_REPLICA :確定更好的副本位置被標定使用,導致現有的副本分配被取消,出現未分配。
4.解決未分配分片unassigned方案
方案一、
極端情況—這個分片數據已經不可用,直接刪除該分片。
ES中沒有直接刪除分片的接口,除非整個節點數據已不再使用,刪除節點。
curl -u elastic:xxxx -XDELETE ‘localhost:9200/index_name/’
方案二、
集群中節點數量>集群中所有索引可配置最大副本數量。
N> R
其中:
N—集群中節點的數目;
R—集群中所有索引可配置最大副本數目。
知識點:當節點加入和離開集群時,主節點會自動重新分配分片,以確保分片的多個副本不會分配給同一個節點。換句話說,主節點不會將主分片分配給與其副本相同的節點,也不會將同一分片的兩個副本分配給同一個節點。
如果沒有足夠的節點相應地分配分片,則分片可能會處於未分配狀態。
由於我的集群就3個節點,即N=3;所以R=2,也能滿足公式,而集群副本分配默認為1。
問題就轉嫁為:
1)添加節點處理,即N增大;
2)調小副本分片,即R置為2。
R置為2的方式,可以通過如下命令行實現【當集群節點大於1時,不建議將索引副本設置為0】:
curl -u elastic:xxxx -XPUT "http://localhost:9200/_settings" -d '{ "number_of_replicas" : 2 }'
{"acknowledged":true}
查看elasticsearchx系統配置
GET _settings
然而查到我的集群出問題的索引副本竟然是3
嘗試將默認副本數number_of_replicas改為1
集群健康狀態恢復了