Spec-Zone.ru › MySQL Connectors 1.0

9.3 Настройка балансировки нагрузки с Connector/J

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

Балансировка нагрузки настраивается на начальном этапе настройки подключения к серверу с помощью следующего URL-адреса подключения, имеющего аналогичный формат, что и общий URL-адрес JDBC для подключения к MySQL, но со специализированной схемой:

jdbc:mysql:loadbalance://[host1][:port],[host2][:port][,[host3][:port]]...[/[database]] »
[?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]

Существует две конфигурационные свойства, связанные с этой функциональностью:

  • loadBalanceConnectionGroup – Это обеспечивает возможность группировать подключения из разных источников. Это позволяет управлять этими JDBC источниками в одном загрузчике классов в любом выбранном вами сочетании. Если они используют одну и ту же конфигурацию и вы хотите управлять ими как одной логической группой, присвойте им одно и то же имя. Это ключевое свойство для управления: если вы не определите имя (строку) для loadBalanceConnectionGroup, вы не сможете управлять подключениями. Все подключенные к балансировке нагрузки, разделяющие одно и то же значение loadBalanceConnectionGroup, независимо от того, как приложение их создает, будут управляться вместе.

  • ha.enableJMX – Возможность управления подключениями появляется при определении loadBalanceConnectionGroup; но если вы хотите управлять этим внешне, включите JMX, установив это свойство в true. Это активирует реализацию JMX, которая предоставляет операции управления и мониторинга группы подключений. Кроме того, запустите приложение со флагом JVM -Dcom.sun.management.jmxremote. После этого вы сможете выполнить подключение и операции с помощью клиента JMX, такого как jconsole.

После установления подключения с помощью правильных свойств подключения доступно несколько свойств мониторинга:

  • Текущее количество активных хостов.

  • Текущее количество активных физических подключений.

  • Текущее количество активных логических подключений.

  • Общее количество созданных логических подключений.

  • Общее количество транзакций.

Также можно выполнить следующие операции управления:

  • Добавить хост.

  • Удалить хост.

Интерфейс JMX, com.mysql.cj.jdbc.jmx.LoadBalanceConnectionGroupManagerMBean, имеет следующие методы:

  • int getActiveHostCount(String group);

  • int getTotalHostCount(String group);

  • long getTotalLogicalConnectionCount(String group);

  • long getActiveLogicalConnectionCount(String group);

  • long getActivePhysicalConnectionCount(String group);

  • long getTotalPhysicalConnectionCount(String group);

  • long getTotalTransactionCount(String group);

  • void removeHost(String group, String host) throws SQLException;

  • void stopNewConnectionsToHost(String group, String host) throws SQLException;

  • void addHost(String group, String host, boolean forExisting);

  • String getActiveHostsList(String group);

  • String getRegisteredConnectionGroups();

Метод getRegisteredConnectionGroups() возвращает имена всех групп подключений, определенных в этом загрузчике классов.

Вы можете протестировать эту настройку с помощью следующего кода:

public class Test {

    private static String URL = "jdbc:mysql:loadbalance://" +
        "localhost:3306,localhost:3310/test?" +
        "loadBalanceConnectionGroup=first&ha.enableJMX=true";

    public static void main(String[] args) throws Exception {
        new Thread(new Repeater()).start();
        new Thread(new Repeater()).start();
        new Thread(new Repeater()).start();
    }

    static Connection getNewConnection() throws SQLException, ClassNotFoundException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        return DriverManager.getConnection(URL, "root", "");
    }

    static void executeSimpleTransaction(Connection c, int conn, int trans){
        try {
            c.setAutoCommit(false);
            Statement s = c.createStatement();
            s.executeQuery("SELECT SLEEP(1) /* Connection: " + conn + ", transaction: " + trans + " */");
            c.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static class Repeater implements Runnable {
        public void run() {
            for(int i=0; i < 100; i++){
                try {
                    Connection c = getNewConnection();
                    for(int j=0; j < 10; j++){
                        executeSimpleTransaction(c, i, j);
                        Thread.sleep(Math.round(100 * Math.random()));
                    }
                    c.close();
                    Thread.sleep(100);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

После компиляции приложение можно запустить со флагом -Dcom.sun.management.jmxremote для включения удаленного управления. Затем можно запустить jconsole. Главный класс Test будет отображаться в jconsole. Выберите его и нажмите Подключиться. Затем вы сможете перейти к бину com.mysql.cj.jdbc.jmx.LoadBalanceConnectionGroupManager. В этот момент вы можете щелкнуть по различным операциям и изучить возвращаемый результат.

Если у вас теперь есть дополнительный экземпляр MySQL, работающий на порту 3309, вы можете убедиться, что Connector/J начнет его использовать, используя addHost(), который доступен в jconsole. Обратите внимание, что эти операции можно выполнять динамически, не останавливая работающее приложение.

Дополнительную информацию о сочетании балансировки нагрузки и отключения см. в разделе 9.5 «Расширенная настройка балансировки нагрузки и отключения».

Настройка балансировки нагрузки с помощью 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-managing-load-balanced-connections.html

Spec-Zone.ru

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