Lewati ke isi

Mulai cepat

Panduan ini membawa basis data Postgres yang sudah berjalan di klaster Anda dari tanpa cadangan sampai pemulihan yang teruji dalam sekitar sepuluh menit. Anda memerlukan akses kubectl dan helm ke klaster, bucket yang kompatibel dengan S3 beserta kredensialnya, dan age di mesin Anda.

Tidak punya klaster?

Coba konsol dan CLI terhadap server demo lebih dulu: satu perintah, tanpa Kubernetes, tanpa basis data.

1. Instal 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 mencantumkan namespace yang basis datanya dicadangkan oleh Tenax; di sana Tenax mendapat Role untuk membaca secret kredensial tenax-* dan tidak lebih. examplePolicies membuat kebijakan bersama prod, dev, dan critical. Setiap nilai dijelaskan di Nilai Helm.

2. Kunci dan bucket

Buat pasangan kunci yang mengenkripsi setiap cadangan. Simpan salinan offline tenax-backups.key: tanpanya tidak ada cadangan yang bisa dipulihkan.

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, lalu kubectl get backupstores: main menjadi Ready begitu Tenax dapat menjangkau bucket dan kuncinya bisa diurai.

3. Pengguna basis data

Tenax terhubung dengan satu pengguna, tenax. Buat pengguna itu dengan SQL di Pengguna basis data, lalu simpan kata sandinya di samping basis data:

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

Untuk pemulihan ke detik mana pun, izinkan juga pengguna itu melakukan replikasi: tambahkan host replication tenax all scram-sha-256 ke pg_hba.conf lalu muat ulang. Anda bisa melakukannya nanti. Sampai saat itu Tenax membuat cadangan logis, dan kondisi Replication-nya menyebutkan apa yang perlu ditambahkan.

4. Deklarasikan target

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

Dalam satu menit Tenax memulai streamer untuk target tersebut dan membuat cadangan penuh pertama dengan sendirinya (alasan chain-restart). Jika pengguna belum boleh melakukan replikasi, target menampilkan Replication=False beserta perbaikannya, dan cadangan bersifat logis sampai Anda menerapkannya:

kubectl -n team-a get backuptargets,backups

5. Pulihkan, dengan sengaja

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"

Pemulihan menjalankan pemeriksaan Anda sebelum melaporkan keberhasilan. Sandbox menghapus dirinya sendiri saat TTL-nya habis. Selanjutnya: