Database Lab 및 Postgres.ai
GitLab의 내부 사용자들은 복제된 프로덕션 데이터에서 데이터베이스 쿼리의 성능을 테스트하기 위해 Database Lab Engine(DLE) 및 postgres.ai에 액세스할 수 있습니다. 일반적인 읽기 전용 프로덕션 복제본과는 달리, DLE에서는 행을 생성하고 업데이트하며 삭제할 수 있습니다. 또한, 프로덕션 데이터의 격리된 복사본에서 추가 인덱스나 열과 같은 스키마 변경의 성능을 테스트할 수 있습니다.
Database Lab 빠른 시작
- 콘솔 방문하기.
- Google로 로그인을 선택합니다. (GitLab이 아닌, 프로젝트와 연결하기 위해 Google SSO가 필요합니다.)
- 로그인한 후, GitLab 조직을 선택하고 사이드바에서 “Ask Joe”를 방문합니다.
- 테스트할 데이터베이스를 선택합니다:
- GitLab 프로젝트의 대부분의 쿼리는
gitlab-production-main
에 대해 실행됩니다. - 쿼리가 CI 테이블에 대한 경우,
gitlab-production-ci
를 선택합니다. - 쿼리가 컨테이너 레지스트리에 대한 경우,
gitlab-production-registry
를 선택합니다.
- GitLab 프로젝트의 대부분의 쿼리는
- 채팅 상자에
explain <Query Text>
를 입력하여 계획을 가져옵니다.
Database Lab Engine에 액세스
DLE에 대한 액세스는 다음과 같은 경우에 도움이 됩니다:
- 데이터베이스 검토자 및 유지 관리자를 위해.
- 데이터베이스에 큰 영향을 미치는 병합 요청에서 작업하는 엔지니어를 위해.
DLE의 서비스에 액세스하려면:
- Postgres.ai 웹 콘솔에서 쿼리 테스트를 수행합니다.
직원들은 GitLab Google 계정으로 두 서비스에 액세스합니다. 쿼리 테스트는
여기에서 실행된 쿼리에 대한
EXPLAIN
(analyze, buffers) 계획을 제공합니다. - 병합 요청의 일환으로 작업을 트리거하여 마이그레이션 테스트를 수행합니다.
- 프로덕션 복제본 대신 DLE에 직접
psql
로 액세스합니다. 인가된 사용자만 가능합니다.psql
액세스를 요청하려면 액세스 요청을 제출하세요.
더 자세한 도움이 필요하면 #database
Slack 채널을 이용하세요.
참고: 프로덕션 복제본에 대한 임시 액세스만 필요한 경우, Database Lab 클론 대신 Teleport를 통한 데이터베이스 콘솔 연결의 실행책 절차에 따라 진행하세요. 이 절차는 Teleport를 통한 Rails 콘솔 접근와 유사합니다.
쿼리 테스트
Database Lab의 쿼리 분석 기능에 액세스할 수 있습니다:
- Postgres.ai 웹 콘솔에서. 실행한 명령만 표시됩니다.
쿼리 계획 생성
쿼리 계획은 데이터베이스 검토 프로세스의 필수적인 부분입니다. 이 계획은
특정 쿼리가 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
을 실행하세요.
인덱스 확인하기
데이터베이스 랩을 사용하여 메타 명령 \d <index_name>
으로 인덱스의 상태를 확인하세요.
주의 사항:
- 인덱스는
main
과ci
데이터베이스 모두에 생성되므로, 테이블의gitlab_schema
와 일치하는 인스턴스를 사용해야 합니다. 예를 들어, 인덱스가ci_builds
에 추가되었다면,gitlab-production-ci
를 사용하세요. - 데이터베이스 랩은 일반적으로 몇 시간의 지연이 있습니다. 최신 정보가 필요한 경우, 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
로 콘솔 접근하기
참고:
콘솔에 psql
로 접근하려면 AllFeaturesUser
psql
접근이 있어야 합니다.
데이터베이스 랩 인스턴스에 접근하기 위해서는 다음을 수행해야 합니다:
Host lb-bastion.db-lab.gitlab.com
User ${USER}
IdentitiesOnly yes
IdentityFile ~/.ssh/id_ed25519
Host *.gitlab-db-lab.internal
User ${USER}
PreferredAuthentications publickey
IdentitiesOnly yes
IdentityFile ~/.ssh/id_ed25519
ProxyCommand ssh lb-bastion.db-lab.gitlab.com -W %h:%p
Postgres.ai 인스턴스 페이지를 통한 수동 액세스
psql
액세스가 있는 팀원은 psql
을 통해 클론에 직접 액세스할 수 있습니다.
psql
에 대한 액세스는 메타데이터뿐만 아니라 데이터를 볼 수 있게 해줍니다.
psql
을 사용하여 클론에 연결하려면:
-
원하는 인스턴스에서 클론을 생성합니다.
-
Clone ID를 제공하세요:
yourname-testing-gitlabissue
와 같이 클론을 고유하게 식별할 수 있는 항목. -
데이터베이스 사용자 이름과 데이터베이스 비밀번호를 제공하세요:
psql
을 클론에 연결합니다. - 클론을 보존해야 하는 경우 삭제 보호 활성화를 선택합니다. 이 옵션을 선택하지 않는 것이 좋습니다. 클론은 12시간 후에 제거됩니다.
-
Clone ID를 제공하세요:
-
Postgres.ai 웹 인터페이스의 클론 세부정보 페이지에서 클론에 대한 SSH 포트 포워딩을 시작하기 위한 명령을 복사하고 실행합니다.
- Postgres.ai 웹 인터페이스의 클론 세부정보 페이지에서
psql
연결 문자열을 복사하고 실행합니다. 설정 시 제공된 비밀번호를 사용하고dbname
을gitlabhq_dblab
로 설정합니다 (또는 동일한 쿼리 문자열을 사용하여dbname=postgres
와 함께psql -l
을 실행하여 사용 가능한 데이터베이스를 확인합니다).
연결한 후, 클론을 프로덕션의 모든 psql
콘솔처럼 사용하면 되지만,
격리된 쓰기 가능한 환경의 추가 이점과 안전성이 제공됩니다.
pgai
Ruby gem을 통한 단순화된 액세스
경고:
pgai
gem은 새로운 데이터베이스 실험실 인스턴스를 사용하도록 아직 업데이트되지 않았으므로 이 도구를 사용하여 이전 인스턴스에만 액세스할 수 있습니다.
pgai
Ruby gem 사용에 대한 지침은 다음을 참조하세요: pgai Ruby gem을 사용한 데이터베이스 실험실 액세스.