如何从多个postgres数据库创建只读副本到一个数据库?

时间:2017-02-28 21:15:39

标签: postgresql replication multi-master-replication

我想在此之前说我不是DBA,对于技术知识方面的任何差距感到抱歉。

我在微服务架构中工作,我们有十几个或应用程序,每个都由其Postgres数据库实例支持(如果有帮助的话,它在RDS中)。每个微服务'数据库包含几个表。可以安全地假设任何模式/表中没有命名冲突,并且数据库中没有任何数据分片。

我们一直遇到的一个问题是想要跨数据库分析/加入数据。现在,我们依赖于第三方工具来缓存我们的数据,并且可以跨多个数据库源(通过共享缓存)进行查询。

是否可以从我们所有的生产数据库中创建模式/表的只读副本,并让它们可以在单个数据库中查询?

是否有其他方法可以配置Postgres或RDS以使我们的数据库加入?

1 个答案:

答案 0 :(得分:3)

  

是否可以从我们所有的生产数据库中创建模式/表的只读副本,并让它们可以在单个数据库中查询?

是的,这是可能的,而且实际上非常简单。

设置一个充当主服务器的Postgres服务器。

对于每个远程服务器,创建一个foreign server然后您可以创建一个foreign table,使数据可以从主服务器访问。

如果多个服务器中有多个表应该在主服务器中被视为一个表,则可以设置继承以使所有这些表看起来像一个。如果你能定义一个"分片"标识这些服务器之间的不同属性的密钥,甚至可以使Postgres仅从特定服务器请求数据。

可以将所有外部表连接起来,就像它们是本地表一样。根据查询的类型,甚至可以将一些(或许多)过滤器和连接标准下推到远程服务器以分发工作。

由于Postgres Foreign Data Wrapper是可写的,您甚至可以从主服务器更新远程表。

如果远程访问和连接速度太慢,您可以根据远程表创建实体化视图,以创建数据的本地副本。然而,这意味着它不是实时副本,您必须管理表的定期刷新。

其他(更复杂)选项是BDR项目或pglogical。似乎逻辑复制将内置到next Postgres版本中(将在今年年底发布)。

或者您可以使用像Postgres-XL这样的分布式无共享系统(可能是设置和维护最复杂的系统)