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
标记启动应用程序,以启用远程管理。然后可以启动 jconsole
。Test
主类将被 jconsole
列出。选择此项,然后单击 。然后,您可以导航到 com.mysql.cj.jdbc.jmx.LoadBalanceConnectionGroupManager
bean。此时,您可以单击各种操作并检查返回的结果。
现在,如果您有另一个运行在端口 3309 上的 MySQL 实例,您可以通过使用 jconsole
中公开的 addHost()
来确保 Connector/J 开始使用它。请注意,这些操作可以在不停止运行的应用程序的情况下动态执行。
有关负载均衡和故障转移组合的更多信息,请参见第 9.5 节,“高级负载均衡和故障转移配置”.
使用 DNS SRV 配置负载均衡
有关详细信息,请参见第 6.14 节,“对 DNS SRV 记录的支持”.