記錄ElasticSearch分片被鎖定導致無法分配處理過程

来源:https://www.cnblogs.com/chenmh/archive/2023/11/07/17814503.html
-Advertisement-
Play Games

本篇文章記錄最近ES做節點替換,從shard遷移過程中被鎖定導致無法分配,主shard正常,希望可以幫助其它人 failed to create shard,failed to obtain in-memory shard lock,ShardLockObtainFailedException 一、 ...


本篇文章記錄最近ES做節點替換,從shard遷移過程中被鎖定導致無法分配,主shard正常,希望可以幫助其它人 failed to create shard,failed to obtain in-memory shard lock,ShardLockObtainFailedException

一、問題描述

這次遇到的問題比較特殊,嘗試過以下幾種手段都沒有恢復:

  1. _cluster/reroute手動分片shard
  2. 由於是從shard無法分片,所以當時試過將所以的副本改成0,然後再設置成1,想通過重新生成副本來解決,結果也失敗

接下來是排查問題的過程:

1、通過“GET _cat/shards/indexname”錯誤信息如下,從shard無法分配,主shard正常,正常的shard未展示出來:
indexname                3     r      UNASSIGNED                                 
indexname                4     r      UNASSIGNED                                 
indexname                1     r      UNASSIGNED                                 

之前在運維過程中也遇到過UNASSIGNED這種從shard無法分配的問題,通過"allocate_replica"命令手動分配可以解決,這類問題一般都是因為node節點重啟或者失聯導致的shard分片異常

2、通過“GET _cluster/allocation/explain”錯誤信息如下:

"index": "indexname",
  "shard": 3,
  "primary": false,
  "current_state": "unassigned",
  "unassigned_info": {
    "reason": "ALLOCATION_FAILED",
    "at": "2023-11-02T18:43:14.758Z",
    "failed_allocation_attempts": 300,
    "details": "failed shard on node [4MMOUt8-SMatWGCzX1asAQ]: failed to create shard, failure IOException[failed to obtain in-memory shard lock]; nested: ShardLockObtainFailedException[[indexname][3]: obtaining shard lock timed out after 5000ms]; ",
    "last_allocation_status": "no_attempt"
  },
  "can_allocate": "no",
  "allocate_explanation": "cannot allocate because allocation is not permitted to any of the nodes",

大多數情況下shard的allocate相關的問題都可以通過“GET _cluster/allocation/explain”命令獲取到有用的關鍵信息,從返回的內容來分析是索引的第3個shard導致的,在node節點[4MMOUt8-SMatWGCzX1asAQ]被鎖定。

二、處理過程

知道問題原因了就有方法解決了,我準備了三套方案,如下:

前置工作

  1. 業務將索引的讀寫請求切走
  2. 創建一個測試索引驗證shard是否都正常
  3. 備份索引數據

方案1:重啟索引

--刷新索引
POST indexname/_flush
--關閉索引
POST indexname/_close
---打開索引
POST indexname/_open

在本次處理過程中,使用了方案1重啟索引就已經把問題解決了,但是方案一還是的業務配合將讀寫請求切走,否則索引close會導致應用的請求報錯

方案2:重啟節點node節點

[4MMOUt8-SMatWGCzX1asAQ]

PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "none"
}
}

PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "all"
}
}

方案2重啟鎖定shard的節點理論上來說也是可以解決這個問題,但是因為方案一已經解決了問題就沒機會做測試

方案3.重建索引

  1. 先還原備份到一個臨時索引,驗證數據沒問題
  2. 刪除當前索引,還原創建新索引
方案3是最後的方案了,如果方案1和2都解決不了的話只能通過方案3進行索引重建來解決,通過備份還原的方式來恢復索引其實也是很快的

三、思考總結

其實整個問題處理過程中還有一些其它的細節在文中沒有提到,就是集群在預設開啟自動shard均衡過程中由於shard多長嘗試分片無法成功,達到預設的5次重試之後就會報錯,這個時候其實可以嘗試將集群的自動分片關閉"cluster.routing.allocation.enable": "none",然後執行"POST /_cluster/reroute?retry_failed=true"來重置計數,最後通過手動分片shard的方式來做遷移也有可能能解決問題。只不過在每次遇到問題的時候需要結合當時的最佳場景去做判斷,尋找影響範圍最小的方案;

 

備註:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明鏈接。

《歡迎交流討論》


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、概念 AOP面向切麵編程,一種編程範式 二、作用 在不改動原始設計(原代碼不改動)的基礎上為方法進行功能增強(即增加功能) 三、核心概念 1、代理(Proxy):SpringAOP的核心本質是採用代理模式實現的 2、連接點(JoinPoint):在SpringAOP中,理解為任意方法的執行 3、 ...
  • Go 方法集合與選擇receiver類型 目錄Go 方法集合與選擇receiver類型一、receiver 參數類型對 Go 方法的影響二、選擇 receiver 參數類型原則2.1 選擇 receiver 參數類型的第一個原則2.2 選擇 receiver 參數類型的第二個原則三、方法集合(Met ...
  • 線程池(重點) 線程池:三大方法、七大參數、四種拒絕策略 池化技術 程式的運行,本質:占用系統的資源!優化資源的使用!-> 池化技術(線程池、連接池、對象池......);創建和銷毀十分消耗資源 池化技術:事先準備好一些資源,有人要用就拿,拿完用完還給我。 線程池的好處: 1、降低資源消耗 2、提高 ...
  • 我們在類中通常會有一個屬性為 IsDel來表示軟刪除或也稱邏輯刪除,這個屬性會導致我們在進行查詢操作時,每一次都要 .where(s=>s.IsDel==false) 非常的麻煩。在使用efCore時可以通過配置查詢篩選器來很好的解決這個問題。 public class SysUser { publ ...
  • 搜索查找指令 find 指令 find指令將從指定目錄向下遞歸的遍歷其各個子目錄,將滿足條件的文件或者目錄顯示在終端。 基本語法 find [搜索範圍(指定目錄)] [選項] 選項說明 選項 功能 -name<查詢方式> 按照指定的文件名查找模式查找文件 -user<用戶名> 查找屬於指定用戶名所有 ...
  • rsyslog 介紹 日誌(Log)是記錄和存儲電腦、軟體、應用或其他系統的操作和事件的文件或數據流。它們可以為系統管理員、開發人員和最終用戶提供詳細的背景信息,以幫助他們瞭解和診斷系統的行為。 rsyslog 是一個開源的日誌處理工具,一般用在類Unix系統上,是syslogd 的擴展。它提供了 ...
  • 包括線程概念簡介;線程創建函數pthread_create以及退出、回收等;線程同步互斥鎖pthread_mutex_t,讀寫鎖pthread_rwlock_t,條件變數pthread_cond_t以及信號量semaphore ...
  • 本文分享自華為雲社區《GaussDB資料庫SQL系列-數據去重》,作者: Gauss松鼠會小助手2 。 一、前言 數據去重在資料庫中是比較常見的操作。複雜的業務場景、多業務線的數據來源等等,都會帶來重覆數據的存儲。本文以GaussDB資料庫為實驗平臺,將為大家詳細講解如何去重。 二、數據去重應用場景 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...