読み取りプールクエリのトラブルシューティング

このページでは、AlloyDB for PostgreSQL が読み取りプール インスタンスに送信するクエリを調査およびデバッグするための手法について説明します。

  • 読み取りプールの構成ノード(IP アドレスを含む)の詳細なリストが表示されます。
  • デバッグ目的でノードに直接接続する。
  • AlloyDB ログを調べて、読み取りプールに送信されたクエリを処理している特定のノードを特定します。
  • 特定の読み取りプールノードからのすべての最近のアクティビティのログをクエリする。
  • 読み取りプールノードに関連付けられた Google Cloud 指標を表示する。

これらの手法を組み合わせて使用すると、読み取りプールに診断とデバッグ用のアクセス権を付与できます。たとえば、長時間実行クエリの処理中にクラスタの読み取りプールのいずれかが異常な量の CPU を使用している場合、これらの手法を使用して、そのクエリを処理しているノードを特定し、そのノードに直接接続してクエリをさらに調査または終了できます。

読み取りプールのノードの詳細を一覧表示する

AlloyDB の通常の使用では、読み取りプールを構成するノードの ID やアドレスを知る必要はありません。ただし、必要に応じて、読み取りプール インスタンスのノードのリストを確認できます。リストに表示される各ノードには、その後の診断とデバッグに役立つ次の情報が含まれます。

読み取りプールのノードの内部 ID 文字列と IP アドレスを表示するには、インスタンスの詳細を表示するgcloud 固有の手順に沿って操作しますが、--view=FULL コマンドライン 引数を追加します。

gcloud

gcloud alloydb instances describe READ_POOL_ID \
 --region=REGION_ID \
 --cluster=CLUSTER_ID \
 --project=PROJECT_ID \
 --view=FULL

次のように置き換えます。

  • READ_POOL_ID: 読み取りプールの ID。
  • REGION_ID: インスタンスのリージョン ID。
  • CLUSTER_ID: インスタンスのクラスタの ID。
  • PROJECT_ID: インスタンスのプロジェクトの ID。

出力には、次のような nodes というラベルのセクションが含まれます。

nodes:
- id: READ_POOL_INSTANCE_ID-edd4f6ed-hcfh
  ip: 10.90.80.57
  state: HEALTHY
  zoneId: us-central1-b
- id: READ_POOL_INSTANCE_ID-edd4f6ed-ldbm
  ip: 10.90.80.56
  state: HEALTHY
  zoneId: us-central1-c

各エントリの id フィールドと ip フィールドは、このページで説明する他の手法に特に関連しています。

  • ip フィールドには、クラスタの VPC 内のノードの IP アドレスが表示されます。

  • id フィールドには、ノードの完全な Google Cloud ID 文字列が含まれます。この文字列の最後の 4 文字のみが、ノードのログに記録されます。

    たとえば、前のサンプル出力の 2 つのノードの最初のノードを含むログエントリを検索するには、ID 文字列 hcfh を使用してログをクエリします。

ノードに直接接続する

ノードの IP アドレスがわかれば、その PostgreSQL サーバーに直接接続できます。たとえば、psql を使用してクラスタの VPC 内の VM に接続するには、psql クライアントを実行するの手順に沿って操作します。その場合は、リードプール インスタンスの IP アドレスではなく、ノードの IP アドレスを指定します。

psql -h NODE_IP_ADDRESS -U USERNAME

ログでノードのアクティビティを確認する

AlloyDB では、読み取りプールで処理されたクエリに関するログエントリにノード ID が含まれます。一般的に、検出された ID は次の 2 つの方法で使用できます。

  • ノードに接続できるように、そのノードの IP を特定します。
  • ログクエリをさらに実行して、ノードの最近のアクティビティの詳細を確認します。

既知のクエリを処理しているノードを特定する

特定の読み取りプールが長時間実行クエリを処理していることがわかっている場合は、ログ エクスプローラを使用して、そのクエリを処理している特定ノードの ID を特定できます。

この手法は、pgAudit 拡張機能を有効にしている読み取りプール インスタンスでのみ機能します。

  1. ログ エクスプローラに移動します。

    [ログ エクスプローラ] に移動

  2. クエリビルダーで、resource.labels.instance_id="READ_POOL_ID" をクエリエディタ フィールドに追加し、READ_POOL_ID は読み取りプール インスタンスの名前に置き換えます。

  3. 調査対象の SQL ステートメントを、すべてまたは一部、クエリエディタ フィールドに追加します。例: select id from MyTableこの入力では大文字と小文字は区別されません。

  4. [クエリを実行] をクリックします。

  5. ログ エクスプローラのコントロールを使用して、必要に応じてクエリをチューニングして再実行し、結果を最も関連性の高いものに絞り込みます。

  6. 結果リストでログエントリをクリックして、表示を展開します。

  7. エントリの展開表示で labels フィールドをクリックします。

  8. labels の下にある NODE_ID の値をメモします。

結果は、クエリを処理するノードの 4 文字の ID です。

ログエントリに記載されているノードに接続する

ログに記録されたアクティビティに基づいて特定のノードの PostgreSQL サーバーに直接接続する場合は、次の操作を行います。

  1. ログに記録されたノードの 4 文字の ID 文字列をメモします。この ID は、ログエントリの NODE_ID フィールドで確認できます。

  2. 読み取りプールのノードを一覧表示します。

  3. そのリストで、最初の手順でメモした 4 文字で終わる ID 文字列を持つノードを探します。リスト内のノードが一致しない場合があります。

  4. 一致するノードが見つかれば、一致する IP アドレスを使用して、そのノードの PostgreSQL サーバーに接続します。

    前述の手順でリストされた読み取りプールのノードに、ログに記録されたノードと一致する ID がない場合、読み取りプールは元のログエントリから経過した時間内にそのノードを廃止しています。これは、ノードのエフェメラル性に関する注意事項で説明されているように、AlloyDB 読み取りプールでは正常な動作です。この場合、そのノードに直接接続することはできません。

ノードの PostgreSQL サーバーに接続したら、pg_stat_activity などの標準の PostgreSQL モニタリング手法を使用して、ノードの現在のプロセスをさらに調査し、必要に応じて調整できます。

ノードのログエントリをさらに表示する

特定の ID を持つノードの最近のログに記録されたアクティビティを表示するには:

  1. ログ エクスプローラに移動します。

    [ログ エクスプローラ] に移動

  2. ログ エクスプローラのクエリビルダーlabels.NODE_ID=NODE_ID を追加し、NODE_ID をノードの 4 文字の ID 文字列に置き換えます。

  3. [クエリを実行] をクリックして、選択した期間内のそのノードからのすべてのアクティビティを表示するか、クエリを調整してさらにフィルタします。

  4. 必要に応じて前の手順を繰り返し、検索を絞り込みます。

ノードの指標をモニタリングする

個々のノードに関連付けられた指標は、AlloyDB システム分析情報ダッシュボードで確認できます。使用可能なノード指標の詳細については、システム分析指標リファレンスをご覧ください。

特定の読み取りプール インスタンスに関連付けられているノード ID を確認するには、読み取りプールのノードの詳細を一覧表示するをご覧ください。

これらの AlloyDB 指標とその他の指標の完全なリファレンス ドキュメントについては、Google Cloud の指標の alloydb をご覧ください。

ノードのエフェメラル性に関する注意事項

一時的な調査やデバッグのためにノードに安全に接続できますが、読み取りプールを使用するアプリケーションは、常にインスタンスレベルでこれらのプールに接続し、クラスタがインスタンスリストに表示する IP アドレスを使用する必要があります。

AlloyDB は、読み取りプールのノードをエフェメラルかつ交換可能なリソースとして扱います。このサービスは、読み取りプール インスタンスのロード バランシングと応答性を維持するために、必要に応じて読み取りプールのノードのロースターを変更します。読み取りプール インスタンスではなく、読み取りプール ノードに直接接続するアプリケーションは、AlloyDB がインスタンスのノードロスターを更新するたびに、データベースから突然切断されるリスクがあります。

アプリケーションは常にインスタンスレベルで読み取りプールに接続し、AlloyDB にクエリを適切なノードに効率的にルーティングさせるようにします。

次のステップ