這次遇到的問題比較特殊,嘗試過以下幾種手段都沒有恢復:
接下來是排查問題的過程:
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]被鎖定。
前置工作
--重新整理索引 POST indexname/_flush --關閉索引 POST indexname/_close ---開啟索引 POST indexname/_open
在本次處理過程中,使用了方案1重啟索引就已經把問題解決了,但是方案一還是的業務配合將讀寫請求切走,否則索引close會導致應用的請求報錯
[4MMOUt8-SMatWGCzX1asAQ]
PUT _cluster/settings { "persistent": { "cluster.routing.allocation.enable": "none" } } PUT _cluster/settings { "persistent": { "cluster.routing.allocation.enable": "all" } }
方案2重啟鎖定shard的節點理論上來說也是可以解決這個問題,但是因為方案一已經解決了問題就沒機會做測試
備註: 作者:pursuer.chen 部落格:http://www.cnblogs.com/chenmh 本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結。 《歡迎交流討論》 |