Пул соединений JDBC в кластерной среде Tomcat

Я относительно новичок в этом, но у меня настроен кластер Tomcat (с использованием mod_proxy из httpd) с репликацией сеанса (отдельный сервер Redis) для отказоустойчивости.

У меня есть пара вопросов об этой настройке:

  1. Мое приложение (spring / hibernate) имеет отдельную базу данных для каждого пользователя. Итак, проблема здесь в том, что источник данных (с использованием Spring вместе с гибернацией для сохранения) создается на уровне Tomcat. Таким образом, какой бы пул соединений я ни делал, он будет на уровне сервера.

    В соответствии с конфигурацией кластера экземпляры Tomcat создадут свой собственный пул подключений.

    Я хотел бы знать, возможен ли пул соединений на уровне кластера с использованием Tomcat, т.е. есть ли способ убедиться, что все серверы в кластере используют общий пул подключений?

  2. Я не хочу настраивать DataSource на каждом экземпляре Tomcat из-за проблем с производительностью. Перед настройкой кластера приложение было развернуто на одном сервере, а DataSource был настроен таким образом, что разрешал только несколько (50) подключений в пуле подключений на DataSource.

    Теперь в кластерной среде я не могу позволить себе создавать или разделять такое количество подключений на каждом Tomcat, а также динамическая регистрация узлов создаст дополнительные проблемы. Я также хотел бы знать, есть ли какое-нибудь альтернативное решение этой проблемы, если объединение соединений невозможно или неэффективно?


person Harshvardhan Dudeja    schedule 20.12.2016    source источник


Ответы (1)


Я собираюсь ответить на ваши вопросы в обратном порядке, так как второй более простой.

Пул подключений к базе данных в Tomcat нельзя настроить для всего кластера: необходимо настроить отдельный пул для каждого узла в кластере. Но это не должно быть плохой новостью ... нет ничего плохого в настройке узла на 5, 10 или 100 подключений в пуле подключений на каждом узле.

Это правда, вы можете столкнуться с ситуацией, когда у вас слишком много пользователей, подключающихся к базе данных одновременно, что приведет к перегрузке вашей базы данных, но это также может произойти и с одним узлом. Нет ничего концептуально отличного от нескольких узлов, что не было бы верно и для одного узла.

ключ заключается в том, чтобы убедиться, что ваш кластер правильно балансирует пользователей, чтобы у вас не было ограничения, например, 5 подключений к базе данных на узел, но 100 пользователей в конечном итоге на одном узле, в то время как другие узлы имеют только 5 пользователей на узел. В этом случае популярный узел (100 пользователей) должен будет совместно использовать эти 5 подключений, в то время как на других узлах каждый пользователь получит подключение к себе.

Вернемся к первому пункту, который посложнее. Если у вас есть отдельная база данных для каждого пользователя, то создание пула соединений невозможно, потому что вам абсолютно необходимо каждый раз устанавливать новое соединение для каждого пользователя. Эти соединения нельзя объединить в пул, по крайней мере, без особой осторожности. Похоже, у вас есть архитектурная проблема, которую вам, возможно, придется решить, прежде чем вы сможете найти техническое решение этой проблемы.

person Christopher Schultz    schedule 21.12.2016
comment
Было такое же сомнение, поэтому, предполагая архитектурное изменение, что теперь пользователи классифицированы, и у меня есть пул соединений 100 с каждой категорией (есть N категорий), если я все еще не беспокоюсь о пуле соединений, поскольку это может не повлиять моя производительность в значительной степени? - person Harshvardhan Dudeja; 22.12.2016
comment
Значит, в вашем коде будет что-то вроде DataSource ds = ctx.lookup("java"comp/env/jdbc/categoryN")? Я думаю, у вас будет такая же проблема, потому что тогда вам понадобится N пулов со 100 подключениями ... на узел? Я думаю, вам просто нужно быть в порядке с небольшим количеством подключений на каждом узле в любом случае. Вы будете удивлены, как много можно сделать с 5-10 подключениями на узел. Если ваша база данных может обрабатывать больше, увеличьте количество соединений в пуле (ах). - person Christopher Schultz; 22.12.2016