跳转至

快速入门

本页带你把集群中已在运行的 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 到期后会自行删除。接下来:

  • 备份与恢复窗口解释了窗口是什么,以及如何让它保持不中断。
  • 校验把这次手动演练变成每周一次、带告警的例行检查。
  • 监控负责接入告警和仪表盘。