Database Lab 및 Postgres.ai
깃랩의 내부 사용자는 데이터베이스 쿼리의 성능을 테스트하기 위해 데이터베이스 랩 엔진(DLE) 및 postgres.ai에 액세스할 수 있습니다. 일반적인 읽기 전용 프로덕션 레플리카와 달리 DLE에서는 행을 생성, 업데이트, 삭제할 수 있습니다. 또한 프로덕션 데이터의 격리된 사본에서 추가적인 인덱스나 열과 같은 스키마 변경의 성능도 테스트할 수 있습니다.
Database Lab 빠른 시작
- 콘솔을 방문.
- Google로 로그인을 선택합니다. (GitLab이 아닌 Google SSO를 사용해 프로젝트와 연결해야 합니다.)
- 로그인한 후 깃랩 조직을 선택하고 사이드바에서 “Ask Joe”를 방문합니다.
- 테스트 중인 데이터베이스를 선택합니다:
- 깃랩 프로젝트의 대부분 쿼리는
gitlab-production-main
에서 실행됩니다. - 만약 쿼리가 CI 테이블을 위한 것이라면
gitlab-production-ci
를 선택합니다. - 컨테이너 레지스트리를 위한 쿼리라면
gitlab-production-registry
를 선택합니다.
- 깃랩 프로젝트의 대부분 쿼리는
- 채팅 상자에
explain <쿼리 텍스트>
를 입력하여 계획을 얻습니다.
데이터베이스 랩 엔진 액세스
DLE에 액세스하는 것은 다음과 같은 사람들에게 도움이 됩니다:
- 데이터베이스 리뷰어 및 유지보수자.
- 데이터베이스에 큰 영향을 미치는 병합 요청에 작업하는 엔지니어들.
DLE의 서비스에 액세스하려면:
- Postgres.ai 웹 콘솔에서 쿼리 테스트를 수행합니다. 직원들은 GitLab Google 계정을 사용하여 양쪽 서비스에 모두 액세스할 수 있습니다. 쿼리 테스트는 거기서 실행된 쿼리에 대한
EXPLAIN
(분석, 버퍼) 계획을 제공합니다. - 병합 요청의 일부로 작업을 트리거하여 마이그레이션 테스트를 수행합니다.
- 프로덕션 레플리카 대신 DLE에 대한 직접적인
psql
액세스. 승인된 사용자만 사용할 수 있습니다.psql
액세스를 요청하려면 액세스 요청을 제출하세요.
더 많은 도움이 필요하다면 #database
슬랙 채널을 사용하세요.
참고: 프로덕션 레플리카에 일시적인 액세스가 필요한 경우에는 데이터베이스 랩의 복제본 대신 Teleport를 통한 데이터베이스 콘솔에 연결하는 런북 절차를 따르세요. 이 절차는 Teleport를 통한 Rails 콘솔 액세스와 유사합니다.
쿼리 테스트
데이터베이스 랩의 쿼리 분석 기능에는 다음 위치에서 액세스할 수 있습니다:
- Postgres.ai 웹 콘솔에 있습니다. 실행한 명령만 표시합니다.
쿼리 계획 생성
쿼리 계획은 데이터베이스 리뷰 프로세스의 중요한 부분입니다. 이러한 계획을 통해 깃랩닷컴에서 특정 쿼리가 성능을 낼 수 있는지를 빠르게 결정할 수 있습니다. 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 <인덱스 이름>
로 인덱스의 상태를 확인합니다.
주의사항:
- 인덱스는
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
로 끝납니다.
public.index_design_management_designs_on_project_id
에 올바른 인덱스가 없다면 JoeBot이 다음과 같은 오류를 표시합니다:
ERROR: psql error: psql:/tmp/psql-query-932227396:1: error: Did not find any relation named "no_index".
마이그레이션 테스트
마이그레이션 테스트에 대한 정보는 데이터베이스 마이그레이션 테스트 문서를 참조하세요.
psql
로 콘솔에 액세스
참고:
콘솔에 psql
액세스하려면 psql
액세스에 대한 AllFeaturesUser
를 가지고 있어야 합니다.
데이터베이스 랩 인스턴스에 액세스하려면:
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
을 사용하여 클론에 연결하는 방법:
- 원하는 인스턴스에서 클론을 생성합니다(https://console.postgres.ai/gitlab/instances/).
- Clone ID를 제공합니다: ‘yourname-testing-gitlabissue’와 같은 클론을 고유하게 식별하는 정보를 제공합니다.
-
데이터베이스 사용자 이름 및 데이터베이스 암호를 제공합니다:
psql
을 클론에 연결합니다. - 클론을 유지해야 하는 경우 삭제 보호 기능을 선택합니다. 이 옵션을 선택하지 않도록 합니다. 클론은 12시간 후에 제거됩니다.
- Postgres.ai 웹 인터페이스의 Clone details 페이지에서 클론을 위해 SSH 포트 포워딩을 시작하는 명령을 복사하고 실행합니다.
- Postgres.ai 웹 인터페이스의 Clone details 페이지에서
psql
연결 문자열을 복사하고 실행합니다. 설정 시 제공된 암호를 사용하고dbname
을gitlabhq_dblab
로 설정합니다(psql -l
을 사용하여 사용 가능한 데이터베이스를 확인합니다. 동일한 쿼리 문자열을 사용하지만dbname=postgres
로 설정합니다).
연결한 후에는 프로덕션 환경의 psql
콘솔과 같이 클론을 사용하지만 격리된 쓰기 환경의 추가 혜택과 안전성을 누릴 수 있습니다.
pgai
Ruby gem을 통한 간소화된 액세스
경고:
pgai
젬은 아직 새 데이터베이스 랩 인스턴스를 사용하도록 업데이트되지 않았으므로 이 도구를 사용하여 이전 버전의 인스턴스에만 액세스할 수 있습니다.
pgai
Ruby gem을 사용하는 방법에 대한 지침은 pgai Ruby gem을 사용한 Database Lab 액세스를 참조하십시오.