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

Hologres:JDBC ベースの負荷分散

最終更新日:Jan 11, 2025

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

背景情報

Hologres では、プライマリインスタンスに複数の読み取り専用セカンダリインスタンスを関連付けることができます。プライマリインスタンスとセカンダリインスタンスはストレージリソースを共有しますが、コンピューティングリソースは共有しません。これにより、読み取り/書き込み分割に基づいて高可用性インスタンスをデプロイできます。詳細については、「マルチインスタンス高可用性デプロイメントの設定」をご参照ください。

JDBC を使用して、複数の読み取り専用セカンダリインスタンスをプライマリインスタンスに関連付け、シンプルな負荷分散を実装できます。次の図を参照してください。image..png

Hologres は、JDBC を使用して設定された読み取り専用セカンダリインスタンスに関連する以下の機能を提供します。

  • クエリリクエストは、読み取り専用セカンダリインスタンスにランダムに割り当てられます。これにより、セカンダリインスタンスが過負荷になるのを防ぎます。

  • クエリリクエストは、インスタンス障害が発生した場合にサービスが利用できるように、セカンダリインスタンスに順番に割り当てられます。

    • JDBC がセカンダリインスタンス 1 に接続できない場合、JDBC は自動的にセカンダリインスタンス 2 への接続を試みます。

    • JDBC がセカンダリインスタンス 1 と 2 に接続できない場合、JDBC は自動的にセカンダリインスタンス 3 への接続を試みます。

    • JDBC がすべてのセカンダリインスタンスに接続できない場合、システムは接続エラーメッセージを表示します。

Hologres V2.0.10 以降では、targetServerType パラメーターで使用できる値が増えました。これにより、より多くのシナリオで負荷分散を実装できます。

使用上の注意

前提条件

構文

複数の読み取り専用セカンダリインスタンスを設定する場合、JDBC URL にインスタンスの エンドポイント:ポート のペアを設定する必要があります。(カンマ)でエンドポイント:ポートのペアを区切ります。

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

パラメーター

パラメーター

説明

エンドポイント

Hologres インスタンスのエンドポイント。

Hologres インスタンスのエンドポイントは、Hologres コンソール[インスタンスの詳細] ページで取得できます。

ポート

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

Hologres インスタンスのポート番号は、Hologres コンソール[インスタンスの詳細] ページで取得できます。

DBNAME

Hologres データベースの名前。

AccessKey ID

Hologres インスタンスへのアクセスに使用する Alibaba Cloud アカウントの AccessKey ID。

アクセスキーペア ページから AccessKey ID を取得できます。

AccessKey Secret

Hologres インスタンスへのアクセスに使用する Alibaba Cloud アカウントの AccessKey シークレット。

アクセスキーペア ページから AccessKey シークレットを取得できます。

targetServerType

JDBC が接続できるインスタンス。any の値は、JDBC が URL で指定されたエンドポイントを持つ任意のインスタンスに接続できることを示します。

Hologres V2.0.10 以降の有効な値:

  • master: JDBC はプライマリインスタンスにのみ接続できます。

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

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

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

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

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

loadBalanceHosts

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

  • False: JDBC は、URL で指定されたインスタンスエンドポイントと同じ順序で読み取り専用セカンダリインスタンスに接続します。これはデフォルト値です。

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

hostRecheckSeconds

JDBC がエンドポイントリストで指定されたインスタンスに接続するためのキャッシュ時間。デフォルト値は 10 です。単位: 秒。

キャッシュ時間を調整する場合は、hostRecheckSeconds パラメーターの値を変更できます。この例では、キャッシュ時間は 30 に変更されています。

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

説明

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

  • クエリリクエストは 3 つの読み取り専用セカンダリインスタンスにランダムに割り当てられます。接続に失敗した場合、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();
            // データベースへの接続に使用するアカウントの AccessKey ID を指定します。
            properties.setProperty("user", "xxxx");
            // データベースへの接続に使用するアカウントの AccessKey シークレットを指定します。
            properties.setProperty("password", "xxxx");
            // targetServerType を any に設定します。これにより、JDBC は URL で指定されたエンドポイントを持つ任意のインスタンスに接続できます。
            properties.setProperty("targetServerType", "any");
            // loadBalanceHosts を 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();
                // データベースへの接続に使用するアカウントの AccessKey ID を指定します。
                properties.setProperty("user", "xxx");
                // データベースへの接続に使用するアカウントの AccessKey シークレットを指定します。
                properties.setProperty("password", "xxx");
                // targetServerType を any に設定します。これにより、JDBC は URL で指定されたエンドポイントを持つ任意のインスタンスに接続できます。
                properties.setProperty("targetServerType", "any");
                // loadBalanceHosts を 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 つのインスタンスのメトリックデータは、2 つのインスタンスの接続数が基本的に同じであることを示しています。インスタンスのメトリックデータの表示方法の詳細については、「メトリックの表示」をご参照ください。

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

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