Mah*_*ror 5 postgresql load-balancing pgpool jdbc-pool tomcat-dbcp
假设有一个 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 上运行的应用程序需要知道有两个具有不同语义的数据库连接池,因此需要根据每个 SQL 语句来决定从哪个池请求连接。这似乎是一个不好的模式,因为应用程序依赖于特定的数据库基础设施,并且 JDBC 池应该抽象底层数据库的实现。
Tomcat DBCP 和 PostgreSQL 集群之间的附加抽象层(例如pgpool-II)可以在这种情况下提供帮助吗?(特别是当将来基础设施增长到多个 Tomcat 服务器实例或 PostgreSQL 数据库的高可用性和故障转移要求上升时)