すべてのプロダクト
Search
ドキュメントセンター

Hologres:JDBC ベースの負荷分散

最終更新日:Feb 04, 2026

Hologres V1.3 以降では、Java Database Connectivity (JDBC) で複数の読み取り専用セカンダリインスタンスを設定し、シンプルな負荷分散を実装できます。 このトピックでは、JDBC ベースの負荷分散を実装する方法について説明します。

背景情報

Hologres では、1 つのプライマリインスタンスに複数の読み取り専用セカンダリインスタンスをアタッチできます。 インスタンスはストレージを共有しますが、計算リソースは互いに分離されています。 これにより、読み書き分離を備えた高可用性 (HA) デプロイメントが提供されます。 詳細については、「読み書き分離を備えたプライマリインスタンスとセカンダリインスタンス (共有ストレージ)」をご参照ください。

Hologres では、次の図に示すように、JDBC を使用して複数の読み取り専用セカンダリインスタンスを設定し、シンプルな負荷分散を実装できます。image..png

JDBC で複数の読み取り専用セカンダリインスタンスを設定すると、次のことが実現できます。

  • クエリリクエストを読み取り専用セカンダリインスタンスにランダムに分散させ、単一インスタンスへの高負荷を防ぎます。

  • 読み取り専用セカンダリインスタンスに順番に接続し、インスタンス障害発生時のサービス可用性を向上させます。 プロセスは次のとおりです。

    • 読み取り専用セカンダリインスタンス 1 への接続が失敗した場合、JDBC は自動的に読み取り専用セカンダリインスタンス 2 への接続を試みます。

    • 読み取り専用セカンダリインスタンス 1 と読み取り専用セカンダリインスタンス 2 の両方への接続が失敗した場合、JDBC は自動的に読み取り専用セカンダリインスタンス 3 への接続を試みます。

    • 3 つすべてのインスタンスへの接続が失敗した場合にのみ、システムは接続失敗を報告します。

Hologres V2.0.10 以降、targetServerType パラメーターは、より多くの負荷分散シナリオに対応するために、より多くの値をサポートします。

使用上の注意

前提条件

コマンドフォーマット

JDBC で複数の読み取り専用セカンダリインスタンスを設定するには、接続 URL 内で各インスタンスの Endpoint:Port 情報をカンマ (,) で区切ります。 コマンドフォーマットは次のとおりです。

jdbc:postgresql://<Endpoint1>:<Port1>,<Endpoint2>:<Port2>,<Endpoint3>:<Port3>.../<DBNAME>?user=<AccessKey ID>&password=<AccessKey Secret>&targetServerType=any&loadBalanceHosts=<value>[&hostRecheckSeconds=<value>]

パラメーター

パラメーター

説明

エンドポイント

Hologres インスタンスのネットワークアドレス。

Hologres コンソールInstance Detailsページでネットワークアドレスを取得します。

ポート

Hologres インスタンスのポート。

Hologres コンソールInstance Details ページでポートを取得します。

DBNAME

Hologres で作成されたデータベースの名前。

AccessKey ID

ご利用の Alibaba Cloud アカウントの AccessKey ID。

AccessKey 管理 をクリックして AccessKey ID を取得します。

AccessKey Secret

ご利用の Alibaba Cloud アカウントの AccessKey Secret。

AccessKey 管理 をクリックして AccessKey Secret を取得します。

targetServerType

接続が許可されるインスタンスのステータスを指定します。 値 any は、URL 内の任意のエンドポイントに接続できることを示します。

次の値は、Hologres V2.0.10 以降でのみサポートされています。

  • master:プライマリインスタンスにのみ接続します。

  • slave:読み取り専用セカンダリインスタンスにのみ接続します。

  • preferSlave:読み取り専用セカンダリインスタンスに優先的に接続します。 読み取り専用セカンダリインスタンスへの接続が失敗した場合は、プライマリインスタンスに接続します。

JDBC は、in_hot_standby Grand Unified Configuration (GUC) パラメーターの値に基づいて、インスタンスがプライマリインスタンスか読み取り専用セカンダリインスタンスかを判断します。 次の表に、in_hot_standby の値を示します。

  • off:インスタンスはプライマリインスタンスです。

  • on:インスタンスは読み取り専用セカンダリインスタンスです。

loadBalanceHosts

読み取り専用セカンダリインスタンスへの接続を試行する順序を指定します。 有効な値:

  • False (デフォルト):接続 URL にリストされている順序で読み取り専用セカンダリインスタンスに接続します。

  • True:読み取り専用セカンダリインスタンスにランダムに接続します。

hostRecheckSeconds

接続可能なエンドポイントのリストのキャッシュ期間。 デフォルト値は 10s です。

キャッシュ期間を変更する場合は、hostRecheckSeconds パラメーターの値を変更します。 次の例では、キャッシュ期間を 30s に変更します。

jdbc:postgresql://{ENDPOINT1}:{PORT1},{ENDPOINT2}:{PORT2},{ENDPOINT3}:{PORT3}.../{DBNAME}?targetServerType=any&loadBalanceHosts=true&hostRecheckSeconds=30

説明

JDBC の設定の詳細については、JDBC ドキュメントをご参照ください。

  • 次の例では、3 つの読み取り専用セカンダリインスタンスにクエリをランダムに分散させる方法を示します。 1 つのインスタンスへの接続が失敗した場合、JDBC は自動的に別のインスタンスへの接続を試みます。

    import java.sql.*;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Properties;
    
    public class hatest {
        public static void main(String[] args) {
            // Hologres インスタンスの接続エンドポイントを設定します。 これは読み取り専用セカンダリインスタンス 1 です。
            String endpoint1 = "hgpostcn-cn-wxxxxxxxx01-cn-shanghai.hologres.aliyuncs.com:80";
            // Hologres インスタンスの接続エンドポイントを設定します。 これは読み取り専用セカンダリインスタンス 2 です。
            String endpoint2 = "hgpostcn-cn-wxxxxxxxx02-cn-shanghai.hologres.aliyuncs.com:80";
            // Hologres インスタンスの接続エンドポイントを設定します。 これは読み取り専用セカンダリインスタンス 3 です。
            String endpoint3 = "hgpostcn-cn-wxxxxxxxx03-cn-shanghai.hologres.aliyuncs.com:80";      
            // 接続するデータベースの名前を設定します。
            String dbname = "postgres";
            String jdbcUrl = "jdbc:postgresql://" + endpoint1 + "," + endpoint2 + "," + endpoint3 + "/" + dbname;
            Properties properties = new Properties();
            // データベース接続のユーザー名を設定します。
            properties.setProperty("user", "xxxx");
            // データベース接続のパスワードを設定します。
            properties.setProperty("password", "xxxx");
            // targetServerType を設定します。 この例では any に設定されており、任意のエンドポイントにリクエストを送信できることを示します。
            properties.setProperty("targetServerType", "any");
            // LoadBalance ポリシーを設定します。 この例では true に設定されており、負荷分散が有効になっていることを示します。
            properties.setProperty("loadBalanceHosts", "true");
            // hostRecheckSeconds の期間を設定します。 この例では 10 秒に設定されています。
            properties.setProperty("hostRecheckSeconds", "10");
            try {
                Class.forName("org.postgresql.Driver");
                Connection connection = DriverManager.getConnection(jdbcUrl, properties);
                PreparedStatement preparedStatement = connection.prepareStatement("show hg_frontend_endpoints;" );
                ResultSet resultSet = preparedStatement.executeQuery();
                while (resultSet.next()) {
                    ResultSetMetaData rsmd = resultSet.getMetaData();
                    int columnCount = rsmd.getColumnCount();
                    Map map = new HashMap();
                    for (int i = 0; i < columnCount; i++) {
                        map.put(rsmd.getColumnName(i + 1).toLowerCase(), resultSet.getObject(i + 1));
                    }
                    System.out.println(map);
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        }
    }
  • 次の例では、ポーリングを使用して 100 個のクエリを 2 つのインスタンスに分散させる方法を示します。

    import java.sql.*;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Properties;
    
    public class hatest {
        public static void main(String[] args) {
            int x = 1;
            while( x <= 100 ){
                // Hologres インスタンスの接続エンドポイントを設定します。 これはプライマリインスタンスです。
                String endpoint1 = "hgpostcn-cn-wxxxxxxxx04-cn-hangzhou.hologres.aliyuncs.com:80";
                // Hologres インスタンスの接続エンドポイントを設定します。 これは読み取り専用セカンダリインスタンスです。
                String endpoint2 = "hgpostcn-cn-wxxxxxxxx05-cn-hangzhou.hologres.aliyuncs.com:80";
                // 接続するデータベースの名前を設定します。
                String dbname = "postgres";
                String jdbcUrl = "jdbc:postgresql://" + endpoint1 + "," + endpoint2 + "/" + dbname ;
                Properties properties = new Properties();
                // データベース接続のユーザー名を設定します。
                properties.setProperty("user", "xxx");
                // データベース接続のパスワードを設定します。
                properties.setProperty("password", "xxx");
                // targetServerType を設定します。 この例では any に設定されており、任意のエンドポイントにリクエストを送信できることを示します。
                properties.setProperty("targetServerType", "any");
                // LoadBalance ポリシーを設定します。 この例では true に設定されており、負荷分散が有効になっていることを示します。
                properties.setProperty("loadBalanceHosts", "true");
                // hostRecheckSeconds の期間を設定します。 この例では 10 秒に設定されています。
                properties.setProperty("hostRecheckSeconds", "10");
                try {
                    Class.forName("org.postgresql.Driver");
                    Connection connection = DriverManager.getConnection(jdbcUrl, properties);
                    PreparedStatement preparedStatement = connection.prepareStatement("show hg_frontend_endpoints;" );
                    ResultSet resultSet = preparedStatement.executeQuery();
                    while (resultSet.next()) {
                        ResultSetMetaData rsmd = resultSet.getMetaData();
                        int columnCount = rsmd.getColumnCount();
                        Map map = new HashMap();
                        for (int i = 0; i < columnCount; i++) {
                            map.put(rsmd.getColumnName(i + 1).toLowerCase(), resultSet.getObject(i + 1));
                        }
                        System.out.println(map);
                    }
                } catch (Exception exception) {
                    exception.printStackTrace();
                }
                x++;
            }
        }
    }

    この時点で、2 つのインスタンスをモニターすると、両方の接続数がほぼ同じであることがわかります。 インスタンスのモニタリング情報の表示方法の詳細については、「モニタリングメトリックの表示」をご参照ください。

    • インスタンス hgpostcn-cn-wxxxxxxxx04 のモニタリングメトリック。image..png

    • インスタンス hgpostcn-cn-wxxxxxxxx05 のモニタリングメトリック。image..png