Typesense Raft 問題

從你的 Typesense 日誌 來看,問題出在 Raft 日誌 (log.cpp) 損壞,導致 Typesense 無法初始化 peering state,進而影響 Typesense 啟動。

📌 主要錯誤

pgsqlCopyEditE20250227 02:34:28.638044 118 log.cpp:121] Unknown checksum_type=101
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
init_log_storage failed

🔴 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 備份,可以從備份還原。


🔎 根本原因

  1. Typesense 可能非正常關機:如果伺服器意外關閉(比如強制重啟、OOM Kill),可能導致 Raft 日誌損壞。
  2. 存儲問題:如果 /data/state/log 位於 NFS 或不支持 fsync() 的存儲上,可能導致數據不一致。
  3. 版本不匹配:如果之前升級過 Typesense,可能導致舊日誌無法解析。

✅ 建議預防措施

  • 啟用 Typesense 備份,定期將索引備份到 S3/GCS:shCopyEdittypesense snapshot export
  • 監控 Typesense 記憶體和磁碟 IO,避免 OOM Kill 或磁碟寫入失敗:shCopyEditkubectl top pod -n <your-namespace>
    iostat -x 1
  • 使用可靠的存儲(如 SSD,而非 NFS),確保 /data/state/log 可正確 fsync()

Read more

如何安裝 KubeSphere 以及管理 Workspace 和新增 Label

前言 在 Kubernetes 的世界中,KubeSphere 是一個功能強大的開源容器平台,它不僅讓 Kubernetes 的管理更簡單,還集成了多集群管理、DevOps、微服務治理等功能。本篇文章將教您如何使用 Helm 快速安裝 KubeSphere,並如何通過管理 Workspace 和新增 Label 來實現資源的高效管理。 一、使用 Helm 安裝 KubeSphere 1. 為什麼選擇 Helm 安裝? Helm 是 Kubernetes 中廣泛使用的包管理工具,使用 Helm 安裝 KubeSphere 有以下優點: * 自動化:簡化安裝過程,減少手動配置。 * 靈活性:可以根據需求自定義安裝的模組。 * 版本控制:支持管理和回滾安裝的不同版本。 2. 安裝前準備 在開始安裝之前,請確保以下條件:

By Tim Chiagn

我的經驗

1. 網絡與安全 (Networking & Security) * Fortigate: 防火牆來管理網路環境 * Traefik: 用於 K8s 的 2. 虛擬化與存儲 (Virtualization & Storage) * Esxi: 買了一台server 使用 Esxi 管理 vm * TrueNAS: 還沒有買 NAS 使用這個加減用一下 3. DevOps 與持續交付 (DevOps & CI/CD) * ArgoCD: GitOps 工具,用於 Kubernetes 的應用交付和管理,支持自動化部署和同步。 * KubeSphere:提供完整的 CI/CD 工作流管理、應用部署和 DevOps 整合功能,是 Kubernetes

By Tim Chiagn

使用 Bitnami/Discourse 的心得與注意事項

Discourse 是一個現代化的開源論壇軟體,Bitnami 提供的 Docker 鏡像使其在 Kubernetes 或 Docker 環境中的部署更加方便。然而,過程中有一些細節需要特別留意,以下是我的實際使用經驗與解決方法。 1. Persisting 儲存的路徑 Discourse 的 Bitnami 鏡像需要持久化數據來確保論壇的穩定運行,尤其是 PostgreSQL 資料庫的數據存儲。 * Persisting 儲存路徑: Bitnami/Discourse 預設將 PostgreSQL 的數據儲存在 /bitnami/postgresql,這是需要持久化的關鍵目錄。 * 解決方案: 配合 NFS 或其他外部存儲解決方案,可以確保數據的持續性和高可用性。 2. 搭配 NFS Provider 使用 NFS Subdir External Provisioner 是一種高效的方法,能確保 Discourse

By Tim Chiagn