Как работает Tenax¶
Tenax — это оператор Kubernetes. Вы объявляете, куда идут резервные копии, как часто и как долго они хранятся и какие базы данных копировать; остальное 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 |
namespace | вы (или пресеты чарта) | Расписание, окно восстановления, уровни хранения, лимиты, защита от нагрузки, проверка, сжатие. |
BackupTarget |
namespace, рядом с базой данных | вы | Один сервер баз данных: движок, endpoint, учётные данные, политика, проверки, маски. |
Backup |
namespace цели | Tenax (расписание, «Создать копию», перезапуск цепочки) | Один запуск полного резервного копирования. Объектами хранятся только несколько последних; в S3 хранятся все. |
Restore |
namespace цели | вы, консоль или 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]
- Контроллер только планирует. Movers и restorers — это Job; у каждой цели с восстановлением на момент времени есть один Deployment streamer. Байты никогда не проходят через контроллер или API.
- Ничего не зависает. Никаких монтирований, iSCSI, FUSE и блочных устройств; к базам данных — только по сети. У каждого вызова ввода-вывода есть дедлайн, у каждого потока — сторож прогресса, а дочерние инструменты работают в собственной группе процессов и завершаются вместе с ней.
- Crash-only. Любой под можно убить в любой момент. Состояние хранится в CRD и S3, а резервная копия существует только после того, как последним записан её манифест, поэтому недописанную копию никогда не примут за полную.
Каталог и консоль¶
При запуске tenax-api перебирает манифесты в каждом хранилище и держит индекс в памяти: цели, резервные копии,
сегменты изменений и окна восстановления. Описи и маскированные предпросмотры дополнительно шифруются для ключа
каталога, который может их читать, но не может расшифровать дампы или WAL
(ADR 0009). Кэш одноразовый; источник истины — S3.