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.