Postgres 可以使用多主复制吗?

Postgres 可以使用多主复制吗?
  1. 我尝试了 Postgres-XC,但它还没有实现完整的 SQL(如 SERIAL)

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

所以我使用了 pgpool-II 3.0.1。是的,它运行良好。但据我所知,它仅适用于 2 个 PG 节点。

有没有什么东西可以真正投入生产并且能够与多个 PG 节点协同工作?

答案1

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

答案2

我不得不同意彼得的评估:实际上没有好的现在为 Postgres 实现多主复制。(实现真正的多主复制是一个非常困难的问题,而且我对任何可用的解决方案都不太满意。)

您可能想要调查维基百科的潜在解决方案列表:

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

答案3

这是重度 Java 导向的,但本机数据库客户端 API 可以桥接到 JDBC 数据源。Tungsten Myosotis 是 MySQL 本机到 JDBC 桥接的一个例子。


  • Tungsten Enterpriese 适用于多主异步。我认为它适用于 MySQL、PostgreSQL 和 Oracle。它可以独立运行或嵌入 Java 应用程序中。我见过它适用于 MySQL,但他们声称适用于 PostgreSQL。他们的 Replicator 组件是开源的,但完整解决方案包含更多部分,并且需要许可费用。Continuent 最初使用 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 集群的旧应用程序,因此它缺少事务重试代码。串行模式挽救了局面,避免了令人讨厌的重写。

  • H2 适用于多主同步。它是开源的。它支持使用两阶段提交的独立数据库或集群,类似于 HA-JDBC 架构,但它是一体化的,而不需要额外的组件来实现两阶段提交。不确定它是否自己执行分布式锁定,还是依赖于第三方,如 jGroups 或 Hazelcast。

任何基于 JDBC 的 PostgreSQL 和其他数据库复制都需要本机到 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,以实现同步。

如果有 PostgreSQL 原生到 JDBC 的桥接,我很乐意听听。理论上,任何具有 JDBC Type 4 驱动程序的数据库都可以桥接。Type 4 JDBC 使用原生数据库协议,就像该数据库的原生客户端接口一样,因此应该存在原生调用到 JDBC 调用的一对一映射。

答案4

过去两年来,我一直在使用 londiste 实现 postgresql 中的多主复制。

您使用 pg_queue 将表放入队列,并且可以将任意数量的其他数据库订阅到每个队列,复制是按队列原子进行的,并且非常有弹性。

您可以在这里阅读有关 londiste 的信息(http://pgfoundry.org/projects/skytools/),这是 Skype 团队为他们的集群所使用的,也是他们创建的,所以它更酷 :)

相关内容