是否可以保留单个静态大型Postgres数据库,而不能删除数据库集群?

2019-05-23 postgresql docker docker-volume postgresql-10 tablespace

我有一个应用程序,用于本地开发,具有多个Docker容器(在Docker Compose下组织)。这些容器之一是Postgres 10实例,基于官方的postgres:10映像。该实例的数据目录作为Docker卷挂载,可在容器运行期间持久保存数据。到目前为止一切都很好。

作为测试postgres集群的创建和初始化的一部分,通常我需要删除保存数据的Docker卷。 (如果在容器启动时发现数据目录为空,则官方的postgres映像将运行cluster init if-and-only-。)这也很好。

然而!我现在遇到一种情况,为了测试和使用第三方Postgres扩展,我需要从Postgres备份转储文件中将大约6GB(全静态)地理编码查询数据加载到群集上的数据库中。当然,有可能在容器启动时从本地安装点加载数据,并且所产生的(非常大的)表将在容器重新启动期间保留在容纳整个群集的卷中。

不幸的是,移除docker卷后,它们将无法幸免,而再次需要以某种频率发生。 我正在寻找一种加快或避免重建包含地理编码数据的数据库的方法。

我曾经或目前正在考虑的方法:

  1. 在同一个容器上使用单独的Docker卷为单独的仅包含地址解析器数据库的Postgres表空间创建持久性存储。这似乎是行不通的,因为虽然我可以肯定地进行设置,但官方的PG文档说表空间和群集是密不可分的,因此丢失了其余的群集将使其他表空间无法使用。我想对此是错误的,因为这似乎是最简单的解决方案。
  2. 创建一个运行Postgres的完全独立的容器,该容器安装一个卷以容纳仅包含地理编码数据的单独群集。大概然后,我将需要对外部数据包装程序(或一些我目前不了解的奥秘的postgres管理技巧)进行混淆处理,以使数据可以从应用程序代码中无缝访问。

所以,我的问题是: 有没有人知道一种方法,该方法可以在不使用转储和重新加载策略的情况下从Docker化的Postgres集群中持久保存单个数据库?

Answers

如果要加快速度,则可以将数据库转储转换为数据目录(将转储导入干净的postgres容器,将其停止并创建数据目录的tarball,然后将其上载到某个位置)。现在,当您需要创建一个新的postgres容器时,请使用init脚本来停止数据库,将tarball下载并解压缩到数据目录中,然后再次启动数据库,这样您就可以跳过整个数据库还原过程。

注意:数据tarball必须与postgres主版本匹配,因此容器从其开始没有问题。

如果您想进一步加快速度,请创建一个自定义的postgres图像,其中包含tarball和init脚本,因此每次启动时,它将擦除空集群并复制您自己的集群。

您甚至可以更改入口点以使用您的自定义脚本并加载数据库数据,然后调用docker-entrypoint.sh,因此无需删除可能的空集群。

仅当您每次要运行测试都可以替换整个群集时,这才起作用,否则您将无法导入数据库转储。

Related