696 words
3 minutes
部署PostgreSQL到k8s
postgresql有两个被经常使用的k8s operator
前者由一家专业做Postgresql部署的公司提供,后者由服饰零售巨头zalando提供。
Zalando Operator的优缺点
优点
- Zalando是Patroni的官方维护者,Patroni是常用的Postgresql HA开源方案
- 使用pg_basebackup来备份恢复,支持多线程备份
- 功能更为强大,其中的Spilo提供了许多功能
- 默认支持逻辑备份
缺点
- 文档不够完善,没有example
- operator与namespace绑定,只作用与当前namespace
- 许多与db相关的配置需要写在operator的配置中,物理备份到s3的配置比较复杂
- 不太方便更改image
CrunchyData Operator的优缺点
优点:
- 文档较为完善,有example
- 更改image较为方便
- 功能完整,部署,备份,恢复等功能都已经完备
- 有cli工具
缺点:
- 默认提供pgo cli,许多文档pgo cli与k8s配置文件混杂,有所混乱
本次部署采用了CrunchyData的方案,下面又是也简称为pgo.
部署
安装CRD
配置文件
配置文件中比较特殊的是备份相关的配置。一般来说,可以将备份存到s3中。
backups:
pgbackrest:
image: crunchy-pgbackrest:centos8-2.33-1
configuration:
- secret:
name: pgo-s3-creds
repoHost:
dedicated: { }
global:
repo1-path: /pgbackrest/postgres/pg-ha/beta/repo1
repo1-retention-full: "30"
repo1-retention-full-type: time
repos:
- name: repo1
schedules:
full: "3 0 * * *"
incremental: "13 */1 * * *"
s3:
bucket: "database-non-prod"
endpoint: "oss-cn-hangzhou.aliyuncs.com"
region: "oss‑cn‑hangzhou"
备份与恢复
配置好pgbackrest
,备份功能就已经开始工作。
恢复数据库有3种方式
PITR
可以新建一个数据库来clone另外一个数据库。这种方式有两个前提,被克隆的数据必须正在运行,且必须有不晚于指定时间的备份。
spec:
dataSource:
postgresCluster:
clusterName: hippo
repoName: repo1
options:
- --type=time
- --target="2021-06-09 14:15:11 EDT"
In-Place PITR
可以将当前数据恢复到之前某一个时间点的数据状态
spec:
backups:
pgbackrest:
restore:
enabled: true
repoName: repo1
options:
- --type=time
- --target="2021-06-09 14:15:11 EDT"
Standby Cluster restore
pgo提供了一种方法,可以跨k8s集群来部署Postgresql。这一便利可以用来从s3中恢复数据库
- 创建standby postgresql数据库,并将back指向有备份文件的s3仓库,此时该数据库只能读不能写
- prompt standby postgresql数据库,该数据库可以正常读写
第一步
spec:
standby:
enabled: true
repoName: repo1
第二步
spec:
standby:
enabled: false
如何连接Postgresql
连接postgres比较简单,pgo会生成多个service,可以选择pgbouncer或者pg-primary来连接,外部访问,只需要将这两个节点port-forward出来即可。
注意点
下一步工作
常用命令
- 导入pg_dump备份的文件
cat db-backup-21-08-24-07-00.sql | psql -h localhost -p 5432 --username username
- 获取secret中某个值
kubectl -n postgres get secrets/hippo-ha-pguser-hippo-ha --template={{.data.password}} | base64 -d
使用crunchydata
- 恢复 利用standby
- 最后将standyby.enabled: false 来启动集群
pgbackrest info
pgbackrest —stanza=db —log-level-console=info check
部署PostgreSQL到k8s
https://blog.ivyxjc.com/posts/pg-k8s-operator/