Elasticsearch當清理緩存( echo 3 > /proc/sys/vm/drop_caches )的時候,出現
以下集羣健康值:red,紅色預警狀態,同時部分分片都成爲灰色。
查看Elasticsearch啓動日誌會發現以下:
集羣服務超時鏈接的狀況。node
bserver: timeout notification from cluster service. timeout setting [1m], time since start [1m]
該問題排查耗時很長,問題已經解決。
特將問題排查及解決方案詳盡的整理出來。緩存
head插件會以不一樣的顏色顯示。
1)、綠色——最健康的狀態,表明全部的主分片和副本分片均可用;
2)、黃色——全部的主分片可用,可是部分副本分片不可用;
3)、紅色——部分主分片不可用。(此時執行查詢部分數據仍然能夠查到,遇到這種狀況,仍是趕快解決比較好。)
參考官網:http://t.cn/RltLEpN(部分中文集羣健康狀態博文資料翻譯的不夠精確,以官網爲準)ruby
若是集羣狀態爲紅色, Head插件顯示:集羣健康值red 。則說明:至少一個主分片分配失敗。bash
這將致使一些數據以及索引的某些部分再也不可用。app
儘管如此, ElasticSearch仍是容許咱們執行查詢,至因而通知用戶查詢結果可能不完整仍是掛起查詢,則由應用構建者來決定。curl
一句話解釋:未分配的分片。
啓動ES的時候,經過Head插件不停刷新,你會發現集羣分片會呈現紫色、灰色、最終綠色的狀態。ui
若是不能分配分片,例如,您已經爲集羣中的節點數過度分配了副本分片的數量,則分片將保持UNASSIGNED狀態。
其錯誤碼爲:ALLOCATION_FAILED。url
你能夠經過以下指令,查看集羣中不一樣節點、不一樣索引的狀態。spa
GET _cat/shards?h=index,shard,prirep,state,unassigned.reason
head插件查看會:Elasticsearch啓動N長時候後,某一個或幾個分片仍持續爲灰色。插件
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 :肯定更好的副本位置被標定使用,致使現有的副本分配被取消,出現未分配。
症狀:集羣健康值紅色;
日誌:集羣服務鏈接超時;
可能緣由:集羣中部分節點的主分片未分配。
接下來的解決方案主要圍繞:使主分片unsigned 分片完成再分配展開。
方案一:極端狀況——這個分片數據已經不可用,直接刪除該分片。
ES中沒有直接刪除分片的接口,除非整個節點數據已再也不使用,刪除節點。
curl -XDELETE ‘localhost:9200/index_name/’
方案二:集羣中節點數量>=集羣中全部索引的最大副本數量 +1。
N> = R + 1
其中:
N——集羣中節點的數目;
R——集羣中全部索引的最大副本數目。
知識點:當節點加入和離開集羣時,主節點會自動從新分配分片,以確保分片的多個副本不會分配給同一個節點。換句話說,主節點不會將主分片分配給與其副本相同的節點,也不會將同一分片的兩個副本分配給同一個節點。
若是沒有足夠的節點相應地分配分片,則分片可能會處於未分配狀態。
因爲個人集羣就一個節點,即N=1;因此R=0,才能知足公式。
問題就轉嫁爲:
1)添加節點處理,即N增大;
2)刪除副本分片,即R置爲0。
R置爲0的方式,能夠經過以下命令行實現:
root@tyg:/# curl -XPUT "http://localhost:9200/_settings" -d' { "number_of_replicas" : 0 } ' {"acknowledged":true}
方案三:allocate從新分配分片。
若是方案二仍然未解決,能夠考慮從新分配分片。
可能的緣由:
1)節點在從新啓動時可能遇到問題。正常狀況下,當一個節點恢復與羣集的鏈接時,它會將有關其分片的信息轉發給主節點,而後主節點將這分片從「未分配」轉換爲「已分配/已啓動」。
2)當因爲某種緣由(例如節點的存儲已被損壞)致使該進程失敗時,分片可能保持未分配狀態。
在這種狀況下,您必須決定如何繼續:嘗試讓原始節點恢復並從新加入集羣(而且不要強制分配主分片);
或者強制使用Reroute API分配分片並從新索引缺乏的數據原始數據源或備份。
若是您決定分配未分配的主分片,請確保將「allow_primary」:「true」標誌添加到請求中。
ES5.X使用腳本以下:
NODE="YOUR NODE NAME" IFS=$'\n' for line in $(curl -s 'localhost:9200/_cat/shards' | fgrep UNASSIGNED); do INDEX=$(echo $line | (awk '{print $1}')) SHARD=$(echo $line | (awk '{print $2}')) curl -XPOST 'localhost:9200/_cluster/reroute' -d '{ "commands": [ { " allocate_replica ": { "index": "'$INDEX'", "shard": '$SHARD', "node": "'$NODE'", "allow_primary": true } } ] }' done
—————————————————————————————