Hologres V1.3 以降では、Java Database Connectivity (JDBC) で複数の読み取り専用セカンダリインスタンスを設定し、シンプルな負荷分散を実装できます。 このトピックでは、JDBC ベースの負荷分散を実装する方法について説明します。
背景情報
Hologres では、1 つのプライマリインスタンスに複数の読み取り専用セカンダリインスタンスをアタッチできます。 インスタンスはストレージを共有しますが、計算リソースは互いに分離されています。 これにより、読み書き分離を備えた高可用性 (HA) デプロイメントが提供されます。 詳細については、「読み書き分離を備えたプライマリインスタンスとセカンダリインスタンス (共有ストレージ)」をご参照ください。
Hologres では、次の図に示すように、JDBC を使用して複数の読み取り専用セカンダリインスタンスを設定し、シンプルな負荷分散を実装できます。
JDBC で複数の読み取り専用セカンダリインスタンスを設定すると、次のことが実現できます。
-
クエリリクエストを読み取り専用セカンダリインスタンスにランダムに分散させ、単一インスタンスへの高負荷を防ぎます。
-
読み取り専用セカンダリインスタンスに順番に接続し、インスタンス障害発生時のサービス可用性を向上させます。 プロセスは次のとおりです。
-
読み取り専用セカンダリインスタンス 1 への接続が失敗した場合、JDBC は自動的に読み取り専用セカンダリインスタンス 2 への接続を試みます。
-
読み取り専用セカンダリインスタンス 1 と読み取り専用セカンダリインスタンス 2 の両方への接続が失敗した場合、JDBC は自動的に読み取り専用セカンダリインスタンス 3 への接続を試みます。
-
3 つすべてのインスタンスへの接続が失敗した場合にのみ、システムは接続失敗を報告します。
-
Hologres V2.0.10 以降、targetServerType パラメーターは、より多くの負荷分散シナリオに対応するために、より多くの値をサポートします。
使用上の注意
前提条件
-
複数の Hologres 読み取り専用セカンダリインスタンスを購入し、Hologres プライマリインスタンスにアタッチ済みであること。 詳細については、「共有ストレージを使用するプライマリインスタンスとセカンダリインスタンスの設定」をご参照ください。
-
PostgreSQL JDBC ドライバーのバージョン 42.3.2 以降をダウンロード済みであること。 詳細については、「JDBC」をご参照ください。
コマンドフォーマット
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 |
接続が許可されるインスタンスのステータスを指定します。 値 次の値は、Hologres V2.0.10 以降でのみサポートされています。
JDBC は、
|
loadBalanceHosts |
読み取り専用セカンダリインスタンスへの接続を試行する順序を指定します。 有効な値:
|
hostRecheckSeconds |
接続可能なエンドポイントのリストのキャッシュ期間。 デフォルト値は キャッシュ期間を変更する場合は、
|
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 のモニタリングメトリック。

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

-