文件首頁
MySQL Connector/J 開發者指南
相關文件 下載本手冊
PDF (美式信紙) - 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 的另一個實例,則可以使用 addHost() (在 jconsole 中公開) 來確保 Connector/J 開始使用它。請注意,這些作業可以動態執行,而無需停止正在執行的應用程式。

如需負載平衡和故障轉移組合的詳細資訊,請參閱第 9.5 節,「進階負載平衡和故障轉移配置」

使用 DNS SRV 配置負載平衡

如需詳細資訊,請參閱第 6.14 節,「對 DNS SRV 記錄的支援」