【问题标题】:JDBC Logical replication across multiple PostgreSQL databases跨多个 PostgreSQL 数据库的 JDBC 逻辑复制
【发布时间】:2018-04-12 12:38:36
【问题描述】:

我知道可以使用 PostgreSQL 驱动程序通过 PGReplication API 接收单个数据库的逻辑数据库复制操作流。

但我想从 所有 postgresql 集群中的数据库接收事件,只需一个流。

主要动机是减少我们的用例所需的连接数量;如果我们可以只使用所有数据库的单个数据流,我们就可以避免使用或管理每台服务器 30 多个连接。这将在我们运行的许多服务器上更好地扩展。

这在 JDBC 中可行吗?也很高兴考虑 JDBC 的替代方案。

【问题讨论】:

  • 如果你想复制所有的数据库,那为什么不使用物理复制呢?我也不认为您可以在 JDBC 中避免这种情况,因为核心中的逻辑复制适用于每个数据库级别,而不是集群级别。所以 JDBC 和任何其他接口都无法做到这一点。
  • 我实际上并不想复制数据库,我想在特定表更改时向我的堆栈发送通知。我知道这可以通过 NOTIFY 完成,但是 NOTIFY 不支持两阶段提交,并且管理超过 60 个数据库(2 个 30 个数据库的集群)很复杂。肯定有利有弊,但如果可以跨多个数据库完成,我想探索使用逻辑复制。

标签: postgresql jdbc replication


【解决方案1】:

PostgreSQL 提供的任何东西都不允许您直接执行此操作,因为 PostgreSQL 后端不能连接到多个数据库或接收来自多个数据库的更改。

不管您使用LISTENNOTIFY、逻辑解码还是其他什么,每个数据库都需要一个连接。或者您需要某种聚合器/代理来维护这些连接并为您的应用提供单个流。

考虑:

  • 在 DB 服务器上或附近运行一个 per-db-server 聚合器,该聚合器连接服务器上的所有 DB,并通过 Kafka 或其他方式提供单个事件流。

  • 检查具有这么多独立数据库的架构是否有意义,您需要出于某种目的进行互连。你应该改为模式分片吗?

pglogical 的下一个版本(不是 PostgreSQL 的内置逻辑复制,一个单独的工具)将支持将事件流馈送到 Kafka,然后您可以从您的应用程序中使用它。所以这可能是一种选择。免责声明:我是开发人员之一,并在 2ndQuadrant 工作,该公司是提供工具的公司。

【讨论】:

  • 嗨 Craig,我只是在看 pglogical 看看它是否符合要求。将 pglogical 直接发布到 Kafka 可以解决我的问题,特别是如果它可以将输出严格保留为受影响行的主键。据我了解,我们只需将 pglogical 部署到集群中的每个数据库,但它不会消耗 TCP 连接,这很好。
  • @DoctorEval 它仍然需要一个活动的后端连接和逻辑解码会话每个数据库,所以它会影响max_connections 等。那里有一个连接,但它可以是一个unix套接字或 tcp,并且仅在 db 服务器本地。我对新的 Kafka 支持不太熟悉,无法解释更多。
  • 我不太关心后端连接(也许我应该关心),而是我们当前解决方案的脆弱性,从数据库本身驱动的东西会有很大帮助。我们的用例是专门将数据库更新转换为 Kafka,因此 pglogical 的下一个版本听起来很理想。我只是在 github 上看了看,但似乎 pglogical 是在私人开发的;如果您需要,很高兴成为一名测试员:)。欢呼
  • @DoctorEval 我还不允许发布预发布,您必须联系 info@2ndquadrant.com。我不知道提前访问等的安排是什么。我知道其他一些人也将数据提供给不同的服务,例如瓶装水,我认为人们也使用 wal2json。
  • 不用担心,我已经看过瓶装水并且正在考虑使用 wal2json 的 pg_recvlogical。谢谢!
猜你喜欢
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 2011-07-04
相关资源
最近更新 更多