데이터베이스 마이그레이션 파이프라인

자동화된 마이그레이션 테스트 파이프라인을 통해 프로덕션과 유사한 환경에서 마이그레이션을 자동으로 테스트할 수 있습니다( Database Lab 사용).

이것은 아키텍처 디자인 문서에 기반합니다.

마이그레이션 테스트는 데이터베이스 마이그레이션을 추가하는 변경 사항에 대해 GitLab 프로젝트에서 활성화됩니다.

test 단계 내에서 db:gitlabcom-database-testing 작업을 실행하여 이 작업을 수동으로 트리거하세요. 리소스를 낭비하지 않으려면 MR(병합 요청)이 검토 준비가 되었을 때만 이 작업을 실행하세요. 또한, 파이프라인이 테스트 단계에 나타나기 위해 MR에 “database” 레이블이 있어야 합니다.

작업은 ops GitLab 인스턴스에서 파이프라인을 시작합니다.

보안상의 이유로 파이프라인에 대한 접근은 데이터베이스 유지 관리자로 제한됩니다.

파이프라인이 시작되면 봇이 병합 요청에 댓글로 알림을 보냅니다.

완료되면 댓글이 테스트 결과로 업데이트됩니다.

댓글에는 mainci 데이터베이스에 대한 테스트 정보가 포함됩니다.

테스트된 각 데이터베이스는 아래에 설명된 네 가지 섹션으로 나뉩니다.

요약

댓글의 첫 번째 섹션에는 테스트 결과의 요약이 포함되어 있습니다.

  • 경고 - 예외나 긴 쿼리와 같은 중대한 문제를 강조합니다.
  • 마이그레이션 - 각 마이그레이션이 완료된 데 걸린 시간, 성공 여부 및 데이터베이스 크기의 증가를 포함합니다.
  • 실행 시간 히스토그램 - 이 섹션을 펼쳐 모든 마이그레이션에서 쿼리 실행 시간의 히스토그램을 확인하세요.

마이그레이션 세부정보

댓글의 다음 섹션에는 각 마이그레이션에 대한 세부 정보가 포함되어 있습니다.

  • 세부정보 - 마이그레이션 유형, 총 소요 시간 및 데이터베이스 크기 변동.
  • 쿼리 - 마이그레이션 중 실행된 모든 쿼리와 호출 수, 시간 및 변경된 행의 수.
  • 실행 시간 히스토그램 - 마이그레이션의 쿼리 시간 분포를 나타냅니다.

데이터베이스 크기 증가

때때로 마이그레이션에서 예상치 못한 크기 증가가 발생할 수 있습니다. 마이그레이션이 완료되면 schema_migrations 테이블에 행이 추가되며, 이로 인해 새로운 디스크 페이지가 생성될 수 있습니다.

새 디스크 페이지가 생성되면 데이터베이스의 크기는 정확히 8 KiB만큼 증가합니다.

배경 마이그레이션 세부정보

댓글의 다음 섹션에는 각 배치 배경 마이그레이션에 대한 세부 정보가 포함되어 있습니다.

  • 샘플링 정보 - 이 테스트 실행 동안 샘플링된 배치 수. 샘플링된 배치는 테이블의 ID 범위를 기준으로 균일하게 선택됩니다. 샘플링은 30분 동안 진행되며, 테스트할 각 배경 마이그레이션에 고르게 분산됩니다.
  • 집계 쿼리 정보 - 샘플링된 모든 배치에서 실행된 각 쿼리에 대한 집계 데이터와 호출 수, 시간 및 변경된 행의 수.
  • 배치 실행 시간 히스토그램 - 배경 마이그레이션의 샘플링된 각 배치의 실행 시간 히스토그램.
  • 쿼리 실행 시간 히스토그램 - 이 배경 마이그레이션의 모든 배치에서 실행된 쿼리의 실행 시간 히스토그램.

클론 세부정보 및 아티팩트

댓글 하단에는 추가 정보가 포함됩니다.

  • GitLab.com에서 보류 중인 마이그레이션 - 아직 GitLab.com에 배포되지 않은 마이그레이션 요약입니다. 이 정보는 병합되었지만 아직 배포되지 않은 마이그레이션을 테스트할 때 유용합니다.
  • 클론 세부정보 - 이 테스트 파이프라인을 위해 생성된 Postgres.ai 얇은 클론에 대한 링크와 만료 정보가 포함되어 있습니다. 이를 통해 마이그레이션 실행 결과를 추가로 탐색할 수 있습니다. 데이터베이스 유지 관리자가 아니면 접근 요청이 필요합니다.
  • 아티팩트 - 파이프라인의 아티팩트 링크입니다. 각 마이그레이션에 대한 전체 쿼리 로그( .log로 끝남)가 여기에서 제공되며, 데이터베이스 유지 관리자가 아니면 접근 요청이 필요합니다. 샘플링된 특정 배치 배경 마이그레이션 배치의 세부정보도 제공됩니다.

데이터베이스 테스트 파이프라인에 대한 변경 사항 테스트

데이터베이스 테스트 파이프라인 자체에 대한 변경 사항을 테스트하려면 다음이 필요합니다:

  1. GitLab Org에 대한 병합 요청(Merge Request).
  2. 테스트할 변경 사항은 GitLab Ops의 브랜치에 있어야 합니다.

다음의 셀프 문서화된 스크립트를 사용하여 GitLab Org에서 GitLab Ops의 임의의 브랜치에 대한 병합 요청을 테스트할 수 있습니다:

#! /usr/bin/env bash

# 다음은 호출당 설정해야 합니다:
TESTING_TRIGGER_TOKEN='[REDACTED]'              # 프로젝트의 CI 섹션에서 생성된 테스트 트리거 토큰
CI_COMMIT_REF_NAME='55-post-notice-on-failure'  # 실행할 ops의 브랜치
CI_MERGE_REQUEST_IID='117901'                   # 테스트할 gitlab.com에서의 MR의 병합 요청 ID
SHA="fed6dd8a58d75a0e053a4972765b4fc08c5814a3"  # gitlab-org/gitlab에서 테스트할 브랜치의 HEAD 커밋 SHA

# 다음은 호출 간에 변경되지 않아야 합니다:
CI_JOB_URL='https://gitlab.com/gitlab-org/database-team/gitlab-com-database-testing/-/jobs/1590162939'
# CI_JOB_URL은 파이프라인이 성공적으로 실행되기 위해 특정한 것으로 설정될 필요는 없어 보입니다.
# 하지만 이는 일반적으로 데이터베이스 테스트 파이프라인을 호출하는 상위 작업의 URL이 됩니다.
CI_MERGE_REQUEST_PROJECT_ID='278964'    # gitlab-org/gitlab의 숫자 ID. 변경되지 않아야 합니다.
CI_PROJECT_ID="gitlab-org/gitlab"       # gitlab-org/gitlab을 식별하는 슬러그.

curl --verbose --request POST \
     --form "token=$TESTING_TRIGGER_TOKEN" \
     --form "ref=$CI_COMMIT_REF_NAME" \
     --form "variables[TOP_UPSTREAM_MERGE_REQUEST_IID]=$CI_MERGE_REQUEST_IID" \
     --form "variables[TOP_UPSTREAM_MERGE_REQUEST_PROJECT_ID]=$CI_MERGE_REQUEST_PROJECT_ID" \
     --form "variables[TOP_UPSTREAM_SOURCE_JOB]=$CI_JOB_URL" \
     --form "variables[TOP_UPSTREAM_SOURCE_PROJECT]=$CI_PROJECT_ID" \
     --form "variables[VALIDATION_PIPELINE]=true" \
     --form "variables[GITLAB_COMMIT_SHA]=$SHA" \
     --form "variables[TRIGGER_SOURCE]=$CI_JOB_URL" \
     "https://ops.gitlab.net/api/v4/projects/429/trigger/pipeline"