目錄
1.Elasticsearch健康狀態
Elasticsearch 集羣健康狀態分爲三種:
green:最健康得狀態,說明所有的分片包括備份都可用; 這種情況Elasticsearch集羣所有的主分片和副本分片都已分配, Elasticsearch集羣是 100% 可用的。
yellow:基本的分片可用,但是備份不可用(或者是沒有備份); 這種情況Elasticsearch集羣所有的主分片已經分片了,但至少還有一個副本是缺失的。不會有數據丟失,所以搜索結果依然是完整的。不過,你的高可用性在某種程度上被弱化。如果 更多的 分片消失,你就會丟數據了。把 yellow 想象成一個需要及時調查的警告。
red:部分的分片可用,表明分片有一部分損壞。此時執行查詢部分數據仍然可以查到,遇到這種情況,還是趕快解決比較好; 這種情況Elasticsearch集羣至少一個主分片(以及它的全部副本)都在缺失中。這意味着你在缺少數據:搜索只能返回部分數據,而分配到這個分片上的寫入請求會返回一個異常。
Elasticsearch 集羣不健康時的排查思路:
1) 首先確保 es 主節點最先啓動,隨後啓動數據節點;
2) 允許 selinux(非必要),關閉 iptables;
3) 確保數據節點的elasticsearch配置文件正確;
4) 系統最大打開文件描述符數是否夠用;
5) elasticsearch設置的內存是否夠用 ("ES_HEAP_SIZE"內存設置 和 "indices.fielddata.cache.size"上限設置);
6) elasticsearch的索引數量暴增 , 刪除一部分索引(尤其是不需要的索引);
注意: 如下是單機單節點部署Elasticsearch, 集羣狀態可能爲yellow, 因爲單點部署Elasticsearch, 默認的分片副本數目配置爲1,而相同的分片不能在一個節點上,所以就存在副本分片指定不明確的問題,所以顯示爲yellow。
可以通過在Elasticsearch集羣上添加一個節點來解決問題,如果不想這麼做,可以刪除那些指定不明確的副本分片(當然這不是一個好辦法)刪除操作如下。
刪除副本分片的辦法:curl -XPUT "http://localhost:9200/_settings" -d' { "number_of_replicas" : 0 } '
節點數和備份數遵循原則:
節點數和備份數應遵循: N >= R + 1, N爲節點數,R爲number_of_replicas設置的值
2. 如何解決健康狀態爲黃色?
問題描述:單機版Elasticsearch,版本6.7.0,使用head查看發現集羣健康值顯示黃色?
黃色表示基本的分片可用,但是備份不可用(或者是沒有備份),查看es,發現主節點某個分片出現問題,變成Unassigned,例如下圖dfy_index在node-1中的分片2會顯示在unassigned那一排,集羣狀態爲紅色或者黃色
unssigned表示未分配副本分片的問題,在執行settings中刪除副本分片的命令後, 這個問題就解決了。
原因:索引的“number_of_replicas (備份數)”爲1,而節點只有1個,所以備份出來的數據沒有節點可分配。
解決辦法:增加節點或者刪除副本把number_of_replicas設置爲0,這裏因爲是單機,選擇刪除副本。
方法1:刪除副本統一設置
curl -XPUT -H "Content-Type: application/json" "http://localhost:9200/_settings" -d' {"index" : { "number_of_replicas" : 0 } }'
方法2: 修改elasticsearch.yml配置文件
文件末增加(冒號之後有空格)
index.number_of_replicas: 0
如果設置單個索引設置
curl -XPUT 'localhost:9200/<INDEX_NAME>/_settings' -d '{"number_of_replicas": 0}'
現在使用head插件查看es,集羣健康值顯示爲綠色:
3. 如何解決健康狀態爲紅色?
集羣健康值顯示爲red,則說明至少一個主分片分配失敗, 這將導致一些數據以及索引的某些部分不再可用。遇到這種情況,還是趕快解決比較好。
原因:集羣中部分節點的主分片未分配。r通常時由於某個索引的住分片爲分片unassigned,只要找出這個索引的分片,手工分配即可。
如何解決 unassigned 分片問題?
方法一:刪除索引——如果這個分片數據已經不可用,直接刪除該分片 (即刪除索引)
Elasticsearch中沒有直接刪除分片的接口,除非整個節點數據已不再使用,刪除節點。
刪除索引命令:
curl -XDELETE http://10.0.8.44:9200/索引名
方法二:是否違背節點備份原則 N >= R + 1
公式:集羣中節點數量 >= 集羣中所有索引的最大副本數量 +1
1) 添加節點處理,即N增大;
2) 刪除副本分片,即R置爲0;
curl -XPUT 'localhost:9200/<INDEX_NAME>/_settings' -d '{"number_of_replicas": 0}'
方法三:allocate重新分配分片
如果方案二仍然未解決,可以考慮重新分配分片。可能的原因:
1) 節點在重新啓動時可能遇到問題。正常情況下,當一個節點恢復與羣集的連接時,它會將有關其分片的信息轉發給主節點,然後主節點將這分片從“未分配”轉換爲 "已分配/已啓動"。
2) 當由於某種原因 (例如節點的存儲已被損壞) 導致該進程失敗時,分片可能保持未分配狀態。
在這種情況下,必須決定如何繼續: 嘗試讓原始節點恢復並重新加入集羣(並且不要強制分配主分片); 或者強制使用Reroute API分配分片並重新索引缺少的數據原始數據源或備份。 如果你決定分配未分配的主分片,請確保將"allow_primary":"true"標誌添加到請求中。
curl -XPOST '{ESIP}:9200/_cluster/reroute' -d '{
"commands" : [ {
"allocate" : {
"index" : "eslog1",
"shard" : 4,
"node" : "es1",
"allow_primary" : true
}
}
]
}'
現在使用head插件查看es,集羣健康值顯示爲綠色(如果還不是,請考慮其它原因)。