Соединения с БД увеличиваются после установки aurora в коннекторе MariaDB

Мы тестируем поведение при отказе, используя специфические функции коннектора JDBC MariaDB Aurora.

Мы установили URL-адрес JDBC как документация предлагает:

jdbc:mysql:aurora://cluster.cluster-xxxx.us-east-1.rds.amazonaws.com/db

Проблема в том, что как только мы добавим часть aurora: в схему URL-адреса, мы увидим увеличение числа подключений к модулю записи базы данных до момента, когда нам придется откатить изменение (оно даже достигает 3000 подключений).

Версии:

Конфигурация:

master {
  profile = "slick.jdbc.MySQLProfile$"
  db {
    driver = "org.mariadb.jdbc.Driver"
    url = "jdbc:mysql:aurora://cluster-name.cluster-xxx.us-east-1.rds.amazonaws.com/db_name?characterEncoding=utf8mb4&rewriteBatchedStatements=true&usePipelineAuth=false"
    user = "rw_user"
    password = "rw_user_pass"
    numThreads = 20
    queueSize = 1000000
  }
}
slaves = [
  {
    profile = "slick.jdbc.MySQLProfile$"
    db {
      driver = "org.mariadb.jdbc.Driver"
      url = "jdbc:mysql:aurora://cluster-name.cluster-ro-xxx.us-east-1.rds.amazonaws.com/db_name?characterEncoding=utf8mb4&usePipelineAuth=false"
      user = "ro_user"
      password = "ro_user_pass"
      numThreads = 20
      queueSize = 1000000
    }
  }
]

Мы пытались добавить часть aurora: в URL-схему JDBC после обновления версии коннектора MariaDB, но количество подключений к Reader снова начало увеличиваться:

Если мы запустим show processlist на конечной точке только для чтения, мы увидим все открытые соединения в «очищенном» состоянии и команду «Сон».

Мы удалили часть aurora: из конечной точки только для чтения только для того, чтобы стабилизировать количество подключений к ней. Возможно ли, что драйвер ищет мастер кластера при открытии соединений? Это бы объяснило такое поведение.


person JavierCane    schedule 17.05.2017    source источник
comment
(ссылка на трекер Mariadb: jira.mariadb.org/projects/CONJ/issues)   -  person Diego Dupin    schedule 18.05.2017
comment
Вы можете выполнить show processlist, чтобы перечислить эти несколько соединений и их состояния?   -  person Diego Dupin    schedule 18.05.2017
comment
@DiegoDupin, спасибо за помощь. Я отредактировал вопрос, предоставив более подробную информацию о проблеме, включая статус подключения.   -  person JavierCane    schedule 22.05.2017
comment
@JavierCane ты когда-нибудь мог это понять? Прошло несколько лет, и я столкнулся с той же проблемой   -  person JPotts    schedule 10.03.2021


Ответы (2)


При использовании ключевого слова «aurora» драйвер под капотом создает 2 соединения:

  • подключение к основному серверу,
  • подключение к одной из реплик, если таковая имеется.

Цель всегда состоит в том, чтобы сохранить ресурсы на главном сервере. Как правило, настраивается только один пул. Затем драйвер использует подключение к первичной/реплике в соответствии с [Connection.setReadOnly] [1].

Если у вас есть отдельные пулы «записи» / «чтения», использование конфигурации «отказоустойчивость» решит вашу проблему: драйвер будет использовать только одно реальное соединение. Таким образом, не будет «бесполезного» соединения.

Аварийное переключение будет обрабатываться по-другому, но с теми же результатами (например, запрос не в транзакции, которая должна быть отправлена ​​на реплику, которая только что вышла из строя, не будет напрямую использовать первичное соединение, как при использовании конфигурации «aurora», драйвер воссоздаст новое соединение с другими репликами перед выполнением запроса).

person Diego Dupin    schedule 24.05.2017
comment
1. Судя по вашему комментарию, не имеет смысла иметь несколько экземпляров Aurora Reader, не так ли? Я имею в виду, что если драйвер выберет только одну из реплик Reader, он не будет распределять нагрузку между разными репликами. Это будет полезно только в случае аварийного переключения реплики: S 2. Согласно вашему предложению, мы должны установить схему URL-адреса для мастера как jdbc:mysql:aurora://, а для подчиненного устройства как jdbc:mysql:failover:// (полный пример), я вас правильно понял? Спасибо! - person JavierCane; 24.05.2017
comment
если вы используете конфигурацию основного пула только для подключения к главному, то есть никогда не переключаете соединение с помощью connection.setReadOnly() или компонента, который будет делать это, например, Spring @Transaction(readonly=true), тогда вы можете использовать jdbc:mysql:failover: //. Это позволит избежать создания ведомого соединения для каждого соединения с ведущим. - person Diego Dupin; 29.05.2017
comment
Репликативное соединение выбирается случайным образом среди действительных хостов. После этого все операторы будут выполняться на этом сервере базы данных до тех пор, пока соединение не будет закрыто (или не произойдет сбой). Таким образом, при 60 подключениях к репликам с кластером из 3 реплик будет примерно 20 подключений к каждой реплике. - person Diego Dupin; 29.05.2017
comment
Я просто понял твою мысль. Моя ошибка заключалась в том, что я думал о пулах подключений как о группах подключений к одному и тому же Reader. В сценарии, который вы только что описали, пул подчиненных подключений будет сформирован на основе подключений к различным случайным читателям, поэтому он фактически будет балансировать нагрузку между ними. Спасибо! - person JavierCane; 30.05.2017
comment
Что касается основного пула соединений: 1. То есть, если я укажу URL-адрес cluster-name.cluster-xxx.us-east-1.rds.amazonaws.com с конфигурацией failover:, он всегда будет открывать соединение с Writer? 2. Будут ли в таком случае упущены какие-либо другие функции коннектора для Aurora? - person JavierCane; 30.05.2017

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

person Rick James    schedule 18.05.2017
comment
Конечно :) Дело в том, что если я не добавлю часть aurora: в схему URL-адресов JDBC, HikariCP (пул соединений с БД) правильно управляет количеством соединений в клиенте. Но как только я добавляю часть aurora:, этого не происходит. Если это ошибка, как я могу сообщить об этом коннектору JDBC MariaDB? В их репозитории не включены задачи GitHub:/ github.com/MariaDB/mariadb -connector-j - person JavierCane; 18.05.2017