Help us learn about your current experience with the documentation. Take the survey.

Database Lab 和 Postgres.ai

GitLab 的内部用户可以使用 Database Lab Engine (DLE) 和 postgres.ai 来测试数据库查询在复制生产数据上的性能。与典型的只读生产副本不同,在 DLE 中,您还可以创建、更新和删除行。您还可以在隔离的生产数据副本中测试模式更改(如额外的索引或列)的性能。

Database Lab 快速入门

  1. 访问控制台
  2. 选择 使用 Google 登录。(不是 GitLab,因为您需要 Google SSO 才能连接我们的项目。)
  3. 登录后,选择 GitLab 组织,在侧边栏中选择 “Joe Bot”,然后访问 “Ask Joe”。
  4. 选择您要测试的数据库:
    • GitLab 项目的大多数查询都在 gitlab-production-main 上运行。
    • 如果查询针对的是 CI 表,请选择 gitlab-production-ci
    • 如果查询针对的是容器注册表,请选择 gitlab-production-registry
  5. 在聊天框中输入 explain <查询文本> 以获取计划。

访问 Database Lab Engine

访问 DLE 对以下人员有帮助:

  • 数据库审查者和维护者。
  • 处理对数据库有重大影响的合并请求的工程师。

要访问 DLE 的服务,您可以:

  • 在 Postgres.ai Web 控制台中执行查询测试。 员工使用其 GitLab Google 账户访问这两个服务。查询测试提供在此处执行的查询的 EXPLAIN(analyze, buffers)计划。
  • 通过作为合并请求的一部分触发作业进行迁移测试。
  • 直接访问 DLE 的 psql,而不是生产副本。仅限授权用户使用。 要请求 psql 访问,请提交 访问请求

如需更多帮助,请使用 #database Slack 频道。

如果您只需要临时访问生产副本,而不是 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 (restricted_visibility_levels)

会在表上创建指定的索引。您可以 测试查询 以利用新索引。exec 不返回任何结果,只返回执行查询所需的时间。

重置克隆

在多次更改后,例如在破坏性查询或无效索引之后,您必须重新开始。要重置您指定的克隆,请运行 reset

检查索引

使用 Database Lab 和元命令 \d <index_name> 检查索引的状态。

注意事项:

  • 索引在 mainci 数据库中都会创建,因此请确保使用与表的 gitlab_schema 匹配的实例。例如,如果索引添加到 ci_builds, 请使用 gitlab-production-ci
  • Database Lab 通常有几个小时的小延迟。如果需要更及时的信息,您可以改为请求访问副本 通过 Teleport

例如:\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 访问控制台

您必须拥有 AllFeaturesUser psql 访问权限 才能使用 psql 访问控制台。

要访问数据库实验室实例,您必须:

  • 提交 访问请求,请求以下内容:
    • Postgres.ai 中的 AllFeaturesUser 角色
    • chef-repo 中的 db-lab 角色
  • chef-repo 中拥有包含您的 SSH 密钥和 db-lab 角色的用户数据包条目。
  • 如下配置 ssh
Host lb-bastion.db-lab.gitlab.com
  # Typically, the username is `name` in `name@gitlab.com`
  # or your GitLab's username.
  # Check with the access provisioner if it is not working.
  # If not provided, defaults to your system username.
  User YOUR_USERNAME_HERE

  # Path to your SSH key. Adjust or remove if using a different key or SSH agent.
  IdentityFile ~/.ssh/id_ed25519

Host *.gitlab-db-lab.internal
  User YOUR_USERNAME_HERE  # Same as above.
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/id_ed25519  # Same as above.
  ProxyCommand ssh lb-bastion.db-lab.gitlab.com -W %h:%p

通过 Postgres.ai 实例页面手动访问

拥有 psql 访问权限 的团队成员可以通过 psql 直接访问克隆。访问 psql 使您能够看到数据,而不仅仅是元数据。

要使用 psql 连接到克隆:

  1. 所需实例 创建克隆。
    1. 提供 克隆 ID:唯一标识您克隆的内容,例如 yourname-testing-gitlabissue
    2. 提供 数据库用户名数据库密码:将 psql 连接到您的克隆。
    3. 如果需要保留您的克隆,请选择 启用删除保护。避免选择此选项。 克隆将在 12 小时后删除。
  2. 在 Postgres.ai Web 界面的 克隆详情 页面中,复制并运行 启动克隆 SSH 端口转发的命令。
    1. 您可能会注意到建议使用 -N 标志运行命令,这意味着不会启动 shell, 因此如果成功运行,您不应期望任何输出。
    2. 或者,您可以将 LogLevel DEBUG3 添加到您的 ~/.ssh/config 以输出详细的调试信息。
    3. 运行命令后,保持其运行以保持端口转发活动, 然后您可以打开一个新的终端选项卡来执行下一步。
  3. 在 Postgres.ai Web 界面的 克隆详情 页面中,复制并运行 psql 连接字符串。 使用设置时提供的密码,并将 dbname 设置为 gitlabhq_dblab(或使用 psql -l 检查可用的数据库,使用相同的查询字符串但 dbname=postgres)。

连接后,像使用生产环境中的任何 psql 控制台一样使用克隆,但具有隔离可写环境的额外好处和安全性。

通过 pgai Ruby gem 简化访问

有关使用 pgai Ruby gem 的说明,请参见:使用 pgai Ruby gem 访问 Database Lab