Przejdź do treści

Szybki start

Ten przewodnik prowadzi bazę danych Postgres, która już działa w Twoim klastrze, od braku kopii zapasowych do przetestowanego przywracania w około dziesięć minut. Potrzebujesz dostępu kubectl i helm do klastra, bucketu zgodnego z S3 wraz z danymi uwierzytelniającymi oraz age na swoim komputerze.

Nie masz pod ręką klastra?

Najpierw wypróbuj konsolę i CLI na serwerze demonstracyjnym: jedno polecenie, bez Kubernetes, bez bazy danych.

1. Zainstaluj 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 wymienia namespace'y, których bazy danych Tenax archiwizuje; Tenax dostaje tam Role do odczytu secretów z danymi uwierzytelniającymi tenax-* i niczego więcej. examplePolicies tworzy współdzielone polityki prod, dev i critical. Każda wartość jest opisana w Wartościach Helm.

2. Klucze i bucket

Wygeneruj parę kluczy, która szyfruje każdą kopię zapasową. Zachowaj kopię offline pliku tenax-backups.key: bez niego żadnej kopii zapasowej nie da się przywrócić.

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=…
store.yaml
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, potem kubectl get backupstores: main przechodzi w Ready, gdy Tenax połączy się z bucketem i poprawnie wczyta klucze.

3. Użytkownik bazy danych

Tenax łączy się jednym użytkownikiem, tenax. Utwórz go za pomocą SQL z Użytkowników baz danych, a następnie zapisz jego hasło obok bazy danych:

kubectl -n team-a create secret generic tenax-postgres --from-literal=username=tenax --from-literal=password=…

Aby przywracać do dowolnej sekundy, pozwól mu też na replikację: dodaj host replication tenax all scram-sha-256 do pg_hba.conf i przeładuj konfigurację. Możesz to zrobić później. Do tego czasu Tenax wykonuje logiczne kopie zapasowe, a jego warunek Replication mówi, co dodać.

4. Zadeklaruj cel

target.yaml
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

W ciągu minuty Tenax uruchamia streamer dla celu i sam wykonuje pierwszą pełną kopię zapasową (powód chain-restart). Jeśli użytkownik nie może jeszcze replikować, cel pokazuje zamiast tego Replication=False z poprawką, a kopie zapasowe są logiczne, dopóki jej nie zastosujesz:

kubectl -n team-a get backuptargets,backups

5. Przywróć, celowo

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"

Przywracanie uruchamia Twoje sprawdzenia, zanim zgłosi sukces. Piaskownica usuwa się sama, gdy wygaśnie jej TTL. Dalej: