Tenax 的工作原理¶
Tenax 是一個 Kubernetes Operator。你只需宣告備份存到哪裡、多久備份一次、保留多長時間,以及備份哪些資料庫; 剩下的交給 Tenax。
flowchart LR
subgraph Declared["Declared in git"]
S[BackupStore<br/>bucket + keys]
P[BackupPolicy<br/>schedule, retention, window]
T[BackupTarget<br/>one database]
end
subgraph Created["Created by Tenax or by you"]
B[Backup<br/>one full backup]
R[Restore<br/>to a sandbox, new DB, download, in place]
X[Sandbox<br/>a throwaway database]
end
T --> P --> S
T -. schedule .-> B
R -. sandbox .-> X
| 資源 | 作用域 | 由誰建立 | 是什麼 |
|---|---|---|---|
BackupStore |
叢集 | 你 | 一個 S3 儲存貯體、其憑證,以及加密每個物件所用的 age 接收者。 |
BackupPolicy |
名稱空間 | 你(或 Chart 的預設) | 排程、時間點還原時間窗、保留層級、限制、負載保護、驗證、壓縮。 |
BackupTarget |
名稱空間,與資料庫放在一起 | 你 | 一臺資料庫伺服器:引擎、端點、憑證、策略、檢查、遮罩規則。 |
Backup |
目標所在名稱空間 | Tenax(排程、立即備份、鏈重啟) | 一次完整備份執行。只有最近的幾個以物件形式保留;S3 中儲存全部。 |
Restore |
目標所在名稱空間 | 你、控制台或 CLI | 從一個時間點或備份 ID 到某個目的地的還原計畫。 |
Sandbox |
叢集 | 還原到沙盒的 Restore |
一個帶 TTL、憑證和查詢控制台的私有資料庫。 |
資料路徑¶
flowchart LR
db[(Postgres / MySQL)] -->|pg_basebackup, pg_dump, mysqldump| mover[mover Job]
db -->|WAL receiver, mysqlbinlog| streamer[streamer]
mover --> pipe[zstd → age → SHA-256 → parallel multipart]
streamer --> pipe
pipe --> s3[(S3 bucket<br/>manifest.json written last)]
s3 --> restorer[restorer Job<br/>verify → decrypt → replay → checks]
restorer --> dest[sandbox · new database · in place · download]
- 控制器只負責排程。 搬運程式和還原程式都是 Job;每個啟用了時間點還原的目標有一個串流傳輸 Deployment。 資料位元組從不經過控制器或 API。
- 永不掛起。 不使用掛載、iSCSI、FUSE 或區塊裝置;只透過網路存取資料庫。每個 I/O 呼叫都有截止時間, 每條資料流都有進度看門狗,子工具執行在各自的程序群組中,因此會隨程序群組一起被終止。
- 崩潰即復原(crash-only)。 任何 Pod 都可能在任意時刻被殺掉。狀態儲存在 CRD 和 S3 中,備份只有在最後寫入 manifest 之後才算存在,因此寫到一半的備份絕不會被誤認為是完整的。
目錄與控制台¶
tenax-api 在啟動時列出每個儲存中的 manifest,並維護一份記憶體索引:目標、備份、變更區段和時間點還原時間窗。
清單和遮罩預覽會額外加密給一個目錄金鑰,該金鑰可以讀取它們,但無法解密傾印或 WAL
(ADR 0009)。快取可以隨時丟棄;S3 才是唯一可信來源。