長期以來,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 的另一個實例,則可以使用 addHost()
(在 jconsole
中公開) 來確保 Connector/J 開始使用它。請注意,這些作業可以動態執行,而無需停止正在執行的應用程式。
如需負載平衡和故障轉移組合的詳細資訊,請參閱第 9.5 節,「進階負載平衡和故障轉移配置」。
使用 DNS SRV 配置負載平衡
如需詳細資訊,請參閱第 6.14 節,「對 DNS SRV 記錄的支援」。