arrow_back

Cloud SQL for PostgreSQL データベースのオブザーバビリティとチューニング

ログイン 参加
700 以上のラボとコースにアクセス

Cloud SQL for PostgreSQL データベースのオブザーバビリティとチューニング

ラボ 1時間 universal_currency_alt クレジット: 1 show_chart 入門
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
700 以上のラボとコースにアクセス

GSP921

Google Cloud セルフペース ラボのロゴ

概要

このラボでは、SQL Insights を使用して Cloud SQL データベースのパフォーマンスを分析します。sqlcommenter ライブラリを使用して既存の Google Kubernetes Engine(GKE)アプリケーションを変更し、アプリケーション クエリにコメントによる注釈を付けます。こうしたコメントにより、アプリケーション内のクエリのソースを特定できるようになります。

各タスクで指定されているサービスとリソースを作成または構成する必要があり、各タスクを正常に完了するには、示されている詳細な手順に従う必要があります。

目標

このラボでは、次のタスクの実行方法について学びます。

  • SQL Insights を構成して利用する。
  • sqlcommenter を使用できるようにアプリケーションを構成する。
  • パフォーマンスを向上させるために、データベースをチューニングして最適化する。

設定と要件

[ラボを開始] ボタンをクリックする前に

こちらの説明をお読みください。ラボには時間制限があり、一時停止することはできません。タイマーは、Google Cloud のリソースを利用できる時間を示しており、[ラボを開始] をクリックするとスタートします。

このハンズオンラボでは、シミュレーションやデモ環境ではなく実際のクラウド環境を使って、ラボのアクティビティを行います。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。

このラボを完了するためには、下記が必要です。

  • 標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モード(推奨)またはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生しないようにすることができます。
  • ラボを完了するための時間(開始後は一時停止できません)
注: このラボでは、受講者アカウントのみを使用してください。別の Google Cloud アカウントを使用すると、そのアカウントに料金が発生する可能性があります。

ラボを開始して Google Cloud コンソールにログインする方法

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるダイアログでお支払い方法を選択してください。 左側の [ラボの詳細] ペインには、以下が表示されます。

    • [Google Cloud コンソールを開く] ボタン
    • 残り時間
    • このラボで使用する必要がある一時的な認証情報
    • このラボを行うために必要なその他の情報(ある場合)
  2. [Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウで開く] を選択します)。

    ラボでリソースがスピンアップし、別のタブで [ログイン] ページが表示されます。

    ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。

    注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
  3. 必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。

    {{{user_0.username | "Username"}}}

    [ラボの詳細] ペインでもユーザー名を確認できます。

  4. [次へ] をクリックします。

  5. 以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。

    {{{user_0.password | "Password"}}}

    [ラボの詳細] ペインでもパスワードを確認できます。

  6. [次へ] をクリックします。

    重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
  7. その後次のように進みます。

    • 利用規約に同意してください。
    • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
    • 無料トライアルには登録しないでください。

その後、このタブで Google Cloud コンソールが開きます。

注: Google Cloud のプロダクトやサービスにアクセスするには、ナビゲーション メニューをクリックするか、[検索] フィールドにサービス名またはプロダクト名を入力します。 ナビゲーション メニュー アイコンと検索フィールド

Cloud Shell をアクティブにする

Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。

  1. Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン 「Cloud Shell をアクティブにする」アイコン をクリックします。

  2. ウィンドウで次の操作を行います。

    • Cloud Shell 情報ウィンドウで操作を進めます。
    • Cloud Shell が認証情報を使用して Google Cloud API を呼び出すことを承認します。

接続した時点で認証が完了しており、プロジェクトに各自の Project_ID が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。

Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。

  1. (省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
  1. [承認] をクリックします。

出力:

ACTIVE: * ACCOUNT: {{{user_0.username | "ACCOUNT"}}} To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project

出力:

[core] project = {{{project_0.project_id | "PROJECT_ID"}}} 注: Google Cloud における gcloud ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。

API を有効にする

このラボで必要な API を有効にする必要があります。後のタスクでコンテナをビルドして Artifact Registry に push するため、まず Artifact Registry API を有効にする必要があります。

  • Cloud Shell で、次のコマンドを実行します。
gcloud services enable sqladmin.googleapis.com gcloud services enable artifactregistry.googleapis.com

Kubernetes クラスタの認証情報を取得する

  • ラボの開始時にデプロイされた Kubernetes クラスタへの認証を構成する必要があります。このプロセスにより、ホームフォルダ内の .kube フォルダ(非表示)に config ファイルが作成されます。
export ZONE={{{project_0.default_zone | Zone}}} gcloud container clusters get-credentials postgres-cluster --zone=$ZONE

gMemgen アプリケーションを実行する

  1. ブラウザで、ロードバランサの Ingress IP アドレスに移動します。

  2. Cloud Shell で次のコマンドを使用すると、ロードバランサの外部 IP アドレスへのクリック可能なリンクを作成できます。

export LOAD_BALANCER_IP=$(kubectl get svc gmemegen-service \ -o=jsonpath='{.status.loadBalancer.ingress[0].ip}' -n default) echo gMemegen Load Balancer Ingress IP: http://$LOAD_BALANCER_IP
  1. Cloud Shell でそのリンクをクリックすると、ブラウザで gMemegen アプリケーションが実行されます。

タスク 1. SQL Insights を使用して GKE アプリケーションの SQL クエリを調べる

このタスクでは、gMemegen アプリケーションによって生成されたクエリを調べます。アプリケーションでミームを作成し、アプリケーションの [Recent] ページと [Random] ページでそれらを表示することで、トラフィックを生成する必要があります。

Cloud SQL for PostgreSQL インスタンスで SQL Insights を有効にする

このタスクを完了するには、Cloud SQL データベースで SQL Insights を有効にする必要があります。

  1. Cloud コンソールで、[データベース] > [SQL] に移動し、postgres-gmemegen インスタンスを選択します。

  2. [プライマリ インスタンス] メニューで、[Query Insights] を選択します。

  3. [有効にする] ボタンをクリックします。

  4. [プライマリ インスタンス] > [Query Insights] ページで、[上位のクエリとタグ] の [タグ] タブを選択します。

  5. [アプリケーション タグを保存] をクリックします。

ミームを作成して表示する

このステップでは、gMemegen アプリケーションを使用して、少なくとも 4 つの新しいミームを作成して表示させます。その目的は、サンプルデータを生成し、利用可能なすべてのルートを利用してアプリケーションをテストすることです。

  1. gMemegen アプリケーションのタブで、[Home] ページに移動し、画像を選択します。

  2. 新しいミームのページで、上部と下部のテキスト ボックスにテキストを入力します。思いついたどんなミームでも作成できます。

  3. [Submit] ボタンをクリックします。新しいミームが表示されます。

  4. ブラウザの [Back] ボタンを使用して戻ります。

  5. [Recent] メニュー項目をクリックすると、最近作成したミームが表示されます。

  6. [Sorted] メニュー項目をクリックすると、上部のテキストに基づいてアルファベット順に並べ替えられたミームが表示されます。

  7. [Random] メニュー項目をクリックすると、ミームがランダムに表示されます。ブラウザの [Random] タブを閉じます。

  8. [Home] メニュー項目をクリックして、新しいミームを作成できるホームページに戻ります。

上記の 1 ~ 8 の手順を繰り返して、新しいミームを 4 つ以上作成してください。

6 つのミームのサンプル

SQL Insights を使用して gMemegen アプリケーションのデータベース アクティビティを調べる

  1. [プライマリ インスタンス] メニューで、[Query Insights] に移動します。

  2. [データベース] フィールドのプルダウン メニューを開き、[gmemegen_db] を選択します。[gmemegen_db] がリストに表示されない場合は、ページを更新してください。[gmemegen_db] がリストに表示されるまでに時間がかかることがあります。gMemegen アプリケーションでさらに操作を繰り返して、データベース トラフィックを増やすと、すぐに表示される場合があります。

gmemegen_db データベースのアイテム

  1. [上位のクエリとタグ] が表示されるまで下にスクロールすると、gMemegen アプリケーションによって生成されたクエリが [クエリ] タブにリストされているのを確認できます。

[クエリ] タブ

  1. [タグ] タブをクリックすると、この時点ではタグが表示されていないことがわかります。

SQL Insights ではタグが表示されないため、クエリのソースを区別できません。sqlcommenter というデータベース デベロッパー向けツールを使用すると、アプリケーション クエリにコメントを追加できるため、このビューにタグが表示されるようになります。これは、開発者やテスターがアプリケーション クエリのソースをトレースし、デバッグや最適化を行う際に非常に役立ちます。

現在の時刻をメモしておきます。sqlcommenter ライブラリをアプリケーション コードに含める前と後の SQL Insights の結果を比較できるようにするためです。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 SQL Insights を使用して GKE アプリケーションの SQL クエリを調べる。

タスク 2. GKE アプリケーションで sqlcommenter を有効にする

このタスクでは、sqlcommenter ライブラリ コードが追加されるように gMemegen アプリケーションに変更を加えます。このライブラリ コードでアプリケーション クエリに注釈を付けると、SQL Insights で有用性の高いクエリになります。

gMemegen アプリケーションを変更し、ソースコードを再ビルドする

このステップでは、gMemegen アプリの main.py Python アプリケーション コードを変更して sqlcommenter を有効にします。変更はすでにコードに加えられており、あとはコメント化解除が必要なだけなので、シンプルな sed コマンドで実行できます。その後、アプリケーションを再ビルドして、新しいイメージを Artifact Registry に保存します。

  1. Cloud Shell で、gMemegen アプリケーションのソースコードをダウンロードします。
gsutil -m cp -r gs://spls/gsp921/gmemegen .

sqlcommenter を有効にするには、gmemegen/app/main.py Python ファイル内の次のコードブロックからコメントを削除し、sqlcommenter を使用してクエリにタグが追加されるようにアプリケーションを構成します。

##from sqlalchemy import event ##from google.cloud.sqlcommenter.sqlalchemy.executor import BeforeExecuteFactory app = Flask(__name__) app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False ##app.config['SQLALCHEMY_RECORD_QUERIES'] = True app.config['SQLALCHEMY_ECHO'] = True app.config['SQLALCHEMY_DATABASE_URI'] = get_db_uri() db = SQLAlchemy(app) ##listener = BeforeExecuteFactory(with_db_driver=True) ##event.listen(db.engine, 'before_cursor_execute', listener, retval=True)
  1. Cloud Shell で次のコマンドを実行して、sqlcommenter を有効にする gMemegen アプリケーション コードのコメント化を解除します。
sed -i 's/##//g' gmemegen/app/main.py
  1. Cloud Shell で、更新されたバージョンを識別できるように、アプリケーションのヘッダー テンプレートを変更します。
sed -i 's/gMemegen/gMemegen (SQLcommenter)/g' gmemegen/app/templates/header.html

新しいイメージをビルドして Artifact Registry に push する

このステップでは、変更されたアプリケーション コードをビルドし、そのイメージに「v2(バージョン 2)」というラベルを付けて Artifact Registry に push します。

  1. Artifact Registry の Docker 認証を構成します。 export REGION={{{project_0.default_region | REGION}}} gcloud auth configure-docker ${REGION}-docker.pkg.dev

確認を求めるメッセージが表示されたら、「Y」と入力します。

  1. アーティファクト リポジトリを作成します。

    export REPO=gmemegen gcloud artifacts repositories create $REPO \ --repository-format=docker --location=$REGION
  2. 新しいイメージをビルドして Artifact Registry に push します。

    cd gmemegen export PROJECT_ID=$(gcloud config list --format 'value(core.project)') gcloud builds submit --tag ${REGION}-docker.pkg.dev/${PROJECT_ID}/gmemegen/gmemegen-app:v2

ビルドと push のプロセスが完了するまで数分かかります。完了すると、ビルドが成功したことを示す出力が以下のように表示されます。

出力:

ID: 801538cf-f0e5-43b4-b0e4-5071ad026bf3 CREATE_TIME: 2022-08-10T18:41:21+00:00 DURATION: 1M27S SOURCE: gs://qwiklabs-gcp-04-2dea2c1461c0_cloudbuild/source/1660156876.254161-89dl7080030e49f28e42ab7dc207d91a.tgz IMAGES: us-east1-docker.pkg.dev/qwiklabs-gcp-04-2dea2c1461c0/gmemegen/gmemegen-app:v2 STATUS: SUCCESS

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 GKE アプリケーションで sqlcommenter を有効にする。

タスク 3. gMemegen アプリケーションの Deployment を再実行する

このタスクでは、変更された gMemegen アプリケーションの Deployment を再実行します。その後、SQL Insights を使用して、アプリケーションの 2 つのバージョンのクエリを比較します。

  1. Cloud Shell で次のコマンドを実行して、ご利用になっているプロジェクト ID、Cloud SQL 接続名、リージョンで Deployment YAML を更新します。

    export CLOUDSQL_INSTANCE=postgres-gmemegen export CONNECTION_NAME=$(gcloud sql instances describe $CLOUDSQL_INSTANCE --format 'value(connectionName)') sed -i "s/CONNECTION-NAME/${CONNECTION_NAME}/g" gmemegen_canary_deployment.yaml export PROJECT_ID=$(gcloud config list --format 'value(core.project)') sed -i "s/PROJECT-ID/${PROJECT_ID}/g" gmemegen_canary_deployment.yaml export REGION={{{project_0.default_region | REGION}}} sed -i "s/us-central1/${REGION}/g" gmemegen_canary_deployment.yaml
  2. Cloud Shell で次のコマンドを実行して、アプリケーションの Deployment を再実行します。

kubectl apply -f gmemegen_canary_deployment.yaml
  1. Cloud Shell でアプリのバージョン 2.0 を選択して、ロードバランサを再デプロイします。

    sed -i "s/1.0/2.0/g" gmemegen-service.yaml kubectl apply -f gmemegen-service.yaml
  2. Cloud Shell で次のコマンドを実行して、Deployment の再実行が成功したことを確認します。

kubectl get pods

出力:

NAME READY STATUS RESTARTS AGE gmemegen-7975bf9776-fl7g9 2/2 Running 0 7m46s gmemegen-canary-7cc8687cfc-rqx4h 2/2 Running 0 33s

これで、gMemegen アプリケーションの新しい Deployment が実行されていることを確認できました。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 gMemegen アプリケーションの Deployment を再実行する。

タスク 4. SQL Insights でアプリケーション クエリを確認する

このタスクでは SQL Insights に戻り、sqlcommenter を含む、更新されたアプリケーションのデータベース アクティビティを確認します。まず、新しいバージョンのアプリを使用してミームをさらに作成し、より多くのデータベース アクティビティを生成する必要があります。

新しいミームをさらに作成する

このステップでは、タスク 3 で Deployment を実行したアプリケーションの新しいバージョンを使用して、新しいミームを作成します。メニューバーのアプリケーション名の横に [(SQLcommenter)] と表示されているため、新しいアプリであることがわかります。

gMemegen(SQLcommenter)アプリ

  • gMemegen アプリケーションのタブに切り替えて、新しいミームを作成し、[Recent] と [Sorted] のリンクを数回クリックしてデータベース トラフィックを生成します。

SQL Insights でアプリケーション クエリを確認する

このステップでは、Deployment が新たに実行されたアプリケーションのクエリを確認し、sqlcommenter によって挿入されたタグに注目します。

  1. Cloud コンソールのタブの、[プライマリ インスタンス] > [Query Insights] ページの [上位のクエリとタグ] で、[タグ] タブを選択します。

  2. [負荷(合計実行時間別)] 列名をクリックします。これにより、タグ付けされたクエリのリストが更新されるため、sqlcommenter によってタグ付けされた最近のクエリがすべて表示されます。

[Controller]、[Route]、[DB Driver]、[Framework] タグが設定されていることに注目してください。

[タグ] タブにこのクエリが表示されない場合は、ウェブページを更新し、[タグ] タブをクリックしてから、[負荷(合計実行時間別)] 列名をもう一度クリックします。

[タグ] タブ (続き - 上記画像の右の部分) [タグ] タブ(続き)

SQL Insights で実行速度の遅いクエリを特定する

このステップでは、アプリケーション クエリのパフォーマンスを分析して、実行に時間がかかっているクエリを特定します。

  1. Cloud コンソールの [Query Insights] ページで、[上位のクエリとタグ] までスクロールします。

[クエリ] タブ

  1. [タグ] タブをクリックします。

  2. [Route] 列で /sorted を含むタグを選択します。

最も負荷が高いことが緑色のバーで示されているはずですが、ラボで使用するデータ量が比較的少ない場合は、そのように表示されない可能性があります。ラボの [クエリのレイテンシ] グラフに表示されるエントリ数はおそらく少ないですが、データが増えれば、レイテンシ値の高い(95 パーセンタイルおよび 99 パーセンタイル)クエリを確認できるようになります。

[クエリのレイテンシ] のグラフ

  1. ブラウザの [戻る] ボタンを使用して、[上位のクエリとタグ] ビューに戻ります。または、[Query Insights] ページの上部にあるパンくずリストを使用して、postgres-gmemegen インスタンスを選択します。

  2. [Route] 列で /recent タグを選択します。このタグは、負荷とレイテンシが若干低いことを示しています。繰り返しになりますが、ラボでは、/sorted ルートとは大差ない結果のみが表示されます

[クエリのレイテンシ] のグラフ

これらのクエリは、ほぼ同じ数の行を返します。では、なぜパフォーマンスが異なるのでしょうか?その答えは、meme.id フィールドが meme テーブルの主キーとなって、インデックス化されているからです。一方 meme.top_text フィールドはインデックス化されていないため、実行に時間がかかります。

注: gmemegen_db データベースは、このラボの作業中に UI で生成した行数のみが含まれるため、非常に小さいです。そのため、これら 2 つのルートのパフォーマンスの違いがすぐに確認できない場合や、ほとんどわからない場合があります。本番環境では、インデックス化されたフィールドまたはインデックス化されていないフィールドで並べ替えをするクエリでは、パフォーマンスの違いがはっきりとわかります。

タスク 5. パフォーマンスを向上させるために、データベースをチューニングして最適化する

このタスクでは、前のタスクで特定した実行速度が遅いクエリを修正するために、gmemegen_db データベースを変更します。

Cloud SQL for PostgreSQL データベースにインデックスを追加する

このステップでは、データベースの列にインデックスを追加して、パフォーマンスを向上させます。

  1. Cloud コンソールの [プライマリ インスタンス] > [概要] ページで、[このインスタンスとの接続] セクションの [Cloud Shell を開く] をクリックします。コマンドが Cloud Shell コンソールに自動的に入力されるので、これを実行します。

  2. パスワードの入力を求められたら、「supersecret!」と入力します。

  3. psqlpostgres=> プロンプトで、次のコマンドを実行します。

    \c gmemegen_db
  4. パスワードを再度入力するよう求められます。「supersecret!」と入力します。

  5. psqlgmemegen_db=> プロンプトで、次のコマンドを実行します。

CREATE INDEX idx_meme_top_text ON meme(top_text);
  1. gMemegen アプリケーションのタブを開き、[Sorted] リンクを数回クリックして、新しいクエリを生成します。

クエリのパフォーマンスを確認する

このステップでは、並べ替え対象の列にインデックスが追加されたので、実行に時間がかかっていたクエリのパフォーマンスを確認します。

  1. Cloud コンソールの [プライマリ インスタンス] > [Query Insights] ページで、[上位のクエリとタグ] の [タグ] タブで、/sorted タグを再度選択します。

  2. 下にスクロールして [クエリのレイテンシ] グラフを表示させると、レイテンシが改善していることがわかります。

[クエリのレイテンシ] のグラフ

注: データベースに格納されているデータ量が比較的少ないと、ラボでは大きな違いが見られない場合があります。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 パフォーマンスを向上させるために、データベースをチューニングして最適化する。

このラボはこれで完了です。

お疲れさまでした

クエストを完了する

このセルフペース ラボは、「Manage PostgreSQL Databases on Cloud SQL」クエストの一部です。クエストとは学習プログラムを構成する一連のラボのことで、完了すると成果が認められてバッジが贈られます。バッジは公開して、オンライン レジュメやソーシャル メディア アカウントにリンクできます。このラボの修了後、次のクエストに登録すれば、すぐにクレジットを受け取ることができます。受講可能な全クエストについては、Google Cloud Skills Boost カタログをご覧ください。

マニュアルの最終更新日: 2024 年 7 月 4 日

ラボの最終テスト日: 2024 年 7 月 4 日

Copyright 2025 Google LLC. All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。

始める前に

  1. ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
  2. ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
  3. 画面左上の [ラボを開始] をクリックして開始します

シークレット ブラウジングを使用する

  1. ラボで使用するユーザー名パスワードをコピーします
  2. プライベート モードで [コンソールを開く] をクリックします

コンソールにログインする

    ラボの認証情報を使用して
  1. ログインします。他の認証情報を使用すると、エラーが発生したり、料金が発生したりする可能性があります。
  2. 利用規約に同意し、再設定用のリソースページをスキップします
  3. ラボを終了する場合や最初からやり直す場合を除き、[ラボを終了] はクリックしないでください。クリックすると、作業内容がクリアされ、プロジェクトが削除されます

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします

1 回に 1 つのラボ

既存のラボをすべて終了して、このラボを開始することを確認してください

シークレット ブラウジングを使用してラボを実行する

このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウントの競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。