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

Hologres:接続の管理

最終更新日:Jan 11, 2025

このトピックでは、Hologresインスタンスへの接続を管理および診断する方法について説明します。

概要

HologresはPostgreSQLと互換性があり、pg_stat_activityビューをクエリしてHologresインスタンスへの接続に関する情報を取得できます。 これにより、インスタンスへの接続の状態を分析し、SQL実行の診断を実行するのに役立ちます。 詳細については、このトピックのpg_stat_activityビューのクエリをご参照ください。 このトピックには、次のセクションが含まれています。

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

クライアント上のアプリケーションのタイプ。

一般的なアプリケーションタイプ:

  • Realtime Compute for Apache Flink(VVRバージョン): {client_version}_ververica-connector-hologres

  • Apache Flink: {client_version}_hologres-connector-flink

  • Hologresからデータを読み取るバッチ同期タスクを実行できるDataWorksデータ統合: datax_{jobId}

  • Hologresにデータを書き込むバッチ同期タスクを実行できるDataWorksデータ統合: {client_version}_datax_{jobId}

  • データベースからHologresにデータをリアルタイムで同期できるDataWorksデータ統合: {client_version}_streamx_{jobId}

  • HoloWeb: holoweb

  • 外部テーブルを使用してHologresにアクセスできるMaxCompute: MaxCompute

  • Holoクライアントによって開始されたHologresバイナリログを読み取るプロセス: holo_client_replication。 このタイプのタスクでは、クエリ内容は表示されません。

  • 他のアプリケーションの場合、アプリケーションがHologresインスタンスに接続されている場合は、接続文字列で application_name フィールドを明示的に指定することをお勧めします。

client_addr

クライアントのIPアドレス。

表示されるIPアドレスは解決済みであり、クライアントの実際のIPアドレスではない場合があります。

client_hostname

クライアントのホスト名。

client_port

クライアントのポート番号。

backend_start

バックエンドプロセスの開始時刻。

xact_start

プロセスの現在のトランザクションの開始時刻。

  • アクティブなトランザクションがない場合は、空の文字列が返されます。

  • 現在のクエリがプロセスの最初のトランザクションにある場合、このフィールドの値は query_start フィールドの値と同じです。

query_start

現在アクティブなクエリの開始時刻。 現在の接続がアクティブでない場合、このフィールドの値は最後のクエリの開始時刻です。

state_change

接続の状態が最後に変更された時刻。

wait_event_type

バックエンドが待機しているイベントのタイプ。 バックエンドがイベントを待機していない場合、このフィールドの値はNULLです。 有効な値:

  • LWLock: バックエンドは軽量ロックを待機しています。

  • Lock: バックエンドは重量ロックを待機しています。 wait_event フィールドは、バックエンドが待機しているロックのタイプを示します。

  • BufferPin: サーバープロセスはデータバッファへのアクセスを待機しており、他のプロセスはデータバッファをチェックしていません。

  • Activity: サーバープロセスはアイドル状態です。 これは、メイン処理ループで実行されるのを待機しているシステムプロセスである可能性があります。

  • Extension: サーバープロセスは拡張モジュール内にあり、実行されるのを待機しています。

  • Client: サーバープロセスはユーザーアプリケーションからのクエリを待機しています。 また、サーバーは、内部処理とは無関係のアクティビティが発生することを期待しています。

  • PC: サーバープロセスは、サーバー上の別のプロセスのアクティビティを待機しています。

  • Timeout: サーバープロセスはタイムアウトを待機しています。

  • IO: サーバープロセスはI/O操作の完了を待機しています。

wait_event

バックエンドが待機しているイベントの名前。 バックエンドがイベントを待機していない場合、このフィールドの値はNULLです。

state

接続の状態。 有効な値:

  • active: 接続はアクティブです。

  • idle: 接続はアイドル状態です。

  • idle in transaction: 接続は長時間実行されているトランザクションでアイドル状態です。

  • idle in transaction (Aborted): 接続は失敗したトランザクションでアイドル状態です。

  • \N: この値は、プロセスがユーザー接続プロセスではないことを示します。 ほとんどの場合、この状態はシステムバックエンドのメンテナンスプロセスに対して返され、無視できます。

backend_xid

Hologresバックエンドのトップレベルトランザクションの識別子。

backend_xmin

バックエンドのxminスコープ。

query

バックエンドで最後に実行されたクエリ。 state フィールドの値が active の場合、実行中のクエリが表示されます。 接続がアクティブでない場合は、最後に実行されたクエリが表示されます。

backend_type

バックエンドのタイプ。 サポートされているタイプには、autovacuum launcher、autovacuum worker、logical replication launcher、logical replication worker、parallel worker、background writer、client backend、checkpointer、startup、walreceiver、walsender、walwriterなどがあります。 PQEなどのバックエンド実行コンポーネントもサポートされています。

説明

client backend タイプに注意してください。 このタイプは、アプリケーション接続のタイプを示します。

使用上の注意

  • すべての接続に関する情報を表示できるのはスーパーユーザーのみです。 通常のユーザーは、自分の接続に関する情報のみを表示できます。

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を使用して、アクティブな接続を視覚的に表示および管理できます。

  1. HoloWebコンソールにログオンします。 詳細については、HoloWebへの接続をご参照ください。

  2. 上部のナビゲーションバーで、[診断と最適化] をクリックします。

  3. 左側のナビゲーションペインで、[接続] をクリックします。

  4. [接続] ページで、目的のインスタンスを選択し、接続情報を表示します。

    説明

    すべてのインスタンスの接続に関する情報を表示できるのはスーパーユーザーのみです。 通常のユーザーは、自分のインスタンスの接続に関する情報のみを表示できます。

    次の表は、接続情報のパラメータについて説明しています。

    パラメータ

    説明

    インスタンス

    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ステートメントを実行して接続情報をクエリできます。

  1. 現在のデータベースへの接続数をクエリします。

    次のいずれかのステートメントを実行して、現在のデータベースへの接続数をクエリできます。 詳細については、このトピックの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;
  2. 各接続の状態をクエリします。

    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 で指定された上限に近づいているか、達している場合は、アプリケーションで接続リークが発生しているかどうかを確認します。 接続リークが発生した場合は、アプリケーションの接続プールに適切な制限を設定するか、アイドル状態の接続を解放します。 アイドル状態の接続を解放する方法の詳細については、このトピックの接続を解放するをご参照ください。

  3. 各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インスタンスに再度接続するか、アイドル状態の接続を自動的に解放するためのタイムアウト期間を増やします。 タイムアウト期間を増やす方法の詳細については、このトピックのアイドル状態の接続を自動的に解放するようにシステムを有効にするをご参照ください。