Elasticsearch解決健康狀態異常問題

目錄

 

1.Elasticsearch健康狀態

2. 如何解決健康狀態爲黃色?

3. 如何解決健康狀態爲紅色?


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,集羣健康值顯示爲綠色(如果還不是,請考慮其它原因)。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章