Database Lab과 Postgres.ai
GitLab v19.1GitLab 내부 사용자는 복제된 프로덕션 데이터에서 데이터베이스 쿼리 성능을 테스트하기 위해 Database Lab Engine(DLE)과 postgres.ai에 접근할 수 있습니다. Google로 로그인을 선택합니다.
GitLab 내부 사용자는 복제된 프로덕션 데이터에서 데이터베이스 쿼리 성능을 테스트하기 위해 Database Lab Engine(DLE)과 postgres.ai에 접근할 수 있습니다. 일반적인 읽기 전용 프로덕션 복제본과 달리, DLE에서는 행을 생성, 업데이트, 삭제할 수도 있습니다. 또한 프로덕션 데이터의 격리된 복사본에서 추가 인덱스나 칼럼과 같은 스키마 변경 사항의 성능을 테스트할 수 있습니다. 데이터베이스의 새 스냅샷은 일반적으로 4시간마다 생성됩니다.
Database Lab 빠른 시작#
-
Google로 로그인을 선택합니다. (GitLab이 아닌 Google SSO를 사용하여 프로젝트에 연결해야 합니다.)
-
로그인 후 GitLab 조직을 선택하고 사이드바에서 "Joe Bot"을 선택한 다음 "Ask Joe"를 방문합니다.
-
테스트할 데이터베이스를 선택합니다:
GitLab 프로젝트의 대부분의 쿼리는 gitlab-production-main에 대해 실행됩니다.
-
CI 테이블에 대한 쿼리인 경우
gitlab-production-ci를 선택합니다. -
컨테이너 레지스트리에 대한 쿼리인 경우
gitlab-production-registry를 선택합니다. -
채팅 박스에
explain <쿼리 텍스트>를 입력하여 플랜을 가져옵니다.
Database Lab Engine 접근#
DLE 접근은 다음의 경우에 유용합니다:
-
데이터베이스 리뷰어 및 유지보수 담당자.
-
데이터베이스에 큰 영향을 주는 머지 리퀘스트를 작업하는 엔지니어.
DLE의 서비스에 접근하려면 다음을 수행할 수 있습니다:
-
Postgres.ai 웹 콘솔에서 쿼리 테스트를 수행합니다. 직원들은 GitLab Google 계정으로 두 서비스 모두에 접근합니다. 쿼리 테스트는 거기서 실행된 쿼리에 대한
EXPLAIN(analyze, buffers) 플랜을 제공합니다. -
머지 리퀘스트의 일부로 job을 트리거하여 마이그레이션 테스트를 수행합니다.
-
프로덕션 복제본 대신 DLE에 직접
psql접근을 합니다. 승인된 사용자만 사용 가능합니다.psql접근을 요청하려면 접근 요청을 제출하세요.
추가 도움이 필요하면 #database Slack 채널을 이용하세요.
Database Lab 클론 대신 프로덕션 복제본에 임시로만 접근이 필요한 경우, Teleport를 통한 데이터베이스 콘솔 연결을 위한 런북 절차를 따르세요. 이 절차는 Teleport를 통한 Rails 콘솔 접근과 유사합니다.
쿼리 테스트#
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 (restricted_visibility_levels)
테이블에 지정된 인덱스를 생성합니다. 새 인덱스를 활용하여 쿼리를 테스트할 수 있습니다. exec는 어떤 결과도 반환하지 않으며, 쿼리를 실행하는 데 걸린 시간만 반환합니다.
클론 초기화#
파괴적인 쿼리나 비효율적인 인덱스와 같이 많은 변경을 수행한 후에는 처음부터 다시 시작해야 합니다. 지정된 클론을 초기화하려면 reset을 실행합니다.
인덱스 확인#
Database 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은 다음과 같은 오류를 반환합니다:
ERROR: psql error: psql:/tmp/psql-query-932227396:1: error: Did not find any relation named "no_index".
마이그레이션 테스트#
마이그레이션 테스트에 대한 자세한 내용은 데이터베이스 마이그레이션 테스트 문서를 참조하세요.
psql로 콘솔 접근#
psql로 콘솔에 접근하려면 AllFeaturesUser psql 접근 권한이 있어야 합니다.
데이터베이스 lab 인스턴스에 접근하려면 다음이 필요합니다:
-
SSH 키와
db-lab권한이 포함된 chef-repo의 사용자 데이터 백 항목이 있어야 합니다. 예시: MR. -
AllFeaturesUser는 postgres.ai에서 부여되는 기본 권한입니다. 아직 없다면#g_database_frameworksSlack 채널에 게시하고@db-team을 태그하여 권한을 추가해 달라고 요청하세요. -
다음과 같이
ssh를 구성합니다:
Host lb-bastion.db-lab.gitlab.com
# Typically, the username is `name` in `name@gitlab.com`
# or your GitLab's username.
# Check with the access provisioner if it is not working.
# If not provided, defaults to your system username.
User YOUR_USERNAME_HERE
# Path to your SSH key. Adjust or remove if using a different key or SSH agent.
IdentityFile ~/.ssh/id_ed25519
Host *.gitlab-db-lab.internal
User YOUR_USERNAME_HERE # Same as above.
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_ed25519 # Same as above.
ProxyCommand ssh lb-bastion.db-lab.gitlab.com -W %h:%p
Postgres.ai 인스턴스 페이지를 통한 수동 접근#
psql 접근 권한이 있는 팀원은 psql을 통해 클론에 직접 접근할 수 있습니다. psql 접근을 통해 메타데이터뿐만 아니라 실제 데이터를 볼 수 있습니다.
psql을 사용하여 클론에 연결하려면:
- 원하는 인스턴스에서 클론을 생성합니다.
Clone ID를 제공합니다: yourname-testing-gitlabissue와 같이 클론을 고유하게 식별하는 이름을 지정합니다.
-
Database username과 Database password를 제공합니다:
psql을 클론에 연결합니다. -
클론을 유지해야 하는 경우 Enable deletion protection을 선택합니다. 이 옵션 선택은 피하세요. 클론은 12시간 후에 삭제됩니다.
-
Postgres.ai 웹 인터페이스의 Clone details 페이지에서 클론에 대한 SSH 포트 포워딩을 시작하는 명령을 복사하여 실행합니다.
-N 플래그와 함께 명령을 실행하도록 제안될 수 있으며, 이는 셸이 시작되지 않음을 의미하므로 성공적으로 실행되면 어떤 출력도 예상하지 않아야 합니다.
-
선택적으로
~/.ssh/config에LogLevel DEBUG3을 추가하여 상세한 디버깅 정보를 출력할 수 있습니다. -
명령을 실행한 후 포트 포워딩을 활성 상태로 유지하기 위해 실행 중인 상태로 두고, 새 터미널 탭을 열어 다음 단계를 진행합니다.
-
Postgres.ai 웹 인터페이스의 Clone details 페이지에서
psql연결 문자열을 복사하여 실행합니다. 설정 시 제공한 비밀번호를 사용하고dbname을gitlabhq_dblab으로 설정합니다(또는 동일한 쿼리 문자열에dbname=postgres를 사용하여psql -l로 어떤 데이터베이스가 사용 가능한지 확인합니다).
연결 후에는 격리된 쓰기 가능한 환경의 추가 이점과 안전성을 갖추면서 프로덕션의 psql 콘솔처럼 클론을 사용합니다.
pgai Ruby gem을 통한 간편 접근#
pgai Ruby gem 사용 방법에 대한 안내는 pgai Ruby gem을 사용한 Database Lab 접근을 참조하세요.