本トピックでは、Hologres インスタンスの接続を診断および管理する方法について説明します。
接続とクエリの管理
Hologres は PostgreSQL と互換性があります。pg_stat_activity ビューをクエリして接続を検査し、その状態を分析し、アクティブな SQL クエリを診断できます。主な管理操作は次のとおりです。
デフォルトの最大接続数のクエリ:インスタンスの仕様によって、デフォルトの接続制限は異なります。コマンドを実行して、お使いのインスタンスの制限を確認できます。
HoloWeb での接続の管理:HoloWeb コンソールでアクティブな接続を表示、管理、終了します。
SQL を使用した接続情報のクエリ:接続数をクエリし、接続状態を確認し、アイドル接続を終了することで、インスタンスをより適切に管理します。
接続の終了:SQL 関数を使用して、特定の接続によって保持されているリソースを解放します。
スーパーユーザー用の予約済み接続:接続数が最大制限に達した場合に、予約済みの接続を管理操作に使用します。
単一ユーザーの接続制限:特定ユーザーの接続制限を設定し、過剰なリソース消費を防ぎます。
アイドル接続の自動終了:指定された期間アイドル状態の接続を自動的に閉じる機能を有効にします。
接続のベストプラクティス:Hologres 接続を効果的に使用するための推奨事項を確認します。
pg_stat_activity ビューのクエリ
pg_stat_activity ビューは、アクティブな SQL タスクの分析とトラブルシューティングに役立つ強力なツールです。次のコマンドを実行して、インスタンスの接続とクエリに関するランタイム情報を表示できます。
select * from pg_stat_activity;次の表に、pg_stat_activity ビューのフィールドを示します。
フィールド | 説明 |
datid | バックエンドが接続されているデータベースのオブジェクト ID (OID)。 |
datname | バックエンドが接続されているデータベースの名前。 |
pid | Hologres バックエンドのプロセス ID (PID)。 |
usesysid | Hologres バックエンドにログインしているユーザーの OID。 |
usename | 現在の接続のユーザー名。 |
application_name | クライアントアプリケーションの種類。 一般的なアプリケーションの種類は次のとおりです。
|
client_addr | クライアントの IP アドレス。 表示される IP アドレスは解決済みのアドレスであり、元のソース IP ではない場合があります。 |
client_hostname | クライアントのホスト名。 |
client_port | クライアントのポート。 |
backend_start | バックエンドプロセスが開始された時刻。 |
xact_start | プロセスの現在のトランザクションの開始時刻。
|
query_start | 現在アクティブなクエリの開始時刻。接続状態が |
state_change | 接続の状態が最後に変更された時刻。 |
wait_event_type | バックエンドが待機しているイベントの種類、または待機していない場合は NULL。指定できる値は次のとおりです。
|
wait_event | バックエンドが現在待機している場合の待機イベントの名前、それ以外の場合は NULL。 |
state | 現在の接続状態。一般的な状態は次のとおりです。
|
backend_xid | Hologres バックエンドのトップレベルのトランザクション識別子。 |
backend_xmin | 現在のバックエンドの xmin ホライズン。 |
query | バックエンドで最後に実行されたクエリ。 state が |
backend_type | 現在のバックエンドの種類。指定できる種類には、autovacuum launcher、autovacuum worker、logical replication launcher、logical replication worker、parallel worker、background writer、クライアントバックエンド、checkpointer、startup、walreceiver、walsender、walwriter があります。これには、PQE などのバックエンド実行コンポーネントも含まれます。 説明 アプリケーションの接続を表す |
使用方法
スーパーユーザーのみがすべての接続情報を表示できます。標準ユーザーは自身の接続のみを表示できます。
デフォルトの最大接続数
デフォルトの接続制限は、インスタンスの仕様によって異なります。次のコマンドを実行して、最大接続制限をクエリできます。このコマンドは、単一の FE ノードの制限を返します。インスタンスの総接続制限は、この値に FE ノードの数を掛けたものです。各インスタンスの FE ノード数については、「インスタンス管理」をご参照ください。
インスタンス全体の最大接続数をクエリします。このコマンドは Hologres V1.3.23 以降でサポートされています。
select instance_max_connections();単一の FE ノードの最大接続数をクエリします。インスタンスの総接続制限は、FE ノードの数にこの値を掛けたものです。
show max_connections;
HoloWeb での接続の管理
HoloWeb コンソールでアクティブな接続を表示および管理できます。
HoloWeb コンソールにログインします。詳細については、「HoloWeb への接続と SQL クエリの実行」をご参照ください。
上部メニューで、Diagnostics and Optimization をクリックします。
左側のナビゲーションペインで、Connections をクリックします。
Connections ページでは、フィルターを使用して接続を検索し、結果の一覧で詳細情報を確認できます。
説明スーパーユーザーアカウントのみがすべての接続情報を表示できます。標準ユーザーは自身の接続のみを表示できます。
次の表でパラメーターについて説明します。
Parameter
Description
Instance name
The name of the Hologres instance.
Database
The name of the Hologres database. You can select a specific database. If you leave this blank, connections to all databases are displayed.
Database
The name of the connected database.
説明If the database name is Postgres, it indicates a backend maintenance connection, which can be ignored.
User Name
The user account for the connection.
Client Address
This may be a routed outbound IP address, not the original source IP.
Application Name
The name of the application that created the connection.
State
The state of the connection. Common states include:
active: The connection is active.
idle: The connection is idle.
idle in transaction: The connection is idle within a long-running transaction.
idle in transaction (Aborted): The connection is idle within a failed transaction.
Query Start
The start time of the query.
Query
The executed query.
説明Long queries might be truncated.
PID
The process ID (PID) of the query.
Operation
Kill: Terminate unexpected connections individually or in batches.
Details: Click to view detailed information about the connection.
SQL を使用した接続情報のクエリ
SQL を使用して接続情報をクエリする場合は、次の操作を実行できます。
現在のデータベースへの接続数をクエリします。
次のコマンドを実行して、現在のデータベースへの接続数を表示できます。フィールドの詳細については、「pg_stat_activity ビューのクエリ」をご参照ください。
Hologres V1.1 以降の場合:
SELECT datname::TEXT ,COUNT(1) AS COUNT FROM pg_stat_activity WHERE backend_type = 'client backend' AND application_name != 'hologres' GROUP BY datname::TEXT;Hologres V0.10 以前の場合:
SELECT datname ,COUNT(1) AS COUNT FROM pg_stat_activity WHERE backend_type = 'client backend' AND application_name != 'hologres' GROUP BY datname;
各接続の状態を表示します。
Hologres コンソールの HoloWeb を使用して各インスタンスの接続状態を表示するか、次のステートメントを実行して pg_stat_activity ビューをクエリし、すべての JDBC または PSQL 接続の状態を取得できます。
select * from pg_stat_activity where backend_type = 'client backend' and state = '<statename>';<statename>を次のいずれかの状態パラメーターに置き換えます。idle:アイドル接続。プロセスは新しいクライアントコマンドを待機しています。
active:アクティブな接続。プロセスはクエリを実行しています。idle in transaction:プロセスはトランザクション中にありますが、現在クエリを実行していません (トランザクション中のアイドル)。idle in transaction (aborted):プロセスは失敗したトランザクション中にあり、現在クエリを実行していません (失敗したトランザクション中のアイドル)。fastpath function call:プロセスが
fast-path関数を実行していることを示します。disabled:プロセスの
track activitiesが無効になっていることを示します。
たとえば、次のコマンドを実行して、現在のインスタンスのアイドル接続をクエリできます。
select * from pg_stat_activity where backend_type = 'client backend' and state = 'idle';Holoweb などの Hologres の周辺コンポーネントは JDBC を使用し、一定数の接続を消費します。十分な数の接続がある場合は、この使用状況について心配する必要はありません。SQL 接続数が常に
max_connectionsに近づくか達する場合、アプリケーションに接続リークがないか確認し、適切な接続プールサイズを設定する必要があります。または、次のセクションで説明するようにアイドル接続を解放することもできます。詳細については、「接続の終了」をご参照ください。各アクセスノードの接続数を表示する
インスタンスの各 FE ノードの現在の接続数をクエリできます。この機能は Hologres V1.3.23 以降でサポートされています。アクティブな接続がない FE ノードは、クエリ結果に表示されません。
select * from hologres.hg_connections;次の表に、クエリ結果のフィールドを示します。
fe_id:FE ノードの ID。used_connections:FE ノードで現在使用中の接続数。max_connections:FE ノードの最大接続数。
show max_connectionsコマンドの戻り値と同じです。
接続の終了
次の条件は、システムまたは特定のアクセスノードの接続制限に達したことを示します。
接続数が
max_connectionsの値に達したか超えた場合、Hologres コンソールの [監視とアラーム] ページで接続数を確認できます。FATAL: sorry, too many clients already connection limit exceeded for superusersエラーが発生します。FATAL: remaining connection slots are reserved for non-replication superuser connectionsエラーが報告されます。
これらの問題が発生した場合は、スーパーユーザーアカウントでインスタンスに接続し、次のステートメントを実行して、アイドル接続が過剰でないか確認します。
select * from pg_stat_activity where backend_type = 'client backend' and state = 'idle';クエリ結果に不要なアイドルプロセスが過剰に表示される場合は、結果から pid を見つけ、次のステートメントを実行してアイドル接続を解放します。フィールドの詳細については、「pg_stat_activity ビューのクエリ」をご参照ください。
select pg_cancel_backend(<pid>); -- 接続中のクエリをキャンセルします。
select pg_terminate_backend(<pid>); -- 対応するバックエンド接続プロセスを終了します。
-- バックエンドの IDLE 接続プロセスを一括で終了して、接続を解放します。
SELECT pg_terminate_backend(pid)
,query
,datname
,usename
,application_name
,client_addr
,client_port
,backend_start
,state
FROM pg_stat_activity
WHERE length(query) > 0
AND pid != pg_backend_pid()
AND backend_type = 'client backend'
AND state = 'idle'
AND application_name != 'hologres'
AND query not like '%pg_cancel_backend%';スーパーユーザー用の予約済み接続
Hologres は、スーパーユーザー用に多数の接続を予約しています。予約される接続の数はインスタンスの仕様によって異なります。詳細については、「インスタンス管理」をご参照ください。これらの予約済み接続は、最大接続制限に達したときにアイドル接続を終了するなど、管理タスク用です。標準ユーザーが利用できる最大接続数は、max_connections から予約済み接続の数を引いたものです。通常のデータベース操作にスーパーユーザーアカウントを使用しないことを推奨します。これにより、利用可能なすべての接続が枯渇し、管理チャネルを使用してそれらを解放できなくなる可能性があります。
ユーザーの接続制限
ユーザー接続制限の設定
特定ユーザーの接続制限を設定して、接続を過剰に消費してリソースを浪費するのを防ぐことができます。
次のステートメントを実行して、単一の FE ノード上の単一ユーザーの最大接続数を制限します。インスタンスに複数のノードがある場合、ユーザーの総接続制限は (ノードごとの接続数) * (ノード数) です。
構文
ALTER ROLE "Alibaba Cloud アカウント ID" CONNECTION LIMIT <number>;パラメーター
パラメーター
説明
Alibaba Cloud アカウント ID
制限するアカウントの ID。 RAM ユーザーの場合、アカウント UID の前に
p4_を付けます。アカウントの詳細については、「アカウントの概要」をご参照ください。
number
接続制限。
値は [-1, N] の範囲内である必要があります。値 -1 は、ユーザーの接続制限を削除します。
例
次の例では、RAM ユーザー
283813xxxxをノードあたり最大 1 接続に制限します。ALTER ROLE "p4_283813xxxx" CONNECTION LIMIT 1;
ユーザー接続制限の表示
次のステートメントを実行して、インスタンスユーザーに現在設定されているノードごとの接続制限を表示します。
SELECT rolname, rolconnlimit
FROM pg_roles
WHERE rolconnlimit <> -1;クエリ結果の例:
rolname | rolconnlimit
---------------+--------------
p4_283813xxxx | 1
(1 row)アイドル接続の自動終了
インスタンスへの接続数が常に上限に近い場合、アプリケーションに接続リークがある可能性があります。アイドル接続の自動終了を有効にして、リソースを解放できます。接続が指定された時間より長くアイドル状態になると、自動的に切断されます。
制限事項
アイドル接続の自動終了は、Hologres V0.10.25 以降でのみサポートされています。インスタンスがそれより前のバージョンを実行している場合は、「アップグレード中に発生する一般的なエラー」をご参照いただくか、Hologres DingTalk グループに参加してインスタンスのアップグレードをリクエストしてください。オンラインサポート用の DingTalk グループへの参加方法については、「オンラインサポートをさらに受けるにはどうすればよいですか?」をご参照ください。
構文
セッションレベル
-- 接続が 10 分間 (600,000 ミリ秒) アイドル状態であった場合に、自動的に切断します。 SET idle_session_timeout = 600000;データベースレベル
-- このデータベースへの接続が 10 分間 (600,000 ミリ秒) アイドル状態であった場合に、自動的に切断します。 ALTER DATABASE <db_name> SET idle_session_timeout = 600000;<db_name>を、アイドル接続の自動終了を有効にするデータベースの名前に置き換えます。
接続のベストプラクティス
Hologres 接続を利用する際のベストプラクティスに従ってください。
スーパーユーザーアカウントを賢く使用する
アプリケーションの接続や通常のインスタンス操作にスーパーユーザーアカウントを使用しないでください。接続数がインスタンスの制限を超えた場合、スーパーユーザーアカウントでさえ接続できなくなる可能性があります。
操作用に専用のスーパーユーザーアカウントを作成することを推奨します。このアカウントを使用して HoloWeb にログインし、接続制限に達した場合やクエリがハングした場合などの緊急時に、接続とクエリを管理できます。
適切な接続プールを設定する
デフォルトでは、Hologres はビジネスの安定性を確保するためにアイドル接続を自動的に終了しません。アプリケーションで堅牢な接続プールを使用して、アイドル接続を速やかに解放することを推奨します。
アイドル接続がリソースを過剰に消費し、オンラインサービスに影響を与えるのを防ぐために、定期的にアイドル接続をクリーンアップします。
よくあるエラー
SQL 実行中にエラーメッセージが返されます:
terminating connection due to idle state timeout。原因:設定されたアイドルタイムアウトを超えたため、接続が自動的に終了されました。
解決策:インスタンスに再接続するか、アイドル接続のタイムアウトを増やします。アイドル接続のタイムアウトを変更する方法については、「アイドル接続の自動終了」をご参照ください。