Nano Hash - криптовалюты, майнинг, программирование

Стратегия пула соединений: хорошо, плохо или безобразно?

Я отвечаю за разработку и обслуживание группы веб-приложений, ориентированных на схожие данные. Архитектура, которую я выбрал в то время, заключалась в том, что каждое приложение будет иметь свою собственную базу данных и корневое веб-приложение. Каждое приложение поддерживает пул соединений со своей собственной базой данных и центральной базой данных для общих данных (логины и т. д.).

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

Насколько я понимаю, при правильной настройке для использования только необходимого количества подключений в разных пулах (приложения с небольшим объемом получают меньше подключений, приложения с большим объемом получают больше и т. д.), количество пулов не Это не имеет значения по сравнению с количеством подключений или, говоря более формально, разница в накладных расходах, необходимых для поддержки 3 пулов по 10 подключений, незначительна по сравнению с 1 пулом из 30 подключений.

Причина первоначального разделения систем на схему «одно приложение — одна база данных» заключалась в том, что между приложениями, вероятно, будут различия и что каждая система может вносить изменения в схему по мере необходимости. Точно так же это устранило возможность утечки системных данных в другие приложения.

К сожалению, в компании нет сильного руководства, чтобы принять трудное решение. Хотя мой коллега подкрепляет свои опасения лишь расплывчатостью, я хочу убедиться, что понимаю разветвления нескольких небольших баз данных/соединений по сравнению с одной большой базой данных/пулом соединений.


  • Я не согласен с вашим коллегой. Если у вас есть n веб-приложений, используйте n пулов, даже если они используют один и тот же сервер базы данных. Это дает вам лучшее разделение проблем, более тонкие параметры настройки, лучшую изоляцию (если одно веб-приложение съедает все соединения, почему это должно влиять на другое) и т. д. Кроме того, я действительно не понимаю, почему уникальный пул будет лучше масштабироваться. . Это ИМО просто не соответствует действительности. 22.09.2009

Ответы:


1

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

1) Большая масштабируемость — потому что каждый сегмент может работать на отдельном оборудовании, если это необходимо.

2) Большая доступность — потому что сбой одного сегмента не влияет на другие сегменты.

3) Более высокая производительность - поскольку в таблицах, в которых выполняется поиск, меньше строк и, следовательно, меньшие индексы, что обеспечивает более быстрый поиск.

Предложение вашего коллеги перемещает вас к настройке единой точки отказа.

Что касается вашего вопроса о 3 пулах соединений размера 10 и 1 пуле соединений размера 30, лучший способ уладить этот спор — с помощью эталонного теста. Настройте свое приложение любым способом, затем проведите стресс-тестирование с помощью ab (Apache Benchmark) и посмотрите, какой способ работает лучше. Я подозреваю, что существенной разницы не будет, но проведите тест, чтобы доказать это.

21.09.2009
  • Спасибо! К сожалению, я не являюсь администратором баз данных, но мне не приходило в голову, что эта установка на самом деле была уловкой шардинга. К сожалению, если не будет дополнительной магии, позволяющей MySQL автоматически действовать как сегментированная среда, разные базы данных также служат бизнес-различиями, что сделает надлежащий бенчмаркинг проблематичным. Также не власти, которые, вероятно, дадут нам время для запуска тестов. :\ 26.09.2009

  • 2

    Если у вас есть одна база данных и два пула соединений, по 5 соединений в каждом, у вас есть 10 соединений с базой данных. Если у вас есть 5 пулов соединений с 2 ​​соединениями в каждом, у вас есть 10 соединений с базой данных. В итоге у вас есть 10 подключений к базе данных. База данных понятия не имеет о существовании вашего пула, ничего не знает.

    Любые метаданные, которыми обмениваются пул и БД, будут происходить при каждом соединении. Когда соединение запускается, когда соединение разрывается и т. д. Таким образом, если у вас есть 10 соединений, этот трафик будет происходить 10 раз (как минимум, при условии, что все они остаются работоспособными в течение всего срока службы пула). Это произойдет независимо от того, есть ли у вас 1 пул или 10 пулов.

    Что касается «1 БД на приложение», если вы не разговариваете с отдельным экземпляром базы данных для каждой БД, то это в принципе не имеет значения.

    Если у вас есть сервер БД, на котором размещено 5 баз данных, и у вас есть подключения к каждой базе данных (скажем, по 2 подключения на каждую), это потребует больше накладных расходов и памяти, чем та же БД, на которой размещена одна база данных. Но эти накладные расходы в лучшем случае незначительны и совершенно незначительны на современных машинах с буферами данных размером в ГБ. После определенного момента все, о чем заботится база данных, — это сопоставление и копирование страниц данных с диска в ОЗУ и обратно.

    Если у вас есть большая избыточная таблица, дублированная во всех БД, это может быть потенциально расточительным.

    Наконец, когда я использую слово «база данных», я имею в виду логическую сущность, которую сервер использует для объединения таблиц. Например, Oracle очень нравится иметь одну «базу данных» на сервер, разбитую на «схемы». Postgres имеет несколько БД, каждая из которых может иметь схемы. Но в любом случае все современные серверы имеют логические границы данных, которые они могут использовать. Я просто использую здесь слово «база данных».

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

    21.09.2009
  • Мы все обращаемся к одному серверу БД, на котором работает Mysql, с данными каждого приложения в одной базе данных (мы используем этот термин одинаково), в то время как другая центральная база данных хранит общие данные. По вашему мнению, я правильно понимаю. :) 26.09.2009

  • 3

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

    21.09.2009
  • Может быть выполнимо. Я не DBA, к сожалению. Я знаю, что в MySQL есть встроенная обработка сегментирования, но я мало что об этом знаю. Если бы мы попытались сделать это программно, нам пришлось бы добавить столбцы дискриминатора и все такое забавное. К счастью, они понадобятся только для определенных таблиц. Я буду держать это в затылке, если возникнут реальные проблемы с производительностью. 26.09.2009

  • 4

    С точки зрения базы данных и накладных расходов 1 пул с 30 подключениями и 3 пула с 10 подключениями в основном одинаковы, если предположить, что нагрузка одинакова в обоих случаях.

    С точки зрения приложения разница между передачей всех данных через одну точку (например, сервисный уровень) и наличием точки доступа для каждого приложения может быть довольно существенной; как с точки зрения производительности, так и простоты реализации/обслуживания (например, рассмотрите возможность использования распределенного кеша).

    21.09.2009
  • Распределенный кеш — это момент, который я не учел. Однако в настоящее время весь код сохраняемости абстрагируется в единую библиотеку, которая включена в каждое веб-приложение, оставляя только настройку для каждого веб-приложения. Однако цель всегда состояла в том, чтобы заменить этот код сохраняемости (построенный на JDBC) более полным ORM. ORM очень хорошо подходит для многих наших данных. Проблемы со временем не позволили нам использовать его с самого начала. 26.09.2009

  • 5

    Что ж, отличный вопрос, но его нелегко обсуждать, используя подход с несколькими базами данных (A) или большой (B):

    1. Это зависит от самой базы данных. Оракул, например отличается от Sybase ASE в отношении стратегии LOG (и, следовательно, LOCK). Возможно, было бы лучше использовать несколько разных и небольших баз данных, чтобы поддерживать низкий уровень конкуренции за блокировку, если существует много параллельных операций записи, а БД использует стратегию пессимистической блокировки (Sybase).
    2. Если табличное пространство небольших баз данных не распределено по нескольким дискам, может быть лучше использовать одну большую базу данных для использования памяти (буфера/кэша) только для одного. Я думаю, что это редко бывает.
    3. Использование (A) лучше масштабируется по другой причине, чем производительность. Вы можете перемещать базу данных горячих точек на другое (более новое/быстрое) оборудование, когда это необходимо, не затрагивая другие базы данных. В моей бывшей компании этот подход всегда был дешевле, чем вариант (Б) (без новых лицензий).

    Я лично предпочитаю (А) по причине 3.

    21.09.2009
  • В первую очередь мы являемся магазином с открытым исходным кодом, и для базы данных мы используем MySQL с InnoDB. Это как-то меняет ваш ответ? 26.09.2009

  • 6

    Дизайн, архитектура, планы и отличные идеи терпят неудачу, когда за ними нет здравого смысла или простой математики. Еще немного практики и/или опыта… Вот простая математика того, почему 10 пулов с 5 соединениями — это не то же самое, что 1 пул с 50 соединениями: каждый пул настроен с минимальным и максимальным количеством открытых соединений, факт в том, что он будет обычно используют (99% времени) 50% минимального числа (2-3 в случае 5 минут), если он использует больше, чем этот пул неправильно настроен, так как он постоянно открывает и закрывает соединения (дорого ) ... поэтому у нас 10 пулов с 5-минутными подключениями каждый = 50 открытых подключений... означает 50 TCP-соединений; 50 JDBC-соединений поверх них... (вы отлаживаете JDBC-соединение? Вы будете удивлены, сколько метаданных передается в обе стороны...) Если у нас есть 1 пул (обслуживающий ту же инфраструктуру, что и выше), мы можем установить мин. до 30 простых, потому что он сможет более эффективно сбалансировать дополнительные функции ... это означает, что на 20 соединений JDBS меньше. Не знаю как для вас, а для меня это много... Дьявол в деталях - 2-3 коннекта, которые вы оставляете в каждом пуле, чтобы он не открывался/закрывался постоянно.. , Даже не хочу вдаваться в накладные расходы на управление 10 пулами ... (Я не хочу поддерживать 10 пулов, каждый из которых настолько отличается от другого, не так ли?) Теперь, когда вы меня начнете, если это на моем месте я бы «обернул» БД (источник данных) одним приложением (каким-нибудь сервисным уровнем?), которое предоставило бы службы сравнения (REST/SOAP/WS/JSON — выберите свой яд), и мои приложения даже не узнают про JDBC, TCP и т.д. и т.п. о, подождите, в гугле есть - GAE...

    22.09.2009
  • К счастью, сервер приложений (в данном случае Tomcat) поддерживает пулы соединений и предоставляет нам средства управления настройкой. Кроме того, я не слежу за вашей математикой. Предполагая, что все пулы настроены правильно, если мы используем 50%, зачем 10 пулам 50 открытых подключений? Разве не нужно всего 20-30? 26.09.2009
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..