Saltar a contenido

Cómo funciona Tenax

Tenax es un operador de Kubernetes. Tú declaras adónde van los respaldos, con qué frecuencia y durante cuánto tiempo, y qué bases de datos; Tenax se encarga del 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 Ámbito Quién lo crea Qué es
BackupStore clúster tú Un bucket S3, sus credenciales y los destinatarios age para los que se cifra cada objeto.
BackupPolicy namespace tú (o los presets del chart) Calendario, ventana de restauración puntual, niveles de retención, límites, protección de carga, verificación, compresión.
BackupTarget namespace, junto a la base de datos tú Un servidor de base de datos: motor, endpoint, credenciales, política, comprobaciones, máscaras.
Backup namespace del objetivo Tenax (calendario, respaldo inmediato, reinicio de cadena) Una ejecución de respaldo completo. Solo se conservan como objetos los últimos; S3 los guarda todos.
Restore namespace del objetivo tú, la consola o la CLI Un plan desde un momento o un ID de respaldo hacia un destino.
Sandbox clúster un Restore a un sandbox Una base de datos privada con TTL, credenciales y una consola de consultas.

La ruta de los datos

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]
  • El controlador solo planifica. Los movedores y restauradores son Jobs; cada objetivo con recuperación puntual tiene un Deployment de streamer. Los bytes nunca pasan por el controlador ni por la API.
  • Nada se cuelga. Sin montajes, iSCSI, FUSE ni dispositivos de bloque; a las bases de datos solo se llega por red. Cada llamada de E/S tiene un deadline, cada flujo un watchdog de progreso, y las herramientas hijas se ejecutan en su propio grupo de procesos para que mueran con él.
  • Crash-only. Cualquier pod puede morir en cualquier momento. El estado vive en CRDs y en S3, y un respaldo solo existe una vez escrito su manifiesto, que va al final, así que un respaldo a medio escribir nunca se confunde con uno completo.

El catálogo y la consola

tenax-api lista los manifiestos de cada store al arrancar y mantiene un índice en memoria: objetivos, respaldos, segmentos de cambios y ventanas de restauración puntual. Los inventarios y las vistas previas enmascaradas se cifran para una clave adicional de catálogo que puede leerlos pero no descifrar volcados ni WAL (ADR 0009). La caché es desechable; S3 es la fuente de verdad.