Hologres V1.3 以降では、Java Database Connectivity(JDBC)を使用して複数の読み取り専用セカンダリインスタンスを設定し、シンプルな負荷分散を実装できます。このトピックでは、JDBC を使用して負荷分散を実装する方法について説明します。
背景情報
Hologres では、プライマリインスタンスに複数の読み取り専用セカンダリインスタンスを関連付けることができます。プライマリインスタンスとセカンダリインスタンスはストレージリソースを共有しますが、コンピューティングリソースは共有しません。これにより、読み取り/書き込み分割に基づいて高可用性インスタンスをデプロイできます。詳細については、「マルチインスタンス高可用性デプロイメントの設定」をご参照ください。
JDBC を使用して、複数の読み取り専用セカンダリインスタンスをプライマリインスタンスに関連付け、シンプルな負荷分散を実装できます。次の図を参照してください。
Hologres は、JDBC を使用して設定された読み取り専用セカンダリインスタンスに関連する以下の機能を提供します。
クエリリクエストは、読み取り専用セカンダリインスタンスにランダムに割り当てられます。これにより、セカンダリインスタンスが過負荷になるのを防ぎます。
クエリリクエストは、インスタンス障害が発生した場合にサービスが利用できるように、セカンダリインスタンスに順番に割り当てられます。
JDBC がセカンダリインスタンス 1 に接続できない場合、JDBC は自動的にセカンダリインスタンス 2 への接続を試みます。
JDBC がセカンダリインスタンス 1 と 2 に接続できない場合、JDBC は自動的にセカンダリインスタンス 3 への接続を試みます。
JDBC がすべてのセカンダリインスタンスに接続できない場合、システムは接続エラーメッセージを表示します。
Hologres V2.0.10 以降では、targetServerType パラメーターで使用できる値が増えました。これにより、より多くのシナリオで負荷分散を実装できます。
使用上の注意
前提条件
複数の Hologres 読み取り専用セカンダリインスタンスを購入し、Hologres プライマリインスタンスにバインドしています。詳細については、「マルチインスタンス高可用性デプロイメントの設定」をご参照ください。
V42.3.2 以降のバージョンの PostgreSQL JDBC ドライバーがダウンロードされています。詳細については、「JDBC を使用して Hologres に接続する」をご参照ください。
構文
複数の読み取り専用セカンダリインスタンスを設定する場合、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 が接続できるインスタンス。 Hologres V2.0.10 以降の有効な値:
JDBC は、Grand Unified Configuration(GUC)パラメーター
|
loadBalanceHosts | JDBC が読み取り専用セカンダリインスタンスへの接続を試行する順序。有効な値:
|
hostRecheckSeconds | JDBC がエンドポイントリストで指定されたインスタンスに接続するためのキャッシュ時間。デフォルト値は キャッシュ時間を調整する場合は、 |
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 のメトリック

インスタンス hgpostcn-cn-wxxxxxxxx05 のメトリック
