将某些表从一个postgres数据库复制到另一个数据库


9

我遇到以下情况:我有三台运行postgresql数据库的机器。一台计算机保存客户帐户信息(称为此计算机C),其他两台计算机保存客户日志记录信息(称为这些L1和L2)。拆分的原因是将负载分散到多台计算机上(因此某些客户端将日志记录信息发送到L1,一些客户端将日志信息发送到L2 ...,也许还有一些时间将L3,L4等)。

检索日志记录信息时,原则上,我希望能够在Ln上的日志记录表和C上的客户帐户表之间进行JOIN。实际上,我无法像这样进行JOIN(即使我可以,以避免加载C)。

我的想法是将C上的表复制到L1,L2,...中的每个表上,以便进行连接。就C中的表而言,C是主机,而L1,L2,...是从机。但是对于L1,L2上的其他表,...这些机器是主计算机。它不完全是主-主复制,也不完全是主-从。

可以说服postgres(我正在运行9.1)复制做到这一点,或者如果没有,那么是否有其他软件包可以完成这项工作。在万不得已的情况下,我可以编写一些代码来定期同步表(我可以忍受一些延迟),但是最好不要这样做!

提前致谢。


1
也许在记录机上使用FDW来访问C?虽然,这会导致C 的性能下降。物化视图可能会降低性能下降,但是我不太确定PostgreSQL如何检测到外部表的更新。如果自动执行此操作(实例化视图文档的结尾似乎暗示了这一点),则可以完全解决您的问题。这些是9.3功能。非常活跃的邮件列表也可能会有所帮助。
jpmc26 2014年

Answers:


4

在PostgreSQL 9.3上,您可以postgres_fdw用来透明地查询另一台机器上的外部表。

dblink如安德鲁所说,在旧版本上可以选择。

另一个选择是使用Londiste或Slony-I之类的工具来复制所需的表。我建议为此使用Londiste,它将变得更加简单。它在表上创建触发器以检测插入/更新/删除,并使用其自己的客户端/服务器和排队系统将这些触发器复制到另一个数据库,在该数据库中进行相应的插入/更新/删除。我在几个客户站点的生产中使用它,并且效果很好。

未来的选择(希望在PostgreSQL 9.5中)将是日志流逻辑复制,逻辑变更集提取和双向复制,这将允许在SQL级别复制单个数据库或表。这项工作的一部分已提交给PostgreSQL 9.4,但不足以使其对您要执行的操作有用。


3

您应该使用dblinks和实例化视图来实现此目的。这两个功能都内置在最新版本的Postgres中:

http://www.postgresql.org/docs/9.3/static/rules-materializedviews.html

http://www.postgresql.org/docs/9.3/static/dblink.html

本质上,您是使用从C上的表中提取的数据在每个数据库L1,L2 ...上构建一个Mview,然后使用Mview refresh定期根据需要定期更新Mview。数据存储在本地,因此访问速度非常快。仅当数据相对静态并且您不介意本地数据库偶尔具有稍微过时的信息时,这才适用。您应该设置刷新频率以适当地进行管理,如果不可接受,则应仅使用数据库链接来处理导致的缓慢性。

如果需要其他功能,快照项目将提供高级功能,例如快速刷新和快照日志:

http://pgfoundry.org/projects/snapshot/

这样,您可以刷新仅更新需要更新的行,这对于大型,无弹性的数据集而言可以使其非常快,从而将对应用程序的破坏降到最低。默认情况下,Mviews被完全删除并在Postgres中重新创建,由于明显的原因,这可能会降低性能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.