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=…
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¶
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:
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:
- Cadangan dan jendela pemulihan menjelaskan apa itu jendela dan apa yang menjaganya tetap utuh.
- Verifikasi mengubah latihan manual ini menjadi latihan mingguan yang memicu peringatan.
- Pemantauan menghubungkan peringatan dan dasbor.