Как настроить Tomcat JDBC Pool для кластера с балансировкой нагрузки (например, PostgreSQL Master-Slave Replication)

Давайте предположим, что существует кластер PostgreSQL, состоящий из одного главного узла и двух реплик только для чтения посредством потоковой репликации.

Как я могу сконфигурировать Tomcats DBCP, чтобы знать, что в кластере db есть несколько разных узлов, и таким образом распределять операторы мутирования для подключения к главному узлу и соответственно операторы без побочных эффектов (с балансировкой нагрузки) для подключения любого подчиненного узла?

Как указано в документации драйвера JDBC PostgreSQL, в URL-адресе соединения JDBC можно объявить несколько узлов: 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 должен абстрагировать реализацию базовой базы данных.

Может ли дополнительный сценарий абстракции, такой как pgpool-II, между Tomcat DBCP и кластером PostgreSQL помочь в этом сценарии? (Особенно, когда в будущем инфраструктура возрастает до нескольких экземпляров сервера Tomcat или возрастает требование высокой доступности и восстановления после отказа БД PostgreSQL)

0 ответов

Другие вопросы по тегам