データベースラボとPostgres.ai

GitLabの内部ユーザーは、データベースラボエンジン(DLE) とpostgres.aiにアクセスし、複製された本番データに対するデータベースクエリのパフォーマンスをテストすることができます。一般的な読み取り専用のプロダクション・レプリカとは異なり、DLEでは行の作成、更新、削除も可能です。また、本番データの分離されたコピーで、インデックスやカラムの追加など、スキーマ変更のパフォーマンスをテストすることもできます。

データベースラボのクイックスタート

  1. コンソールにアクセスします。
  2. Google でログインを選択します。(GitLabではありません。私たちのプロジェクトに接続するにはGoogle SSOが必要だからです)。
  3. サインインしたら、GitLabの組織を選択し、サイドバーの “Ask Joe “にアクセスします。
  4. テスト対象のデータベースを選択します:
    • GitLab プロジェクトのほとんどのクエリはgitlab-production-tunnel-pg12 に対して実行されます。
    • クエリが CI テーブルの場合は、gitlab-production-ci を選択してください。
    • クエリがコンテナ・レジストリの場合は、gitlab-production-registry を選択します。
  5. チャットボックスにexplain <Query Text> と入力すると、プランが表示されます。

Accessデータベースラボエンジン

DLEへのアクセスは次のような場合に役立ちます:

  • データベースのレビュアーやメンテナー。
  • データベースに大きな影響を与えるマージリクエストに携わるエンジニア。

DLEのサービスにアクセスするには

  • Postgres.ai ウェブコンソールでクエリテストを実行します。従業員はGitLab Googleアカウントで両方のサービスにアクセスします。クエリテストは、そこで実行されたクエリのEXPLAIN (分析、バッファ)プランを提供します。
  • マージリクエストの一部としてジョブをトリガーすることで、マイグレーションテストを行います。
  • psql 本番環境のレプリカの代わりにDLEに直接アクセス psqlできます。psql 作成者ユーザーのみが利用できます。 psqlアクセスをpsql 要求 psqlするには、アクセス要求を提出します。

詳しくは、#database Slackチャンネルをご利用ください。

note
Database Labクローンではなく、本番レプリカへの一時的なアクセスのみが必要な場合は、Teleportを使用してデータベースコンソールに接続するためのランブックの手順に従ってください。この手順は、Teleportを使ったRailsコンソールアクセスと似ています。

クエリのテスト

Database Lab のクエリ分析機能には、次のいずれかの方法でアクセスできます:

クエリプランの生成

クエリプランはデータベースのレビューに欠かせないものです。このプランによって、与えられたクエリがGitLab.comで実行可能かどうかを素早く判断することができます。explain コマンドを実行すると、プランが生成さ explainれ、より詳細なクエリ分析ができるPostgres.aiコンソールへのリンクが生成されます。例えば、EXPLAIN SELECT * FROM application_settings を実行すると以下のようになります:

  1. データベースクローンに対してexplain (analyze, buffers) select * from application_settings; を実行します。
  2. 実行のタイミングとバッファの詳細を返します。
  3. 詳細で共有可能な結果レポートを提供します。

スキーマの変更

クエリをテストしている時に、追加されたクエリの性能を向上させるためにインデックスやその他のスキーマの変更が必要であることに気づくことがあります。クエリをテストするには、exec コマンドを実行します。例えば、このコマンドを実行します:

exec CREATE INDEX on application_settings USING btree (instance_administration_project_id)

を実行すると、テーブルに指定したインデックスが作成されます。新しいインデックスを利用したクエリをテストすることができます。exec は結果を返しません。クエリの実行に必要な時間だけを返します。

クローンのリセット

破壊的なクエリや効果的でないインデックスの後など、多くの変更を行った後は、最初からやり直す必要があります。指定したクローンをリセットするには、reset を実行してください。

インデックスの確認

メタコマンド\d <index_name> を使用してインデックスの状態を確認するには、Database Lab を使用します。

注意事項

  • イ ンデ ッ ク ス はmainci の両方のデー タ ベース に作成 さ れますので、 必ずテーブルのgitlab_schemaに一致す る イ ン ス タ ン ス を使用 し て く だ さ い。た と えば、 イ ンデ ッ ク ス がci_buildsに追加 さ れ る 場合はgitlab-production-ciを使用 し ます。
  • デー タ ベース ラ ボでは通常、 若干の遅延があ り ます。より最新の情報が必要な場合は、代わりにテレポート経由でレプリカへのアクセスを要求できます。

例:\d index_design_management_designs_on_project_id が生成します:

Index "public.index_design_management_designs_on_project_id"
   Column   |  Type   | Key? | Definition
------------+---------+------+------------
 project_id | integer | yes  | project_id
btree, for table "public.design_management_designs"

無効なインデックスの場合、出力はinvalid で終わります:

Index "public.index_design_management_designs_on_project_id"
   Column   |  Type   | Key? | Definition
------------+---------+------+------------
 project_id | integer | yes  | project_id
btree, for table "public.design_management_designs", invalid

インデックスが存在しない場合、JoeBotは次のようなエラーを投げます:

ERROR: psql error: psql:/tmp/psql-query-932227396:1: error: Did not find any relation named "no_index".

マイグレーションテスト中です。

マイグレーションのテストについては、データベースマイグレーションのテストに関するドキュメントをレビューしてください。

コンソールにはpsql

note
psqlでコンソールにアクセスするには、AllFeaturesUser psql のアクセス権が必要です。

pgai Ruby gemによるアクセスの簡素化

データベースクローンへのアクセスを大幅に簡素化するpgai Ruby Gem@mbobin さんが作成しました:

AllFeaturesUser psql アクセス がある場合、以下の手順に従ってpgai Gem を設定できます:

  1. 始めるには、Postgres.aiインスタンスページからいくつかの値を収集する必要があります:

    1. 設定したいインスタンスに移動し、画面の右側にあります。
    2. Connection]で[Connect]を選択します。メニューは折りたたまれている場合があります。

      このような形式で、設定に必要なすべてのダイアログが表示されます:

      dblab init --url "http://127.0.0.1:1234" --token TOKEN --environment-id <environment-id>
      
      ssh -NTML 1234:localhost:<environment-port> <postgresai-user>@<postgresai-proxy> -i ~/.ssh/id_rsa
      
  2. 以下のスニペットをSSH設定ファイル~/.ssh/config に追加してください。変数の値を置き換えてください:

    Host pgai-proxy
      HostName <postgresai-proxy>
      User <postgresai-user>
      IdentityFile ~/.ssh/id_ed25519
    
  3. 以下のコマンドを実行し、サーバー鍵指紋を受け取れるようにします:

    ssh pgai-proxy
    
  4. 以下のコマンドを実行してください:

    gem install pgai
       
    # Grab an access token: https://console.postgres.ai/gitlab/tokens
    # GITLAB_USER is your GitLab handle
    pgai config --dbname=gitlabhq_dblab --prefix=$GITLAB_USER --proxy=pgai-proxy
       
    # Grab the respective port values from https://console.postgres.ai/gitlab/instances
    # for the instances you'll be using (in this case, for the `main` database instance)
    pgai env add --alias main --id <environment-id> --port <environment-port>
    
  5. この1回限りの設定が完了したら、pgai connect を使って特定のデータベースに接続することができます。例えば、main データベースに接続する場合:

    pgai connect main
    
  6. クローンの作成が終わったら、クローンを破棄します:

    pgai destroy main
    

Postgres.aiインスタンスページから手動でアクセスしてください。

psql アクセスを持つチームメンバーは、psql を介してクローンに直接アクセスできます。psql にアクセスすると、メタデータだけでなくデータも見ることができます。

psqlを使用してクローンに接続するには:

  1. 目的のインスタンスからクローンを作成します。
    1. クローン ID:yourname-testing-gitlabissue など、クローンを一意に識別するものを指定します。
    2. データベースユーザー名と データベースパスワード:psql をクローンに接続します。
    3. クローンを保存する場合は、削除保護を有効にするを選択します。このオプションの選択は避けてください。クローンは 12 時間後に削除されます。
  2. Postgres.aiのWebインタフェースのクローンの詳細ページで、クローンのSSHポート転送を開始するコマンドをコピーして実行します。
  3. Postgres.aiウェブインターフェースのクローン詳細ページで、psql 接続文字列をコピーして実行します。セットアップ時に提供されたパスワードを使用し、dbnamegitlabhq_dblab に設定します(または、同じクエリ文字列でpsql -l を使用し、利用可能なデータベースをdbname=postgresで確認します)。

接続が完了したら、psql コンソールと同じように clone を使用してください。