Database Lab 및 Postgres.ai

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

Database Lab 빠른 시작

  1. 콘솔을 방문.
  2. Google 계정으로 로그인을 선택합니다. (프로젝트와 연결하려면 Google SSO가 필요하여 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 슬랙 채널을 사용하세요.

note
만약 Database Lab 복제본 대신에 프로덕션 복제본에 일시적인 액세스만 필요한 경우, Teleport를 사용하여 데이터베이스 콘솔에 연결하는 방법에 대한 절차를 따르세요. 이 절차는 Teleport를 사용한 Rails 콘솔 액세스와 비슷합니다.

쿼리 테스트

데이터베이스 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로 끝납니다:

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이 no_index와 같은 오류를 반환합니다:

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

마이그레이션 테스트

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

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

note
psql 콘솔에 액세스하려면 AllFeaturesUser psql 액세스가 필요합니다.

pgai Ruby gem을 통한 간편한 액세스

@mbobinpgai Ruby Gem을 만들었으며, 이 Gem은 다음을 지원하여 데이터베이스 클론에 대한 액세스를 크게 단순화합니다:

AllFeaturesUser psql 액세스가 있는 경우, 다음 단계를 따라 pgai Gem을 구성할 수 있습니다:

  1. 시작하려면 Postgres.ai 인스턴스 페이지에서 몇 가지 값들을 수집해야 합니다:

    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/config에 추가하여 SSH 구성 파일에 붙여넣습니다. 변수 값으로 대체합니다.

    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
       
    # https://console.postgres.ai/gitlab/instances에서 사용할 인스턴스(이 경우 `main` 데이터베이스 인스턴스)에 대한 해당 포트 값을 가져옵니다
    pgai env add --alias main --id <environment-id> --port <environment-port>
    
  5. 이 일회성 구성이 완료되면 pgai connect를 사용하여 특정 데이터베이스에 연결할 수 있습니다. 예를 들어 main 데이터베이스에 연결하려면:

    pgai connect main
    
  6. 클론 사용이 완료되면 해당 클론을 파기할 수 있습니다:

    pgai destroy main
    

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을 사용하여 사용 가능한 데이터베이스를 확인합니다.

연결한 후, 프로덕션 환경과 동일하게 psql 콘솔을 사용하여 클론을 사용할 수 있지만 격리된 쓰기 가능한 환경의 추가 혜택과 안전성을 누릴 수 있습니다.