Database Lab 및 Postgres.ai
기본적으로 GitLab 내부 사용자들은 Database Lab Engine (DLE) 및 postgres.ai에 액세스하여 복제된 프로덕션 데이터의 성능을 테스트할 수 있습니다. 일반적인 읽기 전용 프로덕션 복제본과는 달리 DLE에서는 행을 생성, 업데이트, 삭제할 수 있습니다. 또한 프로덕션 데이터의 격리된 복사본에서 추가적인 인덱스나 열과 같은 스키마 변경의 성능도 테스트할 수 있습니다.
Database Lab 빠른 시작
- 콘솔을 방문.
- Google 로 로그인을 선택합니다. (GitLab이 아니라 Google SSO를 통해 프로젝트와 연결해야 합니다.)
- 로그인한 후에 GitLab 조직을 선택한 다음 사이드바에서 “조 시”를 방문합니다.
- 테스트할 데이터베이스를 선택합니다.
- GitLab 프로젝트의 대부분의 쿼리는
gitlab-production-main
에서 실행됩니다. - 만약 쿼리가 CI 테이블을 위한 것이라면
gitlab-production-ci
를 선택합니다. - 컨테이너 레지스트리에 대한 쿼리라면
gitlab-production-registry
를 선택합니다.
- GitLab 프로젝트의 대부분의 쿼리는
- 채팅 상자에
explain <쿼리 텍스트>
를 입력하여 계획을 얻을 수 있습니다.
Database Lab Engine 액세스
DLE에 액세스하는 것은 다음과 같은 경우에 도움이 됩니다:
- 데이터베이스 리뷰어 및 유지보수자.
- 데이터베이스에 큰 영향을 주는 병합 요청 작업을 하는 엔지니어들.
DLE의 서비스에 액세스하기 위해서는 다음을 할 수 있습니다:
- Postgres.ai 웹 콘솔에서 쿼리 테스트를 수행합니다.
직원들은 GitLab Google 계정으로 두 서비스에 액세스할 수 있습니다. 쿼리 테스트는 거기서 실행된 쿼리에 대한
EXPLAIN
(analyze, buffers) 계획을 제공합니다. - 병합 요청의 일부로 작업을 유도하여 마이그레이션 테스트를 수행합니다.
- 권한이 있는 사용자들만이 프로덕션 복제본 대신 DLE에 대한
psql
액세스를 직접합니다.psql
액세스를 요청하려면 액세스 요청을 제출하십시오.
더 많은 지원이 필요한 경우 #database
슬랙 채널을 사용하십시오.
참고: 프로덕션 복제본에 일시적인 액세스만 필요하다면 Database Lab 복제본 대신 Teleport를 통한 데이터베이스 콘솔 연결에 대한 런북 절차를 따르십시오.
쿼리 테스트
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 (instance_administration_project_id)
해당 테이블에 지정된 인덱스를 생성합니다. 새로운 인덱스를 활용하여 쿼리를 테스트할 수 있습니다. exec
는 어떠한 결과도 반환하지 않으며, 실행에 필요한 시간만을 제공합니다.
복제본 초기화
파괴적인 쿼리나 비효율적인 인덱스와 같은 많은 변경을 수행한 후에는 처음부터 시작해야 합니다.
지정된 복제본을 재설정하려면 reset
을 실행하십시오.
인덱스 확인
데이터베이스 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
로 끝납니다.
public.index_design_management_designs_on_project_id
결과에서 invalid
끝나면 잘못된 인덱스입니다.
인덱스가 존재하지 않으면 JoeBot이 다음과 같은 오류를 발생시킵니다:
ERROR: psql error: psql:/tmp/psql-query-932227396:1: error: Did not find any relation named "no_index".
마이그레이션 테스팅
마이그레이션을 테스트하려면, 데이터베이스 마이그레이션 테스트 문서를 참조하세요.
psql
로 콘솔에 액세스
참고:
psql
로 콘솔에 액세스하려면 psql
액세스가 필요합니다.
pgai
Ruby gem을 통한 간편한 액세스
@mbobin이 pgai
Ruby Gem을 만들어, 다음을 지원하는 데이터베이스 클론에 대한 액세스를 크게 간소화했습니다:
- Postgres.ai instances 페이지에 나열된 모든 데이터베이스 클론에 대한 액세스
- 동일한 클론에 대한 여러 개의
psql
세션
만약 psql
액세스가 있다면, 아래 단계를 따라 pgai
Gem을 구성할 수 있습니다:
-
시작하려면 Postgres.ai instances 페이지에서 몇 가지 값을 모아야 합니다:
- 구성하려는 인스턴스로 이동하고 오른쪽에 있는 메뉴를 선택하세요.
-
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
-
다음 스니펫을 SSH 구성 파일인
~/.ssh/config
에 추가하고 변수 값을 대체하세요:Host pgai-proxy HostName <postgresai-proxy> User <postgresai-user> IdentityFile ~/.ssh/id_ed25519
-
서버 키 지문을 수락하려면 다음 명령을 실행하세요:
ssh pgai-proxy
-
다음 명령을 실행하세요:
gem install pgai # 액세스 토큰 얻기: https://console.postgres.ai/gitlab/tokens # GITLAB_USER는 GitLab 핸들입니다 pgai config --dbname=gitlabhq_dblab --prefix=$GITLAB_USER --proxy=pgai-proxy # 사용할 인스턴스(이 경우 `main` 데이터베이스 인스턴스)의 https://console.postgres.ai/gitlab/instances에서 해당 포트 값을 가져옵니다 pgai env add --alias main --id <environment-id> --port <environment-port>
-
이 일회성 구성이 완료되면,
pgai connect
를 사용하여 특정 데이터베이스에 연결할 수 있습니다. 예를 들어,main
데이터베이스에 연결하려면:pgai connect main
-
클론 사용이 완료되었으면, 해당 클론을 제거할 수 있습니다:
pgai destroy main
Postgres.ai instances 페이지를 통한 수동 액세스
psql
액세스가 있는 팀 멤버는 psql
을 통해 클론에 직접 액세스할 수 있습니다. psql
액세스를 통해 메타데이터뿐만 아니라 데이터도 볼 수 있습니다.
psql
을 사용하여 클론에 연결하려면:
-
원하는 인스턴스에서 클론을 만듭니다.
-
Clone ID를 제공하세요:
yourname-testing-gitlabissue
와 같이 클론을 고유하게 식별할 수 있는 값으로 지정합니다. -
데이터베이스 사용자 이름 및 데이터베이스 암호를 제공하세요:
psql
을 클론에 연결합니다. - 클론을 보존하려면 삭제 보호 기능 사용을 선택하세요. 이 옵션을 선택하지 마세요. 12시간 후에 클론이 제거됩니다.
-
Clone ID를 제공하세요:
- Postgres.ai 웹 인터페이스의 Clone details 페이지에서 클론을 위한 SSH 포트 포워딩을 시작하는 명령을 복사하여 실행하세요.
- Postgres.ai 웹 인터페이스의 Clone details 페이지에서
psql
연결 문자열을 복사하여 실행하세요. 설정 시 제공된 암호를 사용하고dbname
을gitlabhq_dblab
로 설정합니다(psql -l
를 사용하여 데이터베이스를 확인하거나 동일한 쿼리 문자열로dbname=postgres
를 사용하여 사용 가능한 데이터베이스를 확인합니다).
연결한 후에는, 생산 환경과 유사하게 클론을 사용하지만, 격리된 기록 가능한 환경의 추가 혜택과 안전성이 제공됩니다.