Database Lab 및 Postgres.ai

GitLab의 내부 사용자는 Database Lab Engine (DLE) 및 postgres.ai에 액세스하여 복제된 프로덕션 데이터에서 데이터베이스 쿼리의 성능을 테스트할 수 있습니다. 전형적인 읽기 전용 프로덕션 복제본과 달리 DLE에서는 데이터 행을 만들거나 업데이트하거나 삭제할 수도 있습니다. 또한 프로덕션 데이터의 격리된 복사본에서 추가적인 인덱스나 열과 같은 스키마 변경의 성능도 테스트할 수 있습니다.

Database Lab 빠른 시작

  1. 콘솔을 방문.
  2. Google로 로그인을 선택합니다. (GitLab이 아니라 프로젝트와 연결하려면 Google SSO가 필요합니다.)
  3. 로그인한 후에 GitLab 조직을 선택하고 사이드바에서 “Ask Joe”를 방문합니다.
  4. 테스트할 데이터베이스를 선택합니다:
    • GitLab 프로젝트의 대부분의 쿼리는 gitlab-production-main에서 실행됩니다.
    • CI 테이블에 대한 쿼리라면 gitlab-production-ci를 선택합니다.
    • 컨테이너 레지스트리에 대한 쿼리라면 gitlab-production-registry를 선택합니다.
  5. 채팅 상자에 explain <쿼리 텍스트>를 입력하여 계획을 확인합니다.

Database Lab Engine 액세스하기

DLE에 액세스하는 것은 다음과 같은 경우에 유용합니다:

  • 데이터베이스 검토자 및 유지 보수자.
  • 데이터베이스에 큰 영향을 미치는 Merge Request을 작업하는 엔지니어.

DLE의 서비스에 액세스하려면 다음을 수행할 수 있습니다:

  • Postgres.ai 웹 콘솔에서 쿼리 테스트를 수행합니다. 직원은 GitLab Google 계정으로 두 서비스에 액세스할 수 있습니다. 쿼리 테스트를 통해 여기에서 실행한 쿼리의 EXPLAIN (분석, 버퍼) 계획을 제공받습니다.
  • Merge Request의 일환으로 작업을 트리거하여 마이그레이션 테스트를 수행합니다.
  • 허가된 사용자만이 프로덕션 복제본이 아닌 DLE에 대한 직접적인 psql 액세스를 제공받습니다. psql 액세스를 요청하려면 액세스 요청을 제출하세요.

더 많은 지원이 필요한 경우 #database Slack 채널을 사용하세요.

note
프로덕션 복제본에 일시적인 액세스가 필요한 경우 Database Lab 복제본 대신 Teleport를 사용하여 데이터베이스 콘솔에 연결하는 절차를 따르세요.

쿼리 테스트

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 (instance_administration_project_id)

이 명령은 지정된 테이블에 지정된 인덱스를 만듭니다. 새로운 인덱스를 활용하여 쿼리를 테스트할 수 있습니다. exec는 결과를 반환하지 않고 쿼리 실행에 소요된 시간만 제공합니다.

복제본 재설정하기

파괴적인 쿼리나 효과적이지 못한 인덱스와 같은 여러 변경 사항을 가했을 경우에는 복제본을 초기화해야 합니다. 지정된 복제본을 재설정하려면 reset을 실행하세요.

인덱스 확인하기

Database Lab을 사용하여 메타 명령 \d <index_name>으로 인덱스의 상태를 확인할 수 있습니다.

caution
  • 인덱스는 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로 끝납니다.

인덱스가 없는 경우 JoeBot은 다음과 같은 오류를 표시합니다:

ERROR: psql error: psql:/tmp/psql-query-932227396:1: error: Did not find any relation named "no_index".

마이그레이션 테스트

마이그레이션 테스트에 대한 자세한 내용은 데이터베이스 마이그레이션 테스트 문서를 참조하세요.

psql을 사용하여 콘솔에 액세스하기

note
콘솔에 psql 액세스를 얻으려면 psql 액세스가 필요합니다.

Database Lab 인스턴스에 액세스하려면 다음을 수행해야 합니다:

  • 액세스 요청을 제출하세요.
  • chef-repo에 사용자 데이터 백 엔트리가 있어야 합니다. 여기에는 SSH 키와 db-lab 역할이 포함되어 있어야 합니다.
  • 다음과 같이 ssh를 구성하세요:
Host lb-bastion.db-lab.gitlab.com
  User ${USER}
  IdentitiesOnly yes
  IdentityFile ~/.ssh/ed25519

Host *.gitlab-db-lab.internal
  User ${USER}
  PreferredAuthentications publickey
  IdentitiesOnly yes
  IdentityFile ~/.ssh/ed25519
  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 웹 인터페이스의 클론 세부 정보 페이지에서 SSH 포트 포워딩을 시작하는 명령을 복사하여 실행합니다.
  3. Postgres.ai 웹 인터페이스의 클론 세부 정보 페이지에서 psql 연결 문자열을 복사하여 실행합니다. 설정시 제공된 비밀번호를 사용하고 dbnamegitlabhq_dblab로 설정합니다(psql -l을 사용하여 동일한 쿼리 문자열로 dbname=postgres을 사용하여 사용가능한 데이터베이스를 확인합니다).

연결한 후에는 복제본을 프로덕션 환경에서의 psql 콘솔과 같이 사용할 수 있지만, 격리된 쓰기 환경의 추가적인 이점과 안전성을 가집니다.

pgai Ruby gem을 통한 간소화된 액세스

caution
pgai 젬은 아직 새로운 데이터베이스 랩 인스턴스를 사용하도록 업데이트되지 않았으므로, 이 도구를 사용하여 기존 인스턴스에만 액세스할 수 있습니다.

pgai Ruby gem을 사용하는 방법은 다음을 참조하십시오: pgai Ruby gem을 사용한 Database Lab 액세스.