Database Lab 및 Postgres.ai

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

Database Lab 빠른 시작

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

Database Lab Engine 액세스

DLE에 액세스하는 것은 다음과 같은 경우에 도움이 됩니다:

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

DLE의 서비스에 액세스하기 위해서는 다음을 할 수 있습니다:

  • Postgres.ai 웹 콘솔에서 쿼리 테스트를 수행합니다. 직원들은 GitLab Google 계정으로 두 서비스에 액세스할 수 있습니다. 쿼리 테스트는 거기서 실행된 쿼리에 대한 EXPLAIN (analyze, buffers) 계획을 제공합니다.
  • 병합 요청의 일부로 작업을 유도하여 마이그레이션 테스트를 수행합니다.
  • 권한이 있는 사용자들만이 프로덕션 복제본 대신 DLE에 대한 psql 액세스를 직접합니다. psql 액세스를 요청하려면 액세스 요청을 제출하십시오.

더 많은 지원이 필요한 경우 #database 슬랙 채널을 사용하십시오.

참고: 프로덕션 복제본에 일시적인 액세스만 필요하다면 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을 실행하십시오.

인덱스 확인

데이터베이스 Lab를 사용하여 메타-명령어 \d <index_name>를 사용하여 인덱스의 상태를 확인합니다.

주의사항: - 인덱스는 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로 끝납니다.

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을 통한 간편한 액세스

@mbobinpgai Ruby Gem을 만들어, 다음을 지원하는 데이터베이스 클론에 대한 액세스를 크게 간소화했습니다:

만약 psql 액세스가 있다면, 아래 단계를 따라 pgai Gem을 구성할 수 있습니다:

  1. 시작하려면 Postgres.ai instances 페이지에서 몇 가지 값을 모아야 합니다:

    1. 구성하려는 인스턴스로 이동하고 오른쪽에 있는 메뉴를 선택하세요.
    2. 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
      
  2. 다음 스니펫을 SSH 구성 파일인 ~/.ssh/config에 추가하고 변수 값을 대체하세요:

    Host pgai-proxy
      HostName <postgresai-proxy>
      User <postgresai-user>
      IdentityFile ~/.ssh/id_ed25519
    
  3. 서버 키 지문을 수락하려면 다음 명령을 실행하세요:

    ssh pgai-proxy
    
  4. 다음 명령을 실행하세요:

    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>
    
  5. 이 일회성 구성이 완료되면, pgai connect를 사용하여 특정 데이터베이스에 연결할 수 있습니다. 예를 들어, main 데이터베이스에 연결하려면:

    pgai connect main
    
  6. 클론 사용이 완료되었으면, 해당 클론을 제거할 수 있습니다:

    pgai destroy main
    

Postgres.ai instances 페이지를 통한 수동 액세스

psql 액세스가 있는 팀 멤버는 psql을 통해 클론에 직접 액세스할 수 있습니다. psql 액세스를 통해 메타데이터뿐만 아니라 데이터도 볼 수 있습니다.

psql을 사용하여 클론에 연결하려면:

  1. 원하는 인스턴스에서 클론을 만듭니다.
    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를 사용하여 사용 가능한 데이터베이스를 확인합니다).

연결한 후에는, 생산 환경과 유사하게 클론을 사용하지만, 격리된 기록 가능한 환경의 추가 혜택과 안전성이 제공됩니다.