跳轉到

快速入門

本頁帶你把叢集中已在執行的 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 列出 Tenax 要備份其中資料庫的名稱空間;Tenax 在這些名稱空間中獲得一個 Role,只能讀取 tenax-* 憑證 Secret,別無其他權限。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=…
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,再執行 kubectl get backupstores:一旦 Tenax 能存取儲存貯體且金鑰解析成功, main 就會變為 Ready。

3. 資料庫使用者

Tenax 使用一個使用者 tenax 進行連線。用資料庫使用者中的 SQL 建立它,然後把它的密碼存放在資料庫旁邊:

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

如需還原到任意一秒,還要允許它進行複製:在 pg_hba.conf 中新增 host replication tenax all scram-sha-256 並重新載入設定。這一步可以稍後再做。在此之前,Tenax 會執行邏輯備份,其 Replication 狀態條件會說明需要新增什麼。

4. 宣告目標

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

一分鐘之內,Tenax 會為該目標啟動一個串流傳輸程式,並自行完成第一次完整備份(原因為 chain-restart)。 如果該使用者暫時還不能複製,目標會顯示 Replication=False 及修復方法,在你套用修復之前,備份都是邏輯備份:

kubectl -n team-a get backuptargets,backups

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 到期後會自行刪除。接下來:

  • 備份與還原時間窗解釋了時間窗是什麼,以及如何讓它保持不中斷。
  • 驗證把這次手動演練變成每週一次、帶警示的例行檢查。
  • 監控負責接入警示和儀表板。