在生產環境遇到了kudu以下報錯:
Check failed: _s.ok() Bad status: Incomplete: Could not init Tablet Manager: Unable to load consensus metadata for tablet 21ba3db23237444681 d90dd04330f6ce: Could not read header for proto container file /data01/kudu/fs_ wal . dir/tablet/consensus-meta/21ba3db23237444681 d90dd0433 0f6ce: File size not large enough to be valid: Proto container file /data01 /kudu/fs_ wal. dir/tablet/consensus-meta/21ba3db23237444681 d90d d04330f6ce: Tried to read 16 bytes at offset 0 but file size is only 0 bytes

對此進行了分析研究定位到是kudu的consensus metadata 缺失;
可以發現此元數據文件已經發生了丟失,我們將consensus-meta目錄進行了備份並重新創建新的consensus-meta目錄賦予其原始的目錄權限;然后重啟kudu-tablet;發現此時kudu已經恢復了正常,並且已經開時進行數據同步。
kudu本身是具有分布式管理功能,當一個節點發生故障,會將數據自動遷移到其他節點上,所以此處我們將kudu的元數據目錄遷移重新創建,啟動后會有數據重新從其他節點同步過來。
tablet存在的主要指標是tablet-meta目錄中tablet的超級塊文件的存在。如果該文件不存在,我們沒有指向tablet數據塊的指針,因此我們認為tablet處於 DOES_NOT_EXIST狀態。除了超級塊之外,啟動tablet所需的文件是一致性元數據文件(在consensus-meta下),預寫日志(在wals下)和數據塊(在data下)。當然,自動恢復的tablet server級文件(如instance)也是必須的。
tablet刪除
為了刪除tablet,我們必須永久保留Raft元數據以避免一致性失憶症。我們還會臨時備份(隔離)數據,以便以后進行調試。最初,我們將提供一些工具,以便在不再需要時手動刪除隔離文件及其關聯的數據塊。
要求
- 保存一致性元數據,例如當前任期,投票歷史記錄和上次日志條目。這是為了避免選擇過時的節點作為leader,並強迫過時的leader下台。
- 邏輯刪除tablet(可能使用超級塊中的標志),因此我們知道要查找上面保存的共識元數據。
- 隔離舊數據.
實現
我們可以使用以下步驟安全地實現tablet刪除:
- 關機正在運行的tablet
- 創建隔離目錄(QDIR)。
- 將當前的超級塊復制到QDIR。
- 將SuperBlock標記為DELETED(因此我們總是在此步驟后回滾刪除操作); 將日志中的最后一個OpId存儲到SuperBlock
PB中的一個字段中(如果我們希望能夠在刪除后不再擁有我們的WAL文件時在選舉中投票,我們需要知道我們日志中的最后一個OpId);將路徑存儲到QDIR中的SuperBlock;最后將SuperBlock保存並fsync到tablet元數據目錄中。現在tablet被視為已刪除。 - 將一致性元數據文件復制到QDIR。
- 將WAL目錄移動到QDIR。這應該是原子的,因為此時我們不對WAL進行條帶化。
其他故障恢復
具有一致性元數據的磁盤故障是災難性故障
如果我們丟失了具有元數據或WAL的磁盤,並且需要復制新的副本以進行恢復,那么可能無法安全地執行此操作,這是因為我們不可避一致性失憶。在這種情況下,tablet server必須采用新的UUID並完全清除其所有數據和狀態:
- 檢測壞磁盤
- 關閉/崩潰
- 管理員將替換壞磁盤
- 擦除機器上的所有數據
- 為tablet server重新分配新的UUID
這一預防措施可確保過時的tablet server無法讓失憶的服務器自動恢復新tablet,選出過時的服務器leader,並創建並行一致性組。
有可能對此進行優化,並避免在只有一個磁盤發生故障時必須對整個盒子進行核對。也許我們可以依賴RAID來獲得共識元數據和WAL,或者我們可以嘗試將tablet備份到特定磁盤上,或者做一些其他聰明的事情。然而,這些選項並不是很好,這個問題非常棘手。
參考鏈接:https://blog.csdn.net/qqqq0199181/article/details/94441573