Typesense Raft 問題
從你的 Typesense 日誌 來看,問題出在 Raft 日誌 (log.cpp
) 損壞,導致 Typesense 無法初始化 peering state,進而影響 Typesense 啟動。
📌 主要錯誤
pgsqlCopyEditE20250227 02:34:28.638044 118 log.cpp:121] Unknown checksum_type=101
init_log_storage failed
E20250227 02:34:28.638049 118 log.cpp:193] Found corrupted header at offset=344900, header={term=7234320464841026594, type=109, data_len=1684108385, checksum_type=101, data_checksum=574235170}, path: /data/state/log
E20250227 02:34:28.638051 118 node.cpp:497] node default_group:10.42.2.67:8107:8108
🔴 Typesense Raft 日誌 (/data/state/log
) 損壞,導致無法啟動 Peering
Typesense 使用 Raft 共識算法 來管理多節點同步,即使是單節點模式 (single-node cluster
),它仍然會用 Raft 來維護本地狀態。如果 Raft 日誌 (log
) 損壞,Typesense 會無法啟動。
🚀 解決方案
方法 1:清除損壞的 Raft 日誌
1️⃣ 停止 Typesense
shCopyEditkubectl scale deployment typesense --replicas=0 -n <your-namespace>
(如果是 Docker 執行,則執行 docker stop <container_id>
)
2️⃣ 備份現有資料
shCopyEditcp
-r /data/state /data/state_backup
⚠️ 重要:這是保險措施,避免數據完全丟失。
3️⃣ 刪除損壞的 Raft 日誌
shCopyEditrm
-rf /data/state/log
這將強制 Typesense 重新初始化 Raft 日誌。
4️⃣ 重啟 Typesense
shCopyEditkubectl scale deployment typesense --replicas=1 -n <your-namespace>
(如果是 Docker,則 docker restart <container_id>
)
🔄 檢查是否正常啟動
shCopyEditkubectl logs -f deployment/typesense -n <your-namespace>
如果沒看到 Failed to start peering state
,表示修復成功!
方法 2:重置整個 Typesense 狀態
如果 方法 1 仍然無法解決,可以嘗試 完全刪除所有狀態數據:
shCopyEditrm
-rf /data/state /data/meta /data/db
然後重新啟動 Typesense:
shCopyEditkubectl scale deployment typesense --replicas=1 -n <your-namespace>
⚠️ 這將刪除所有已建立的索引!請務必確認你有備份!
如果你有使用 S3 或 GCS 備份,可以從備份還原。
🔎 根本原因
- Typesense 可能非正常關機:如果伺服器意外關閉(比如強制重啟、OOM Kill),可能導致 Raft 日誌損壞。
- 存儲問題:如果
/data/state/log
位於 NFS 或不支持fsync()
的存儲上,可能導致數據不一致。 - 版本不匹配:如果之前升級過 Typesense,可能導致舊日誌無法解析。
✅ 建議預防措施
- 啟用 Typesense 備份,定期將索引備份到 S3/GCS:shCopyEdit
typesense snapshot export
- 監控 Typesense 記憶體和磁碟 IO,避免 OOM Kill 或磁碟寫入失敗:shCopyEditkubectl top pod -n <your-namespace>
iostat -x 1 - 使用可靠的存儲(如 SSD,而非 NFS),確保
/data/state/log
可正確fsync()
。