可用于Postgres的多主复制吗?


16
  1. 我尝试了Postgres-XC,但它尚未实现完整的SQL(例如SERIAL)

  2. 根据开发人员的说法,Postgres-R看起来很有趣,但是它“还没准备好生产”。

所以我用了pgpool-II 3.0.1。是的,效果很好。但据我所知,它仅适用于2个PG节点。

是否有任何实际准备就绪且能够与多个PG节点一起使用的东西?


几年前,我们遇到了同样的问题。最终,我们将所有工作转移到了Oracle。希望这些天您能找到可用的多原版复制,但我似乎还没有...好运,不过。
grufftech 2011年

2
PostgreSQL自己的文档说要使用中间件应用程序:) ..“ 同步多主复制 ..尽管可以使用PostgreSQL两阶段提交(PREPARE TRANSACTION和COMMIT PREPARED)来实现此功能,但PostgreSQL不提供这种复制。应用程序代码或中间件”
沃伦

您不限于两个节点。
foocorpluser's

Answers:


6

您考虑过布卡多吗?它是异步多主机。它还没有完全流行起来,也不是一个通用的解决方案,但是值得一试。


1
我显然不够具体:我需要同步复制。此外,在FAQ中这是什么意思?“ Bucardo可以在两个以上的主机之间复制吗?不。目前,Bucardo仅支持主机到主机(当然也支持许多从机的主机)。” 那是不是多主机?
mrkafk 2011年

4
仅当您对“ multi”的定义为“ 2”时!
hmallett

请注意,从Bucardo 5开始,仅2位大师的限制已被取消
Joril

3

我必须同意Peter的评估:Postgres目前还没有真正好的多原版复制。(执行真正的多主复制是一个非常困难的问题,我不喜欢任何可用的解决方案。)

抄录Wikipedia可能要调查的潜在解决方案列表:

PostgreSQL为多主复制提供了多种解决方案,包括基于两阶段提交的解决方案。有Bucardo,rubyrep,PgPool和PgPool-II,PgCluster和Sequoia以及一些专有解决方案。实现急切(同步)复制的另一种有前途的方法是Postgres-R,但是它仍在开发中。实现同步复制的另一个项目是Postgres-XC。Postgres-XC也仍在开发中。


哇,单单阅读这份清单,我就会感到震惊和恐惧。:)
Peter Eisentraut 2011年

对我来说,这是沮丧和厌恶:-)
voretaq7 2011年

我认为可以使用类似于etcd的系统进行配置和通信,也许可以在两阶段提交中运行任何更新语句...困难的部分是将一个节点排除在外,直到被追赶并匹配其他节点。我真的很喜欢这种自动解决方案
Tracker1 2014年

3

这是面向Java的繁重工具,但是可以将本机数据库客户端API桥接到JDBC数据源。Tungsten Myosotis是JDBC桥接原生的MySQL示例。


  • Tungsten Enterpriese适合于多主机异步。我认为它适用于MySQL,PostgreSQL和Oracle。它可以独立运行,也可以嵌入Java应用程序中。我已经看到它适用于MySQL,但他们声称PostgreSQL。他们的Replicator组件是开源的,但是完整的解决方案包含更多部分,并且需要许可费用。Continentt最初将Sequoia用于多主设备同步,但他们放弃了它,而是创建了Tungsten来用于多主设备异步-与同步ACID一致性相比,他们认为扩展业务更具战略性。Tungsten用Java编写,因此这就是为什么它们提供Myosotis桥接本地数据库客户端的原因。

  • SymmetricDS适用于多主机异步。它是开源的。它安装/卸载触发器以捕获更新,而不是bin日志记录。它可以独立运行,也可以嵌入Java应用程序中。

  • HA-JDBC适用于多主机同步。它取代了诸如C-JDBC和Sequoia之类的旧软件。它是开源的。它使用两阶段提交,并且通过方言可用于PostgreSQL,MySQL,Oracle,SQL Server,Derby,Sybase以及许多其他应用程序。它主要用于嵌入式,因此嵌入Java应用程序以将其桥接到PostgreSQL。分布式锁,序列,时间,兰特等由Redhat / JBoss的jGroups处理。如果您的应用遇到死锁并且不支持回滚,那么一个不错的功能是事务模式“串行”而不是“并行”。我成功地使用了这种“串行”模式来改造不具备DB-cluster意识的旧版应用程序,因此缺少事务重试代码。串行模式节省了一天的时间,避免了麻烦的重写。

  • H2适用于多主机同步。它是开源的。它类似于HA-JDBC体系结构,支持使用两阶段提交的独立数据库或集群,但是它是一个一体的,而不需要额外的组件来进行两阶段提交。不知道它是否分布式锁定本身,还是依赖于第三方(如jGroups或Hazelcast)。

PostgreSQL和其他数据库的任何基于JDBC的复制都需要JDBC桥的本机,除非您的应用程序已经用Java编写过。对于MySQL,Tungsten Enterprise提供了一个称为Myosotis的可选组件。我成功地使用它来将PHP / Perl / C / mysqlclient桥接到JDBC,其中JDBC数据源恰好是指向4节点MySQL / InnoDB集群的HA-JDBC代理数据源。

Tungsten在其Replicator和Router组件中支持PostgreSQL,但不确定Myosotis组件。也许。Tungsten Replicator / Router组件用于多主机异步,但是Myosotis可以将您桥接到备用JDBC后端(例如HA-JDBC或H2)进行同步。

如果有JDBC桥接本机的PostgreSQL,我想听听。从理论上讲,任何具有JDBC Type 4驱动程序的数据库都可以进行桥接。类型4 JDBC讲本地数据库协议,就像该数据库的本地客户端接口一样,因此应将本地调用与JDBC调用一对一映射。



1

在过去的两年中,我一直在使用londiste在postgresql中进行多主机复制。

您可以使用pg_queue将表放入队列中,并且可以为每个队列预订所需的其他许多数据库,该复制是逐个原子地进行的,并且非常灵活。

您可以在此处了解有关londist的信息(http://pgfoundry.org/projects/skytools/),这是Skype家伙用于其集群的内容,也是他们创建的,因此是酷炫的一倍:)


嗯,这很有趣,但根据我在这里看到的:wiki.postgresql.org/wiki/...,Londiste是主从和异步?那么如何成为多主设备呢?另外,我确实需要同步复制:如果任何(活动)群集节点失败,则事务应该失败。
mrkafk 2011年

这种复制是在交易后进行的,否则会很慢
lynxman 2011年

我的意思不是听起来很痛苦(挑剔),但是... 1.我使用了pgpool-II,并且交易很快就完成了(尽管我还没有做基准测试),以及2.即使单个交易的速度可能会较慢,我认为交易的整体吞吐量不会很低。无论如何,也许更重要的一点是Londiste如何成为多主机?我可以写入pg服务器1并将其复制到2,然后写入pg服务器2并将其复制到服务器1吗?
mrkafk 2011年


-2

我发现可用的“多主”复制系统:

  1. 获得RabbitMQ http://www.rabbitmq.com/-这是一个消息中间件。

  2. 在Rabbit中配置Rabbit MQ集群。

  3. 为集群中的每个节点创建队列,并将它们绑定到“扇出”类型交换。

这样,发送到任何节点和任何队列的消息将被复制到所有其他节点。我有一个有效的代码!


2
@mrafk-您会发布/链接您拥有的“工作代码”吗?
沃伦

2
这与Postgres复制有什么关系?这将分发消息,但是您将从数据库中获取数据消息/更新的位置以及它如何更新消息队列上接收消息的节点?
2011年

3
这可能是您所面临的基本问题的解决方案,但不是此问题的答案。
汤姆·安德森
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.