Быстрый старт¶
Это руководство примерно за десять минут проводит базу данных Postgres, уже работающую в вашем кластере, от полного
отсутствия резервных копий до проверенного восстановления. Вам понадобятся доступ к кластеру через kubectl и helm,
S3-совместимый бакет с учётными данными и age на вашем компьютере.
Нет кластера под рукой?
Сначала попробуйте консоль и CLI на демо-сервере: одна команда, без Kubernetes и без базы данных.
1. Установите Tenax¶
helm install tenax oci://registry.example.com/helm/tenax --version 0.1.0 \
-n tenax-system --create-namespace \
--set image.repository=registry.example.com/tenax/tenax --set image.tag=v0.1.0 \
--set 'targetNamespaces={team-a}' \
--set examplePolicies.enabled=true --set examplePolicies.store=main
targetNamespaces перечисляет namespace, базы данных которых копирует Tenax; там Tenax получает Role для чтения
секретов с учётными данными tenax-* и ничего больше. examplePolicies создаёт общие политики prod, dev и
critical. Все значения описаны в разделе Значения Helm.
2. Ключи и бакет¶
Сгенерируйте пару ключей, которой шифруется каждая резервная копия. Храните офлайн-копию tenax-backups.key: без
неё ни одну резервную копию восстановить нельзя.
age-keygen -o tenax-backups.key # prints "Public key: age1…"
kubectl -n tenax-system create secret generic tenax-age-identity \
--from-literal=identity="$(grep AGE-SECRET-KEY tenax-backups.key)"
kubectl -n tenax-system create secret generic tenax-s3 \
--from-literal=accessKeyId=AKIA… --from-literal=secretAccessKey=…
apiVersion: tenax.run/v1alpha1
kind: BackupStore
metadata:
name: main
spec:
s3:
endpoint: https://s3.us-east-1.amazonaws.com
region: us-east-1
bucket: db-backups
credentialsSecret: { namespace: tenax-system, name: tenax-s3 }
encryption:
ageRecipients: [age1qxyz…] # the public key from age-keygen
identitySecret: { namespace: tenax-system, name: tenax-age-identity }
kubectl apply -f store.yaml, затем kubectl get backupstores: main переходит в Ready, как только Tenax
достучится до бакета и разберёт ключи.
3. Пользователь базы данных¶
Tenax подключается одним пользователем, tenax. Создайте его с помощью SQL из раздела
Пользователи баз данных, затем сохраните его пароль рядом с базой данных:
kubectl -n team-a create secret generic tenax-postgres --from-literal=username=tenax --from-literal=password=…
Чтобы восстанавливать на любую секунду, разрешите ему также репликацию: добавьте
host replication tenax all scram-sha-256 в pg_hba.conf и перечитайте конфигурацию. Это можно сделать позже. До
тех пор Tenax делает логические резервные копии, а его условие Replication подсказывает, что добавить.
4. Объявите цель¶
apiVersion: tenax.run/v1alpha1
kind: BackupTarget
metadata:
name: app
namespace: team-a
labels:
tenax.run/org: acme
tenax.run/project: shop
tenax.run/env: prod
spec:
engine: postgres
endpoint: { host: postgres, port: 5432 }
databases: [app]
policy: prod # nightly fulls, 7-day point-in-time window
credentials:
secretRef: { name: tenax-postgres }
checks:
- name: orders-not-empty
database: app
sql: select count(*) > 0 from orders
В течение минуты Tenax запускает streamer для цели и сам делает первую полную резервную копию
(причина chain-restart). Если пользователю ещё нельзя реплицировать, цель показывает Replication=False с
исправлением, и резервные копии остаются логическими, пока вы его не примените:
5. Восстановите — намеренно¶
tenax login --server https://tenax.example.com # or TENAX_SERVER + port-forward, see Console, CLI and access
tenax targets
tenax restore team-a/app --at "$(date -u -d '-10 min' +%FT%TZ)" --wait
tenax query <sandbox> -e "select count(*) from orders"
Восстановление выполняет ваши проверки, прежде чем сообщить об успехе. Песочница удаляется сама, когда истекает её TTL. Дальше:
- Резервные копии и окно восстановления объясняет, что такое окно и что поддерживает его непрерывным.
- Проверка превращает эти ручные учения в еженедельные, с оповещениями.
- Мониторинг подключает оповещения и дашборд.