快速入门¶
本页带你把集群中已在运行的 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=…
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. 声明目标¶
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 及修复方法,在你应用修复之前,备份都是逻辑备份:
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 到期后会自行删除。接下来: