4

假设有一个 PostgreSQL 集群,由一个主节点和两个通过流复制的只读副本组成。

如何配置 Tomcats DBCP 以了解数据库集群中有几个不同的节点,从而将变异语句分配给主节点的连接,并将无副作用的语句(负载平衡)分配给任何从节点的连接?

正如 PostgreSQL 的 JDBC 驱动程序文档所述,可以在 JDBC 连接 URL 中声明多个节点 jdbc:postgresql://host1:port1,host2:port2/database

于是萌生了在Tomcats server.xml中配置两个连接池的想法。一个用于读/写主数据源的 JNDI 资源和另一个用于只读副本的池:jdbc:postgresql://host1:port1/database?targetServerType=master和副本jdbc:postgresql://host1:port1,host2:port2/database?targetServerType=preferSlave&loadBalanceHosts=true

在这种情况下,运行在 Tomcat 上的应用程序需要知道存在两个语义不同的 DB 连接池,因此需要根据每个 SQL 语句来决定从哪个池请求连接。这似乎是一个糟糕的模式,因为应用程序依赖于特定的数据库基础设施,而 JDBC 池应该抽象底层数据库的实现。

在这种情况下,Tomcat DBCP 和 PostgreSQL 集群之间的额外抽象层(如pgpool-II )是否有帮助?(特别是当未来基础设施增长到多个 Tomcat 服务器实例或对 PostgreSQL 数据库的高可用性和故障转移的要求上升时)

4

0 回答 0