Pular para conteúdo

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.