Database Lab 和 Postgres.ai
GitLab 的内部用户可以使用 Database Lab Engine (DLE) 和 postgres.ai 来测试数据库查询在复制生产数据上的性能。与典型的只读生产副本不同,在 DLE 中,您还可以创建、更新和删除行。您还可以在隔离的生产数据副本中测试模式更改(如额外的索引或列)的性能。
Database Lab 快速入门
- 访问控制台。
- 选择 使用 Google 登录。(不是 GitLab,因为您需要 Google SSO 才能连接我们的项目。)
- 登录后,选择 GitLab 组织,在侧边栏中选择 “Joe Bot”,然后访问 “Ask Joe”。
- 选择您要测试的数据库:
- GitLab 项目的大多数查询都在
gitlab-production-main上运行。 - 如果查询针对的是 CI 表,请选择
gitlab-production-ci。 - 如果查询针对的是容器注册表,请选择
gitlab-production-registry。
- GitLab 项目的大多数查询都在
- 在聊天框中输入
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 的查询分析功能:
- 在 Postgres.ai Web 控制台 中。 仅显示您运行的命令。
生成查询计划
查询计划是数据库审查过程的重要组成部分。这些计划使我们能够快速判断给定查询是否能在 GitLab.com 上高效运行。运行 explain 命令会生成一个 explain 计划以及一个指向 Postgres.ai 控制台的链接,其中包含更多查询分析。例如,运行 EXPLAIN SELECT * FROM application_settings 会执行以下操作:
- 在数据库克隆上运行
explain (analyze, buffers) select * from application_settings;。 - 返回运行中的时间和缓冲区详细信息。
- 提供 关于结果的详细、可共享报告。
进行模式更改
有时在测试查询时,贡献者可能会意识到查询需要一个索引或其他模式更改,以使添加的查询更高效。要测试查询,请运行 exec 命令。例如,运行此命令:
exec CREATE INDEX on application_settings USING btree (restricted_visibility_levels)会在表上创建指定的索引。您可以 测试查询 以利用新索引。exec 不返回任何结果,只返回执行查询所需的时间。
重置克隆
在多次更改后,例如在破坏性查询或无效索引之后,您必须重新开始。要重置您指定的克隆,请运行 reset。
检查索引
使用 Database Lab 和元命令 \d <index_name> 检查索引的状态。
注意事项:
- 索引在
main和ci数据库中都会创建,因此请确保使用与表的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角色
- Postgres.ai 中的
- 在 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 连接到克隆:
- 从 所需实例 创建克隆。
- 提供 克隆 ID:唯一标识您克隆的内容,例如
yourname-testing-gitlabissue。 - 提供 数据库用户名 和 数据库密码:将
psql连接到您的克隆。 - 如果需要保留您的克隆,请选择 启用删除保护。避免选择此选项。 克隆将在 12 小时后删除。
- 提供 克隆 ID:唯一标识您克隆的内容,例如
- 在 Postgres.ai Web 界面的 克隆详情 页面中,复制并运行
启动克隆 SSH 端口转发的命令。
- 您可能会注意到建议使用
-N标志运行命令,这意味着不会启动 shell, 因此如果成功运行,您不应期望任何输出。 - 或者,您可以将
LogLevel DEBUG3添加到您的~/.ssh/config以输出详细的调试信息。 - 运行命令后,保持其运行以保持端口转发活动, 然后您可以打开一个新的终端选项卡来执行下一步。
- 您可能会注意到建议使用
- 在 Postgres.ai Web 界面的 克隆详情 页面中,复制并运行
psql连接字符串。 使用设置时提供的密码,并将dbname设置为gitlabhq_dblab(或使用psql -l检查可用的数据库,使用相同的查询字符串但dbname=postgres)。
连接后,像使用生产环境中的任何 psql 控制台一样使用克隆,但具有隔离可写环境的额外好处和安全性。
通过 pgai Ruby gem 简化访问
有关使用 pgai Ruby gem 的说明,请参见:使用 pgai Ruby gem 访问 Database Lab。