Database Lab 및 Postgres.ai
금일 기술 블로그에서는 GitLab 내부 사용자들이 복제된 프로덕션 데이터로 데이터베이스 쿼리의 성능을 테스트하기 위해 Database Lab Engine (DLE) 및 postgres.ai에 액세스할 수 있습니다. 일반적인 읽기 전용 프로덕션 복제와 달리 DLE에서는 또한 행을 만들거나 수정, 삭제할 수 있습니다. 또한 프로덕션 데이터의 격리된 복사본에서 추가적인 인덱스나 열 등 스키마 변경의 성능도 테스트할 수 있습니다.
Database Lab 빠른 시작
- 콘솔을 방문.
- Google 계정으로 로그인을 선택합니다. (프로젝트와 연결하려면 Google SSO가 필요하여 GitLab이 아닌 Google SSO를 선택하세요.)
- 로그인한 후, GitLab 조직을 선택하고 측면 표시줄의 “Ask Joe”를 방문하세요.
- 다음 중 테스트할 데이터베이스를 선택합니다:
- GitLab 프로젝트에 대한 대부분의 쿼리는
gitlab-production-main
에서 실행됩니다. - 만약 쿼리가 CI 테이블이라면
gitlab-production-ci
를 선택하세요. - 컨테이너 레지스트리에 대한 쿼리라면
gitlab-production-registry
를 선택하세요.
- GitLab 프로젝트에 대한 대부분의 쿼리는
- 채팅 상자에
explain <쿼리 텍스트>
를 입력하여 계획을 받으세요.
Database Lab Engine 액세스
DLE에 액세스하는 것은 다음과 같은 경우 도움이 됩니다:
- 데이터베이스 리뷰어 및 유지보수자.
- 데이터베이스에 큰 영향을 미치는 Merge Request을 작업하는 엔지니어들.
DLE의 서비스에 액세스하려면 다음을 수행할 수 있습니다:
- Postgres.ai 웹 콘솔에서 쿼리 테스트를 수행합니다. 직원은 GitLab Google 계정으로 두 서비스에 액세스합니다. 쿼리 테스트는 거기서 실행된 쿼리에 대한
EXPLAIN
(분석, 버퍼) 계획을 제공합니다. - Merge Request의 일부로 작업을 트리거하여 마이그레이션 테스트를 수행합니다.
- 인증된 사용자만 DLE에 대한
psql
액세스를 직접합니다.psql
액세스를 요청하려면 액세스 요청를 제출하세요.
더 많은 도움이 필요한 경우 #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
로 끝납니다:
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
을 사용하여 콘솔에 액세스하기
pgai
Ruby gem을 통한 간편한 액세스
@mbobin은 pgai
Ruby Gem을 만들었으며,
이 Gem은 다음을 지원하여 데이터베이스 클론에 대한 액세스를 크게 단순화합니다:
- Postgres.ai 인스턴스 페이지에 나열된 모든 데이터베이스 클론에 액세스합니다.
- 동일한 클론에서 여러
psql
세션을 사용합니다.
AllFeaturesUser
psql
액세스가 있는 경우, 다음 단계를 따라 pgai
Gem을 구성할 수 있습니다:
-
시작하려면 Postgres.ai 인스턴스 페이지에서 몇 가지 값들을 수집해야 합니다:
- 구성하려는 인스턴스로 이동하고 화면 오른쪽에서 다음을 선택합니다.
-
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/config
에 추가하여 SSH 구성 파일에 붙여넣습니다. 변수 값으로 대체합니다.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 # https://console.postgres.ai/gitlab/instances에서 사용할 인스턴스(이 경우 `main` 데이터베이스 인스턴스)에 대한 해당 포트 값을 가져옵니다 pgai env add --alias main --id <environment-id> --port <environment-port>
-
이 일회성 구성이 완료되면
pgai connect
를 사용하여 특정 데이터베이스에 연결할 수 있습니다. 예를 들어main
데이터베이스에 연결하려면:pgai connect main
-
클론 사용이 완료되면 해당 클론을 파기할 수 있습니다:
pgai destroy main
Postgres.ai 인스턴스 페이지를 통한 매뉴얼 액세스
psql
액세스 권한이 있는 팀 구성원은 psql
을 통해 클론에 직접 액세스할 수 있습니다.
psql
액세스를 통해 데이터가 아닌 메타데이터를 볼 수 있습니다.
psql
을 사용하여 클론에 연결하는 방법:
-
원하는 인스턴스에서 클론을 생성합니다.
-
클론 ID 제공:
yourname-testing-gitlabissue
와 같이 클론을 고유하게 식별하는 값 제공 -
데이터베이스 사용자 이름 및 데이터베이스 암호 제공:
psql
을 클론에 연결합니다. - 클론을 유지하려면 삭제 보호 기능 활성화를 선택합니다. 이 옵션을 선택하지 않도록 합니다. 클론은 12시간 후에 제거됩니다.
-
클론 ID 제공:
- Postgres.ai 웹 인터페이스의 클론 상세 정보 페이지에서 클론에 대한 SSH 포트 포워딩을 시작하는 명령을 복사하여 실행합니다.
- Postgres.ai 웹 인터페이스의 클론 상세 정보 페이지에서
psql
연결 문자열을 복사하여 실행합니다. 설정 시 제공된 암호를 사용하고dbname
을gitlabhq_dblab
으로 설정하거나 동일한 쿼리 문자열을 사용하여psql -l
을 사용하여 사용 가능한 데이터베이스를 확인합니다.
연결한 후, 프로덕션 환경과 동일하게 psql
콘솔을 사용하여 클론을 사용할 수 있지만 격리된 쓰기 가능한 환경의 추가 혜택과 안전성을 누릴 수 있습니다.