文档首页
MySQL Connector/J 开发人员指南
相关文档 下载本手册
PDF (US Ltr) - 1.2Mb
PDF (A4) - 1.2Mb


MySQL Connector/J 开发人员指南  /  多主机连接  /  使用 Connector/J 配置负载均衡

9.3 使用 Connector/J 配置负载均衡

Connector/J 长期以来一直提供了一种有效的方法,可以将读/写负载分配到多个 MySQL 服务器实例,用于集群或源源复制部署。您可以动态配置负载均衡连接,无需服务中断。进程内事务不会丢失,并且如果任何应用程序尝试使用该特定服务器实例,则不会生成任何应用程序异常。

负载均衡在服务器连接的初始设置阶段通过以下连接 URL 配置,该 URL 的格式与MySQL 连接的通用 JDBC URL类似,但使用了一个专门的方案

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

此功能有两个相关的配置属性

  • loadBalanceConnectionGroup – 这提供了对来自不同源的连接进行分组的能力。这使您能够以任何您选择的组合在单个类加载器中管理这些 JDBC 源。如果它们使用相同的配置,并且您希望将其作为逻辑单组进行管理,请为它们指定相同的名称。这是管理的关键属性:如果您未为 loadBalanceConnectionGroup 定义名称(字符串),则无法管理连接。所有共享相同 loadBalanceConnectionGroup 值的负载均衡连接(无论应用程序如何创建它们)都将一起管理。

  • ha.enableJMX – 当您定义 loadBalanceConnectionGroup 时,将提供对连接进行管理的能力;但如果您希望在外部进行管理,请通过将此属性设置为 true 来启用 JMX。这将启用 JMX 实现,该实现公开连接组的管理和监控操作。此外,使用 -Dcom.sun.management.jmxremote JVM 标记启动您的应用程序。然后,您可以使用 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 标记启动应用程序,以启用远程管理。然后可以启动 jconsoleTest 主类将被 jconsole 列出。选择此项,然后单击 连接。然后,您可以导航到 com.mysql.cj.jdbc.jmx.LoadBalanceConnectionGroupManager bean。此时,您可以单击各种操作并检查返回的结果。

现在,如果您有另一个运行在端口 3309 上的 MySQL 实例,您可以通过使用 jconsole 中公开的 addHost() 来确保 Connector/J 开始使用它。请注意,这些操作可以在不停止运行的应用程序的情况下动态执行。

有关负载均衡和故障转移组合的更多信息,请参见第 9.5 节,“高级负载均衡和故障转移配置”.

使用 DNS SRV 配置负载均衡

有关详细信息,请参见第 6.14 节,“对 DNS SRV 记录的支持”.