Spec-Zone.ru › MySQL Connectors 1.0

9.5 Настройка расширенного балансирования нагрузки и резервного копирования

Connector/J предоставляет полезную реализацию балансирования нагрузки для MySQL Cluster или развертываний с несколькими источниками, как объясняется в разделе 9.3 «Настройка балансирования нагрузки с Connector/J» и Поддержка топологий репликации с несколькими источниками. Эта же реализация используется для балансирования нагрузки между только для чтения репликами для подключений, поддерживающих репликацию.

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

  1. На границах транзакций (транзакции явно подтверждаются или откатываются).

  2. Возникновение исключения связи (SQL-состояние, начинающееся с "08").

  3. Когда a SQLException соответствует условиям, определенным пользователем, используя точки расширения, определенные свойствами loadBalanceSQLStateFailover, loadBalanceSQLExceptionSubclassFailover или loadBalanceExceptionChecker.

Третье условие основано на трех свойствах, которые позволяют контролировать, какие SQLException запускают резервное копирование:

  • loadBalanceExceptionChecker - Свойство loadBalanceExceptionChecker является ключевым. Оно принимает полностью квалифицированное имя класса, реализующего новый интерфейс com.mysql.cj.jdbc.ha.LoadBalanceExceptionChecker. Этот интерфейс очень простой, и вам нужно только реализовать следующий метод:

    public boolean shouldExceptionTriggerFailover(SQLException ex)
    

    Передается SQLException, а возвращается значение типа boolean. Значение true запускает резервное копирование, false — нет.

    Вы можете использовать это для реализации собственной логики. Пример, где это может быть полезно, — это при работе с временными ошибками при использовании MySQL Cluster, когда некоторые буферы могут перегружаться. Следующий фрагмент кода демонстрирует это:

    public class NdbLoadBalanceExceptionChecker
     extends StandardLoadBalanceExceptionChecker {
    
     public boolean shouldExceptionTriggerFailover(SQLException ex) {
      return super.shouldExceptionTriggerFailover(ex)
        ||  checkNdbException(ex);
     }
    
     private boolean checkNdbException(SQLException ex){
     // Have to parse the message since most NDB errors
     // are mapped to the same DEMC.
      return (ex.getMessage().startsWith("Lock wait timeout exceeded") ||
      (ex.getMessage().startsWith("Got temporary error")
      && ex.getMessage().endsWith("from NDB")));
     }
    }
    
    

    Приведенный выше код расширяет com.mysql.cj.jdbc.ha.StandardLoadBalanceExceptionChecker, который является реализацией по умолчанию. Существуют несколько удобных сокращений, встроенных в эту реализацию, для тех, кто хочет иметь некоторый уровень контроля, используя свойства, без написания кода Java. Эта реализация по умолчанию использует два оставшихся свойства: loadBalanceSQLStateFailover и loadBalanceSQLExceptionSubclassFailover.

  • loadBalanceSQLStateFailover — позволяет определить список разделяемых запятыми префиксов кода SQLState, с которыми сравнивается SQLException. Если префикс совпадает, запускается резервное копирование. Например, следующее вызовет резервное копирование, если заданный SQLException начинается с "00" или равен "12345":

    loadBalanceSQLStateFailover=00,12345
    
  • loadBalanceSQLExceptionSubclassFailover — может использоваться в сочетании с loadBalanceSQLStateFailover или самостоятельно. Если вы хотите, чтобы определенные подклассы SQLException запускали резервное копирование, просто укажите список разделяемых запятыми полных имен классов или интерфейсов для проверки. Например, если вы хотите, чтобы все SQLTransientConnectionExceptions запускали резервное копирование, вы укажете:

    loadBalanceSQLExceptionSubclassFailover=java.sql.SQLTransientConnectionException
    

Хотя перечисленные ранее три условия резервного копирования подходят для большинства ситуаций, если autocommit включено, Connector/J никогда не перебалансирует и продолжает использовать то же физическое соединение. Это может быть проблематично, особенно когда балансирование нагрузки используется для распределения только для чтения нагрузки между несколькими репликами. Однако Connector/J можно настроить на перебалансировку после выполнения определенного количества инструкций, когда autocommit включено. Эта функциональность зависит от следующих свойств:

  • loadBalanceAutoCommitStatementThreshold — определяет количество совпадающих инструкций, которые могут привести к тому, что драйвер потенциально переключит физические соединения серверов. Значение по умолчанию 0 сохраняет поведение, при котором соединения с включенным autocommit никогда не сбалансированы.

  • loadBalanceAutoCommitStatementRegex — регулярное выражение, с которым должны соответствовать инструкции. Значение по умолчанию — пустая строка, соответствует всем инструкциям. Например, использование следующих свойств приведет к тому, что Connector/J будет перебалансироваться после каждой третьей инструкции, содержащей строку «“test”»:

    loadBalanceAutoCommitStatementThreshold=3
    loadBalanceAutoCommitStatementRegex=.*test.*
    

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

Настройка балансирования нагрузки и резервного копирования с помощью DNS SRV

Подробности см. в разделе 6.14 «Поддержка записей DNS SRV».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/connector-j-en/connector-j-usagenotes-j2ee-concepts-load-balancing-failover.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API