誰再問elasticsearch集群Red怎麼辦?把這篇筆記給他

2021-01-07 俠夢說

前言

可能你經歷過這些Red.

。。。等等

那ES的Red是神麼意思?

這裡說的red,是指es集群的狀態,一共有三種,green、red、yellow。具體含義:

冷靜分析

從上圖可知,集群red是由於有主分片不可用,這種情況一般是由於節點宕機。

有什麼影響呢?

至少一個主分片(以及它的全部副本)都在缺失中。這意味著你在缺少數據:搜索只能返回部分數據,而分配到這個分片上的寫入請求會返回一個異常。

此時我們可以執行相關的命令進行狀態檢查。

集群節點是否都存在、查看集群狀態。

curl -uelastic:pwd -XGET "http://ip:9200/_cluster/health?pretty"

active_shards 是涵蓋了所有索引的所有分片的匯總值,其中包括副本分片。relocating_shards 顯示當前正在從一個節點遷往其他節點的分片的數量。通常來說應該是 0,不過在 Elasticsearch 發現集群不太均衡時,該值會上漲。比如說:添加了一個新節點,或者下線了一個節點。initializing_shards 顯示的是剛剛創建的分片的個數。比如,當你剛創建第一個索引,分片都會短暫的處於 initializing 狀態,分片不應該長期停留在 initializing 狀態。你還可能在節點剛重啟的時候看到 initializing 分片:當分片從磁碟上加載後,它們會從 initializing 狀態開始。所以這一般是臨時狀態。unassigned_shards 是已經在集群狀態中存在的分片,但是實際在集群裡又找不著。最常見的體現在副本上。比如,我有兩個es節點,索引設置分片數量為 10, 3 副本,那麼在集群上,由於災備原則,主分片和其對應副本不能同時在一個節點上,es無法找到其他節點來存放第三個副本的分片,所以就會有 10 個未分配副本分片。如果你的集群是 red 狀態,也會長期保有未分配分片(因為缺少主分片)。

unassigned_shards原因1

上面說了一種造成 unassigned_shards的原因,就是副本太多,節點太少,es無法完成分片。舉一反三!由於索引的副本是可以動態修改的,那麼,如果在修改時分配的副本數大於節點數目,那麼肯定會有分片是這個狀態。這種情況的解決辦法有兩種: 1、是動態調整一下副本數量。 2、新加入一個節點來平衡。unassigned還有其他原因?

目前集群爆紅,但是所有節點都還在,有點詭異,從集群狀態看,一共是兩個分片有問題,一個正在初始化,一個是unassigned。確定了故障範圍後,我們再來從索引層面、分片層面深入的分析具體原因把。

索引層面分析

再執行

curl -uelastic:pwd -XGET "http://ip:9200/_cluster/health?pretty&level=indices"沒錯,還是這個api,不過值得注意的是level=indices,想必讀者已經心領神會。這個api返回的是一個格式化後的json,如果太長,推薦輸出到一個文本裡面看。

從返回的信息中,我們可以看到,01-04索引目前狀態為red,它有2個分片,0個副本,有一個分片正在初始化,從這個數據可以看出,受影響的是主分片,想到這裡,感到慌不擇路。

分片層面分析

少俠,莫慌!

知道了索引層面的故障信息,我們繼續深究,看看分片層面。

curl -uelastic:pwd -XGET "http://ip:9200/_cluster/health?level=shards"當然,重點還是level=shards,顯示如下:

至此,我們可以得到更多的線索:

索引名:xxx-01-04。分片數量:2。副本數:0。有問題的分片號:0。並且是主分片。分片狀態:initializing。說明正在初始化,自我恢復中。既然是在恢復,那找恢復相關的api,看看。

curl -u elastic:pwd -XGET http://ip:9200/索引名/_recovery?pretty=true

從上圖可以看到,花費了14.1個小時,從translog中恢復!目前進度很是堪憂。配合kibana看一下:

插播一下,translog的知識

我們把數據寫到磁碟後,還要調用fsync才能把數據刷到磁碟中,如果不這樣做在系統掉電的時候就會導致數據丟失,這個原理相信大家都清楚,elasticsearch為了高可靠性必須把所有的修改持久化到磁碟中。我們的數據先寫入到buffer裡面,在buffer裡面的數據時搜索不到的,同時將數據寫入到translog日誌文件之中。如果buffer快滿了,或是一段時間之後,就會將buffer數據refresh到一個新的OS cache之中。translog的作用:在執行commit之前,所有的而數據都是停留在buffer或OS cache之中,無論buffer或OS cache都是內存,一旦這臺機器死了,內存的數據就會丟失,所以需要將數據對應的操作寫入一個專門的日誌文件之中。一旦機器出現宕機,再次重啟的時候,es會主動的讀取translog之中的日誌文件數據,恢復到內存buffer和OS cache之中。整個commit過程就叫做一個flush操作其實translog的數據也是先寫入到OS cache之中的,默認每隔5秒之中將數據刷新到硬碟中去,也就是說,可能有5秒的數據僅僅停留在buffer或者translog文件的OS cache中,如果此時機器掛了,會丟失5秒的數據,但是這樣的性能比較好,我們也可以將每次的操作都必須是直接fsync到磁碟,但是性能會比較差。上述摘錄於網際網路,寫得清晰明了,可以參考一下,分析看了日誌也沒有找到其他有用的信息,由於是歷史索引,就將其刪除掉了,雖然沒有定位到根本原因,不過記錄一下排查過程總是好的。

剩下的unassigned分片

解決了一個問題,那麼還剩下一個分片是未分配的,還是從索引層面和分片層面查詢檢查,發現同樣是0號主分片出問題。嘗試手動分配curl -uelastic:pwd -XPOST 'http://ip:9200/_cluster/reroute' -H"Content-Type:application/json" -d '{ "commands" : [ { "allocate_stale_primary" : { "index" : "B_2020-01-05", "shard" : 0, "node" : "SL8u8zKESy6rSHjHO0jEvA" } } ] }'報錯:

No data for shard [0] of index [B_2020-01-05] found on node [SL8u8zKESy6rSHjHO0jEvA]"},"status":400}

嘗試手動分配失敗後,更換思路。擺脫掉各種複雜的查詢API,使用es為我們提供的一個Explain API,它會解釋為什麼分片沒有分配,解決問題之前,先診斷診斷。curl -uelastic:pwd -XGET "http://ip:9200/_cluster/allocation/explain" -H"Content-Type:application/json" -d '{ "index": "B_2020-01-05", "shard": 0, "primary": true}'

看上述錯誤,分片被鎖住了,嘗試分配,但是被拒絕,手動分配時,可以指定"acceptdataloss" : true。但這樣會導致數據完全丟失。這種情況一般出現在有結點短暫離開集群,然後馬上重新加入,並且有線程正在對某個shard做bulk或者scroll等長時間的寫入操作。等結點重新加入集群的時候,由於shard lock沒有釋放,master無法allocate這個shard。 通常/cluster/reroute?retryfailed=true可以解決問題,如果按照你說的依然無法解決,可能還有其他原因導致鎖住該shard的線程長時間操作該shard無法釋放鎖(長時間GC?)。如果retryfailed無法解決問題,可以嘗試一下allocatestale_primary,前提是需要知道這個shard的primary在哪個結點上。實在解決不了,又不想丟數據,還可以重啟一下該結點,內存鎖應該可以釋放。執行集群reroute命令:

curl -XPOST "http://ip:9200/_cluster/reroute?retry_failed=true"

再看分片狀態:

此時集群已經恢復Green。大功告成。總結

一、遇到集群Red時,我們可以從如下方法排查:

集群層面:/_cluster/health。索引層面:/_cluster/health?pretty&level=indices。分片層面:/_cluster/health?pretty&level=shards。看恢復情況:/_recovery?pretty。二、有unassigned分片的排查思路

_cluster/allocation/explain,先診斷。/_cluster/reroute嘗試重新分配。三、數據重放

如果實在恢復不了,那只能索引重建了。提供一種思路:先新建備份索引

curl -XPUT 『http://xxxx:9200/a_index_copy/『 -d 『{「settings」:{ 「index」:{ 「number_of_shards」:3, 「number_of_replicas」:2 } }}通過reindex,將目前可用的數據導入:POST _reindex{"source": {"index": "a_index"},"dest": {"index": "aindexcopy","op_type": "create"}}

刪除a_index索引,這個必須要先做,否則別名無法添加.curl -XDELETE 'http://xxxx:9200/a_index'

創建aindexcopy索引

curl -XPUT 『http://xxxx:9200/a_index_copy/『 -d 『{「settings」:{ 「index」:{ 「number_of_shards」:3, 「number_of_replicas」:2 } }}通過reindex api將aindex數據copy到aindex_copy。

POST _reindex{"source": { "index": "a_index" }, "dest": { "index": "a_index_copy", "op_type": "create" }}刪除a_index索引,這個必須要先做,否則別名無法添加

curl -XDELETE 'http://xxxx:9200/a_index'給aindexcopy添加別名a_index

curl -XPOST 'http://xxxx:9200/_aliases' -d '{ "actions": [ {"add": {"index": "a_index_copy", "alias": "a_index"}} ]}'四、translog總結

translog在節點有問題時,能夠幫助阻止數據的丟失設計目的:

1、幫助節點從失敗從快速恢復。

2、輔助flush。避免在flush過程中數據丟失。

以上就是這篇筆記的所有內容,希望能幫助到你。

歡迎來公zhong號【俠夢的開發筆記】 一起交流進步

相關焦點

  • Elasticsearch 25 個必知必會的默認值
    這引發了我對Elasticsearch 默認值的關注。我一搜不要緊:聊天記錄中涉及「默認」關鍵詞的討論接近 400 多處。這些默認值對於架構選型、開發實戰、運維排查性能問題等都有很好的借鑑價值,雖官方文檔都有詳細論述,但散落在各個角度。
  • 乾貨 | Elasticsearch 集群健康值紅色終極解決方案
    vm/drop_caches )的時候,出現 如下集群健康值:red,紅色預警狀態,同時部分分片都成為灰色。  查看Elasticsearch啟動日誌會發現如下: 集群服務超時連接的情況。參考官網:http://t.cn/RltLEpN(部分中文集群健康狀態博文資料翻譯的不夠精確,以官網為準)如果集群狀態為紅色, Head插件顯示:集群健康值red 。則說明:至少一個主分片分配失敗。這將導致一些數據以及索引的某些部分不再可用。
  • Elasticsearch 在網際網路公司大量真實的應用案例
    攜程:大規模 Elasticsearch 集群管理心得  目前,我們最大的日誌單集群有120個data node,運行於70臺物理伺服器上。數據規模如下:  單日索引數據條數600億,新增索引文件25TB (含一個複製片則為50TB)  業務高峰期峰值索引速率維持在百萬條/秒  歷史數據保留時長根據業務需求制定,從10天 - 90天不等  集群共3441個索引、17000個分片、數據總量約9300億, 磁碟總消耗1PB  三、去哪兒:訂單中心基於elasticsearch
  • 《Elasticsearch權威指南》中文版背後的故事
    去年我們社區一起翻譯了一本書《Elasticsearch權威指南》,並且已經在官方上線了,連結:https://www.elastic.co
  • 全球500億條數據被 Elasticsearch 勒索者刪除,中國受災排第二
    郵箱 elasticsearch@mail2tor.com通過兩次勒索情況的對比分析,發現有大概1%的 Elasticsearch 使用了驗證插件,另外有2%則關閉Elasticsearch,現在已經無法訪問。   白帽匯 Fofa 系統中顯示,網際網路上公開可訪問的 Elasticsearch 超過65000餘臺。其中,共有受害總數9750臺。
  • ElasticSearch 23 種映射參數詳解
    從今天開始我們來看 Es 中常見的 23 種映射參數,由於這裡涉及到的東西比較多,因此松哥也錄製了多個視頻來講解,每次兩集,估計可以分三次講完,今天我們先來學習 analyzer、search_analyzer 以及 normalizer 三種映射參數。
  • Elastic Heart
    但為何我依舊無法做到斷心絕情And I might've got to be with one可能我註定和某個人相伴相渡Why not to fight this war without weapons那為何不永別武器再爭此勝And I want it and I want it bad我有著對這世界無盡的
  • 驚爆眼球的四人舞版本 Elastic Heart 小編已醉
    但為何我依舊無法做到斷心絕情And I might've got to be with one可能我註定和某個人相伴相渡Why not to fight this war without weapons那為何不永別武器再爭此勝And I want it and I want it bad我有著對這世界無盡的
  • 【必收藏】小紅書筆記不收錄怎麼辦?
    正如大家平常了解的那樣,小紅書筆記在發布之後,會先通過系統審核,如果還有違規信息就會審核失敗並通知博主違規,另一部分審核通過的筆記就會通過小紅書的語義分析系統打上各種內容標籤和分類進入筆記推送階段,主要包含下面這3個渠道。並且如果在初期,筆記剛發布的時候,這三方面數據情況足夠好的話,這篇筆記的內容就會被推廣給更多其他用戶了。
  • 亞馬遜關鍵詞分析之Search Term篇,如何才能手握搜索流量主動權
    依小姑看來,這是曝光和轉化都不行啊。。。。。。 得,咱今天就聊聊身負曝光與轉化率大任為一身的「關鍵詞」大佬。 關鍵詞大佬裡了不得啊!Listing標題、描述、Search Term 、廣告關鍵詞......哪裡他都能發光發熱發脾氣啊! 說說「關鍵詞」的工作原理 「亞馬遜的 A9搜尋引擎演算法,是負責配對買家輸入的關鍵字跟相關商品,並從亞馬遜龐大的產品類目中裡挑選出來最相關的產品。並且根據相關性排序展示給客戶。」
  • redis學習筆記(六)分片集群
    另一種方式是分片集群的方式,主要講多個redis實例組成一個集群,將redis的數據劃分多份,每一份由一個實例來保存。redis cluster中採用了哈希槽來處理數據和實例的映射,即一個切片集群共有16384個哈希槽,每個緩存數據的key都會被映射到哈希槽中。    哈希槽默認會被平均分布在切片集群中,即假設集群中有16個切片實例,那麼表示每個實例中有16384/16 = 1024個哈希槽。
  • 再問一遍:我是你的誰?
    可惜,我們都被他忽悠了。他竟然在用最甜的嗓音唱最虐的歌,酷酷的聲線搭配病嬌的唱法,簡直讓人有種單方面墜入愛河還帶了100米濾鏡的感覺。不知道周深是不是天然帶有一種魔法,就是不僅能夠將每首歌的情感詮釋得十分到位,而且還讓聽者欲罷不能。若他再問一遍:「我是你的誰?」,我想大聲說:「你是我們最愛的大寶貝呀!」
  • 再問一遍:我是你的誰?
    可惜,我們都被他忽悠了。他竟然在用最甜的嗓音唱最虐的歌,酷酷的聲線搭配病嬌的唱法,簡直讓人有種單方面墜入愛河還帶了100米濾鏡的感覺。不知道周深是不是天然帶有一種魔法,就是不僅能夠將每首歌的情感詮釋得十分到位,而且還讓聽者欲罷不能。若他再問一遍:「我是你的誰?」,我想大聲說:「你是我們最愛的大寶貝呀!」
  • Myallsearch:一鍵式多合一搜尋引擎
    Myallsearch相關圖片(圖片來源:Techweb.com.cn)【TechWeb報導】6月10日消息,新酷網站:一鍵式多合一搜尋引擎MyallsearchMyallsearch是一個領先的一鍵式多合一搜尋引擎
  • 演講打卡 | 從 Red Herring 看職場PUA徐明朝詭辯伎倆!
    個人覺著,不管利益相關方是誰,都是要論對錯的。今天這篇打卡,講者論述了幾種不同的邏輯謬誤,你需要知道:(1) Formal/deductive fallacies:形式或者演繹謬誤,凡是前提和結論毫無關係的形式,都屬於此類。其中,最著名的就是 Non Sequitur Fallacy。
  • 玩爐石學英語53:集群戰術+拾荒者的智慧
    大家好我是愛爐石愛英語的William,今天我為大家介紹的是獵人的兩張常用卡牌集群戰術Pack Tactics和拾荒者的智慧Scavenger’s Ingenuity。第一張卡牌集群戰術Pack Tactics,其中Pack一般使用的用法是包裹、包裝、背包,在這裡使用的是它的一個不常用用法群集Tactics,是戰術的含義集群戰術Pack Tactics是一張獵人法術牌,它的卡牌效果是奧秘[Secret]當一個友方隨從受到攻擊時,召喚一個該隨從的3
  • 說「red bag」可露餡了啊!
    red bag? 我用這個詞在谷歌搜了一下,😂笑死了……這看上去不走心的直譯,果然是一個錯誤答案。「紅包」的正確說法應該是"red envelope"或者"red packet"啦。紅包裡面的錢我們可以說成"lucky money",相當於我們的「壓歲錢」。那準備紅包、發紅包、收紅包……這一系列迷幻戲精大戲的英文都是什麼?
  • 新概念英語二:第七課,學習筆記
    如果一直關注的讀者和發現一個問題:為什麼沒有第五課和第六課的筆記呢?因為這兩課的內容,在前面四課都已經把相關內容都講過了。因此,本篇文章,主要是對新概念二的第七課中的內容,有關重要知識點的歸納總結,做一個筆記。生詞與短語部分:1、expect:期待、等待;預計、預料。
  • 「看看這篇文章就知道了!」
    風格比較混亂(雖然現在也很混亂,好看的我都想嘗試),內容是all in all的,一本大概3個月就爆本了,後來用了A6 hobo定頁一直到現在。大概就是從手繪+膠帶到完全用膠帶拼貼記錄畫面。(▲註:建議點開大圖)