将生产数据库复制到暂存区的推荐方法是什么?假设生产数据库转储的链接已可用于暂存服务器。
当手工执行时,我必须:
- 停止所有连接到数据库的应用的 pod。在我的例子中,是 Web 应用和 Worker 应用
- 删除并重新创建临时数据库
- 在 pod 上运行 pg_restore(通过 Job,或者我创建一个一次性的 pod 来调用
pg_restore
)
我有一些想法,但我想知道其他人做了什么。
我希望有一些东西可以像 heroku 一样简单:
heroku pg:backups restore `heroku pg:backups public-url -r production` -r staging
答案1
我一直在使用 pghoard,从https://github.com/ohmu/pghoard...
配置完成后,它似乎运行得很好,但设置开销很大。至少你需要一个 dockerfile、启动脚本和 kubernetes 配置才能利用它。
一旦启动并运行,您就应该能够将最新备份复制到暂存设置 pghoard 的存储桶中,终止当前暂存数据库,并且当暂存数据库 pod 再次启动时,pghoard 可以从其存储桶中恢复最新备份。可能吧。(我没有尝试过以这种方式使用它,并且不记得 pghoard 在发生故障时如何选择要恢复的版本。)
对于经常更改的暂存/测试环境,您可能还可以跳过使用持久卷并将 postgres pod/部署及其存储视为临时的。
这不像您给出的示例那么简单,但可能是最直接的,并且最有可能真正起作用。自动化可能也不太难。
我不太确定的事情:(这些肯定是假设的。所以...要小心。)
第二个选项是使用 stolon postgresql,来自https://github.com/sorintlab/stolon...
不过,这在某种程度上取决于你的集群配置。如果你使用一个集群,使用多个命名空间或标签来区分生产环境和暂存环境,那么这将很容易。
再次强调,这并不是我所说的开箱即用的设置。要实现这一点,需要进行大量调整(以及更改生产 Postgres 设置)。
我想第三个选择可能是通过 postgres 本身配置同步/流式复制。不幸的是,我不知道当您开始写入主动同步的副本时会发生什么。也许启用/禁用流式复制以及 pg_rewind 的某种组合可能会奏效。