このトピックでは、Hologresインスタンスへの接続を管理および診断する方法について説明します。
概要
HologresはPostgreSQLと互換性があり、pg_stat_activityビューをクエリしてHologresインスタンスへの接続に関する情報を取得できます。 これにより、インスタンスへの接続の状態を分析し、SQL実行の診断を実行するのに役立ちます。 詳細については、このトピックのpg_stat_activityビューのクエリをご参照ください。 このトピックには、次のセクションが含まれています。
Hologresインスタンスへのデフォルトの最大接続数をクエリする: Hologresインスタンスへのデフォルトの最大接続数は、インスタンスの仕様によって異なります。 SQLステートメントを実行して、Hologresインスタンスへのデフォルトの最大接続数をクエリできます。
HoloWebコンソールで接続を管理する: HoloWebを使用して、Hologresインスタンスへのアクティブな接続を表示および管理できます。 たとえば、接続を閉じることができます。
SQLステートメントを実行して接続情報をクエリする: インスタンスまたはデータベースへの接続数をクエリしたり、各接続の状態をクエリしたり、アイドル状態の接続を閉じたりできます。 これにより、Hologresインスタンスをより適切に管理するのに役立ちます。
接続を解放する: SQLステートメントを実行して、指定された接続を解放できます。
スーパーユーザー用に接続を予約する: インスタンスへの接続数が上限に達した場合、予約された接続を使用してインスタンスに接続し、スーパーユーザーとしてインスタンスへの接続を管理できます。
単一ユーザーの最大接続数: 単一ユーザーの最大接続数を設定できます。 これにより、ユーザーが過剰な接続によって不要なリソースを占有するのを防ぎます。
アイドル状態の接続を自動的に解放するようにシステムを有効にする: 特定の期間使用されていない接続を解放するために、アイドル状態の接続の自動解放を有効にすることができます。
ベストプラクティス: Hologresが提供するベストプラクティスに基づいて接続を管理できます。
pg_stat_activityビューのクエリ
pg_stat_activityビューを使用して、実行中のSQLクエリを診断し、問題のトラブルシューティングを行うことができます。 Hologresインスタンスへの接続に関する情報とインスタンス内のSQLクエリの 実行情報をクエリするには、次のステートメントを実行します。
select * from pg_stat_activity ;
次の表は、pg_stat_activityビューのクエリ結果のフィールドについて説明しています。
フィールド | 説明 |
datid | Hologresバックエンドで接続されているデータベースのオブジェクト識別子(OID)。 |
datname | Hologresバックエンドで接続されているデータベースの名前。 |
pid | HologresバックエンドのプロセスのID。 |
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、client backend、checkpointer、startup、walreceiver、walsender、walwriterなどがあります。 PQEなどのバックエンド実行コンポーネントもサポートされています。 説明
|
使用上の注意
すべての接続に関する情報を表示できるのはスーパーユーザーのみです。 通常のユーザーは、自分の接続に関する情報のみを表示できます。
Hologresインスタンスへのデフォルトの最大接続数をクエリする
Hologresインスタンスへのデフォルトの最大接続数は、インスタンスの仕様によって異なります。 次のいずれかの方法を使用して、Hologresインスタンスへの許容最大接続数をクエリできます。 2番目の方法では、戻り値は単一のフロントエンド(FE)ノードへのデフォルトの最大接続数です。 最大合計接続数は、単一のFEノードへの最大接続数にFEノードの数を掛けた値に等しくなります。 さまざまなインスタンス仕様のFEノードの最大数については、インスタンス管理をご参照ください。
次のステートメントを実行して、Hologresインスタンスへの許容最大接続数をクエリします。 このステートメントは、Hologres V1.3.23以降でサポートされています。
select instance_max_connections();
次のステートメントを実行して、単一のFEノードへの許容最大接続数をクエリします。 単一のFEノードへの許容最大接続数にFEノードの数を掛けて、Hologresインスタンスへの許容最大接続数を取得できます。
show max_connections;
HoloWebコンソールで接続を管理する
HoloWebを使用して、アクティブな接続を視覚的に表示および管理できます。
HoloWebコンソールにログオンします。 詳細については、HoloWebへの接続をご参照ください。
上部のナビゲーションバーで、[診断と最適化] をクリックします。
左側のナビゲーションペインで、[接続] をクリックします。
[接続] ページで、目的のインスタンスを選択し、接続情報を表示します。
説明すべてのインスタンスの接続に関する情報を表示できるのはスーパーユーザーのみです。 通常のユーザーは、自分のインスタンスの接続に関する情報のみを表示できます。
次の表は、接続情報のパラメータについて説明しています。
パラメータ
説明
インスタンス
Hologresインスタンスの名前。
データベース
Hologresデータベースの名前。 接続を表示するデータベースを選択できます。 このパラメータを指定しない場合、デフォルトですべてのデータベースへの接続が表示されます。
データベース
接続情報が表示されるデータベースの名前。
説明Postgresという名前のデータベースへの接続は、バックエンドで実行されるO&M接続です。 これらの接続は無視できます。
ユーザー名
接続の作成に使用されるユーザーアカウント。
クライアントアドレス
クライアントのIPアドレス。 表示されるIPアドレスは、クライアントの実際のIPアドレスではなく、ルーターの送信IPアドレスである場合があります。
アプリケーション名
インスタンスに接続されているアプリケーションの名前。
状態
接続の状態。 有効な値:
active: 接続はアクティブです。
idle: 接続はアイドル状態です。
idle in transaction: 接続は長時間実行されているトランザクションでアイドル状態です。
idle in transaction (Aborted): 接続は失敗したトランザクションでアイドル状態です。
クエリの開始
クエリの開始時刻。
クエリ
実行されるクエリ。
説明クエリステートメントが長い場合、ステートメントは切り捨てられる場合があります。
PID
クエリのプロセスID(PID)。
操作
Kill: 期待どおりに動作しない1つ以上の接続を直接閉じることができます。
詳細: [詳細] をクリックして、詳細な接続情報を表示できます。
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ビューをクエリすることにより、指定された状態のすべてのJava Database Connectivity(JDBC)またはPostgreSQL接続をクエリすることもできます。
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: この状態は、アクティブなSQLステートメントを追跡する機能がプロセスで無効になっていることを示します。
たとえば、次のステートメントを実行して、現在のインスタンスへのアイドル状態の接続をクエリできます。
select * from pg_stat_activity where backend_type = 'client backend' and state = 'idle';
HoloWebなどのHologresコンポーネントはJDBC接続を使用します。 Hologresインスタンスへの最大接続数がビジネス要件を満たしている場合、これらの接続について心配する必要はありません。 HologresインスタンスへのSQL接続の数が
max_connections
で指定された上限に近づいているか、達している場合は、アプリケーションで接続リークが発生しているかどうかを確認します。 接続リークが発生した場合は、アプリケーションの接続プールに適切な制限を設定するか、アイドル状態の接続を解放します。 アイドル状態の接続を解放する方法の詳細については、このトピックの接続を解放するをご参照ください。各FEノードへの接続数をクエリします。
Hologres V1.3.23以降では、次のステートメントを実行して、Hologresインスタンスの各FEノードへの接続数をクエリできます。 このステートメントは、接続がないFEノードに関する情報は返しません。
select * from hologres.hg_connections;
返された結果のフィールドの説明:
fe_id: FEノードのID。
used_connections: FEノードによって使用されている接続の数。
max_connections: FEノードに許可される最大接続数。 このフィールドの値は、
show max_connections
コマンドの戻り値と同じです。
接続を解放する
次のシナリオでは、HologresインスタンスまたはHologresインスタンスの単一のFEノードへの接続数が上限に達します。
接続数が
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
。
これらのシナリオでは、スーパーユーザーとしてHologresインスタンスに接続し、次のステートメントを実行して、過剰なアイドル状態の接続が存在するかどうかを確認できます。
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>); -- バックエンドプロセスの接続を閉じます。
-- バックエンドプロセスのアイドル状態の接続を閉じて解放します。
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は、Hologresインスタンスのスーパーユーザー用に接続を自動的に予約します。 インスタンスへの予約済み接続の数は、インスタンスの仕様によって異なります。 詳細については、インスタンス管理をご参照ください。 Hologresインスタンスの場合、予約済み接続は、インスタンスへの接続数が上限に達したときにスーパーユーザーが接続を管理するために使用されます。 たとえば、スーパーユーザーはアイドル状態の接続を閉じることができます。 通常のユーザーが使用できる最大接続数は、最大接続数から予約済み接続の数を引いた値です。 通常のユーザーの場合は、スーパーユーザーアカウントを使用してデータベースを管理しないことをお勧めします。 そうしないと、接続が予約されず、接続を解放できません。
単一ユーザーの最大接続数
単一ユーザーの最大接続数を設定する
HologresはPostgreSQLと互換性があり、単一ユーザーの最大接続数を設定できます。 これにより、単一ユーザーが過剰な接続によって過剰なリソースを占有するのを防ぎます。
次のステートメントを実行して、単一ユーザーの単一のFEノードへの最大接続数を設定できます。 インスタンスに複数のノードが含まれている場合、単一ユーザーのインスタンスへの最大接続数は次のように計算されます: 単一のFEノードへの最大接続数 × ノード数
。
構文
ALTER ROLE "Alibaba Cloudアカウント ID" CONNECTION LIMIT <number>;
パラメータ
パラメータ
説明
アカウント ID
管理するアカウントのユーザーID(UID)。 アカウントは、Alibaba CloudアカウントまたはRAMユーザーです。 アカウントがRAMユーザーの場合は、UIDの前にp4_を追加します。
詳細については、概要をご参照ください。
number
最大接続数。
有効な値: [-1, N]。 値 -1 は、単一ユーザーの接続数に制限が課されないことを示します。
例
次の例は、UIDが 283813xxxx のRAMユーザーの最大接続数を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インスタンスへの接続数が上限に近づいているか、達している場合は、接続リークが発生している可能性があります。 アイドル状態の接続の自動解放を有効にして、特定の期間使用されていない接続を解放できます。 接続が指定された期間アイドル状態のままになっている場合、接続は自動的に閉じられます。 SQLステートメントが実行されていない接続は、アイドル状態と見なされます。
制限
Hologres V0.10.25以降では、アイドル状態の接続の自動解放がサポートされています。 HologresインスタンスのバージョンがV0.10.25より前の場合は、HologresコンソールでHologresインスタンスを手動でアップグレードするか、テクニカルサポートのDingTalkグループに参加してください。 HologresコンソールでHologresインスタンスを手動でアップグレードする方法の詳細については、「インスタンスのアップグレード」トピックの手動アップグレードをご参照ください。 Hologres DingTalkグループへの参加方法の詳細については、Hologresのオンラインサポートを受けるをご参照ください。
構文
セッションに対して機能を有効にします。
-- 接続が 600,000 ミリ秒(10分)間アイドル状態の場合、接続は自動的に閉じられます。 SET idle_session_timeout = 600000;
データベースに対して機能を有効にします。
-- 接続が 600,000 ミリ秒(10分)間アイドル状態の場合、接続は自動的に閉じられます。 ALTER DATABASE <db_name> SET idle_session_timeout = 600000;
db_name パラメータは、アイドル状態の接続の自動解放を有効にするデータベースの名前を指定します。
ベストプラクティス
Hologresが提供するベストプラクティスに基づいて接続を管理できます。
スーパーユーザーアカウントを適切に使用します。
スーパーユーザーアカウントを使用してHologresインスタンスを管理したり、アプリケーションに接続したりしないことをお勧めします。 そうしないと、インスタンスへの接続数が上限に達した場合、スーパーユーザーアカウントを使用してインスタンスに接続できなくなります。
スーパーユーザーアカウントをO&Mアカウントとして作成できます。 これにより、インスタンスへの接続数が上限に達した場合、またはクエリが応答を停止した場合、O&Mアカウントを使用してHoloWebコンソールで接続またはクエリを管理できます。
適切な接続プールを設定します。
セキュリティ上の理由から、Hologresはバックエンドで接続を自動的に解放しません。 アプリケーションの接続プールに適切な設定を行うことをお勧めします。 これにより、アイドル状態の接続をタイムリーに解放できます。
オンラインビジネスに影響を与えないように、アイドル状態の接続を定期的に解放することをお勧めします。
FAQ
SQLステートメントを実行すると
terminating connection due to idle state timeout
というエラーメッセージが返された場合はどうすればよいですか?原因: アイドル状態の接続を自動的に解放するためのタイムアウト期間がHologresインスタンスに設定されています。 指定されたタイムアウト期間が経過すると、接続は自動的に閉じられます。 その後、このエラーメッセージが返されます。
解決策: Hologresインスタンスに再度接続するか、アイドル状態の接続を自動的に解放するためのタイムアウト期間を増やします。 タイムアウト期間を増やす方法の詳細については、このトピックのアイドル状態の接続を自動的に解放するようにシステムを有効にするをご参照ください。