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 才是唯一可信来源。