跳转至

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