Como o Tenax funciona¶
O Tenax é um operator do Kubernetes. Você declara para onde vão os backups, com que frequência e por quanto tempo, e quais bancos; o Tenax cuida do resto.
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
| Recurso | Escopo | Quem cria | O que é |
|---|---|---|---|
BackupStore |
cluster | você | Um bucket S3, as credenciais dele e os destinatários age para os quais cada objeto é criptografado. |
BackupPolicy |
namespace | você (ou os presets do chart) | Agendamento, janela point-in-time, camadas de retenção, limites, proteção de carga, verificação, compressão. |
BackupTarget |
namespace, ao lado do banco | você | Um servidor de banco de dados: engine, endpoint, credenciais, política, checagens, máscaras. |
Backup |
namespace do alvo | o Tenax (agendamento, backup-now, reinício da cadeia) | Uma execução de backup completo. Só os poucos mais recentes são mantidos como objetos; o S3 guarda todos. |
Restore |
namespace do alvo | você, o console ou a CLI | Um plano que vai de um horário ou de um ID de backup até um destino. |
Sandbox |
cluster | um Restore para um sandbox |
Um banco privado com TTL, credenciais e um console de consultas. |
O caminho dos dados¶
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]
- O controlador só agenda. Movers e restorers são Jobs; cada alvo com recuperação point-in-time tem um Deployment de streamer. Os bytes nunca passam pelo controlador nem pela API.
- Nada trava. Sem mounts, iSCSI, FUSE ou dispositivos de bloco; os bancos são acessados apenas pela rede. Toda chamada de I/O tem um deadline, todo stream tem um watchdog de progresso, e as ferramentas filhas rodam no próprio grupo de processos para serem encerradas junto com ele.
- Crash-only. Qualquer pod pode ser encerrado a qualquer momento. O estado fica nos CRDs e no S3, e um backup só existe depois que o manifesto dele é gravado por último, então um backup gravado pela metade nunca é confundido com um completo.
O catálogo e o console¶
O tenax-api lista os manifestos de cada store na inicialização e mantém um índice em memória: alvos, backups,
segmentos de alterações e janelas point-in-time. Inventários e prévias mascaradas são criptografados para uma chave
extra de catálogo, que consegue lê-los mas não consegue descriptografar dumps nem WAL
(ADR 0009). O cache é descartável; o S3 é a fonte da verdade.