Database Lab 및 Postgres.ai

깃랩의 내부 사용자는 데이터베이스 쿼리의 성능을 테스트하기 위해 데이터베이스 랩 엔진(DLE) 및 postgres.ai에 액세스할 수 있습니다. 일반적인 읽기 전용 프로덕션 레플리카와 달리 DLE에서는 행을 생성, 업데이트, 삭제할 수 있습니다. 또한 프로덕션 데이터의 격리된 사본에서 추가적인 인덱스나 열과 같은 스키마 변경의 성능도 테스트할 수 있습니다.

Database Lab 빠른 시작

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

데이터베이스 랩 엔진 액세스

DLE에 액세스하는 것은 다음과 같은 사람들에게 도움이 됩니다:

  • 데이터베이스 리뷰어 및 유지보수자.
  • 데이터베이스에 큰 영향을 미치는 병합 요청에 작업하는 엔지니어들.

DLE의 서비스에 액세스하려면:

  • Postgres.ai 웹 콘솔에서 쿼리 테스트를 수행합니다. 직원들은 GitLab Google 계정을 사용하여 양쪽 서비스에 모두 액세스할 수 있습니다. 쿼리 테스트는 거기서 실행된 쿼리에 대한 EXPLAIN (분석, 버퍼) 계획을 제공합니다.
  • 병합 요청의 일부로 작업을 트리거하여 마이그레이션 테스트를 수행합니다.
  • 프로덕션 레플리카 대신 DLE에 대한 직접적인 psql 액세스. 승인된 사용자만 사용할 수 있습니다. psql 액세스를 요청하려면 액세스 요청을 제출하세요.

더 많은 도움이 필요하다면 #database 슬랙 채널을 사용하세요.

참고: 프로덕션 레플리카에 일시적인 액세스가 필요한 경우에는 데이터베이스 랩의 복제본 대신 Teleport를 통한 데이터베이스 콘솔에 연결하는 런북 절차를 따르세요. 이 절차는 Teleport를 통한 Rails 콘솔 액세스와 유사합니다.

쿼리 테스트

데이터베이스 랩의 쿼리 분석 기능에는 다음 위치에서 액세스할 수 있습니다:

쿼리 계획 생성

쿼리 계획은 데이터베이스 리뷰 프로세스의 중요한 부분입니다. 이러한 계획을 통해 깃랩닷컴에서 특정 쿼리가 성능을 낼 수 있는지를 빠르게 결정할 수 있습니다. 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 (restricted_visibility_levels)

지정된 테이블에 해당 인덱스가 생성됩니다. 새로운 인덱스를 활용하여 쿼리를 테스트할 수 있습니다. exec는 결과를 반환하지 않고 쿼리를 실행하는 데 소요된 시간만 반환합니다.

복제본 초기화

파괴적인 쿼리 또는 효과적이지 않은 인덱스 실행 후와 같이 여러 변경 사항이 이루어진 후에는 다시 시작해야 합니다. 지정된 복제본을 재설정하려면 reset을 실행하세요.

인덱스 확인

데이터베이스 랩을 사용하여 메타 명령 \d <인덱스 이름>로 인덱스의 상태를 확인합니다.

주의사항:

  • 인덱스는 mainci 데이터베이스 양쪽에 생성되므로 테이블의 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를 가지고 있어야 합니다.

데이터베이스 랩 인스턴스에 액세스하려면:

  • 액세스 요청을 제출하세요.
  • chef-repo에 사용자 데이터 백 엔트리와 SSH 키 및 db-lab 역할이 있는지 확인하세요.
  • 다음과 같이 ssh를 구성하세요:
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을 사용하여 클론에 연결하는 방법:

  1. 원하는 인스턴스에서 클론을 생성합니다(https://console.postgres.ai/gitlab/instances/).
    1. Clone ID를 제공합니다: ‘yourname-testing-gitlabissue’와 같은 클론을 고유하게 식별하는 정보를 제공합니다.
    2. 데이터베이스 사용자 이름데이터베이스 암호를 제공합니다: psql을 클론에 연결합니다.
    3. 클론을 유지해야 하는 경우 삭제 보호 기능을 선택합니다. 이 옵션을 선택하지 않도록 합니다. 클론은 12시간 후에 제거됩니다.
  2. Postgres.ai 웹 인터페이스의 Clone details 페이지에서 클론을 위해 SSH 포트 포워딩을 시작하는 명령을 복사하고 실행합니다.
  3. Postgres.ai 웹 인터페이스의 Clone details 페이지에서 psql 연결 문자열을 복사하고 실행합니다. 설정 시 제공된 암호를 사용하고 dbnamegitlabhq_dblab로 설정합니다(psql -l을 사용하여 사용 가능한 데이터베이스를 확인합니다. 동일한 쿼리 문자열을 사용하지만 dbname=postgres로 설정합니다).

연결한 후에는 프로덕션 환경의 psql 콘솔과 같이 클론을 사용하지만 격리된 쓰기 환경의 추가 혜택과 안전성을 누릴 수 있습니다.

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

경고: pgai 젬은 아직 새 데이터베이스 랩 인스턴스를 사용하도록 업데이트되지 않았으므로 이 도구를 사용하여 이전 버전의 인스턴스에만 액세스할 수 있습니다.

pgai Ruby gem을 사용하는 방법에 대한 지침은 pgai Ruby gem을 사용한 Database Lab 액세스를 참조하십시오.