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

자동 마이그레이션 테스트 파이프라인을 사용하면 Database Lab을 통해 프로덕션과 유사한 환경에서 마이그레이션을 자동으로 테스트할 수 있습니다. 이는 아키텍처 설계 문서에 기초합니다.

마이그레이션 테스트는 새로운 데이터베이스 마이그레이션을 추가하는 변경 사항에 대해 GitLab 프로젝트에서 활성화됩니다. “test” 단계 내에서 db:gitlabcom-database-testing 작업을 수동으로 실행하여 이 작업을 트리거할 수 있습니다. 리소스를 낭비하지 않도록, MR이 리뷰에 준비되었을 때에만 해당 작업을 실행하십시오. 추가로, 해당 MR이 “database” 라벨을 포함해야 파이프라인이 test 단계에 나타납니다.

해당 작업은 ops GitLab 인스턴스에서 파이프라인을 시작합니다. 보안상의 이유로, 데이터베이스 유지 보수자만이 파이프라인에 액세스할 수 있습니다.

파이프라인이 시작되면 봇이 MR에 댓글로 알림을 표시합니다. 마치면 댓글이 테스트 결과로 업데이트됩니다.

댓글에는 mainci 데이터베이스에 대한 테스트 정보가 포함되어 있습니다. 각 테스트된 데이터베이스에는 아래 설명된 네 가지 섹션이 있습니다.

요약

해당 댓글의 첫 번째 섹션에는 다음과 같은 테스트 결과에 대한 요약이 포함됩니다:

  • 경고 - 예외 또는 긴 실행 쿼리와 같은 중요한 문제를 강조합니다.
  • 마이그레이션 - 각 마이그레이션이 완료된 데 걸린 시간, 성공 여부 및 데이터베이스 크기의 증가량을 보여줍니다.
  • 실행 시간 히스토그램 - 이 섹션을 확장하여 마이그레이션 전체에서 쿼리 실행 시간의 히스토그램을 볼 수 있습니다.

마이그레이션 세부 정보

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

  • 세부 정보 - 마이그레이션 유형, 전체 기간 및 데이터베이스 크기 변경 사항을 보여줍니다.
  • 쿼리 - 마이그레이션 중 실행된 모든 쿼리로, 호출 수, 타이밍 및 변경된 행의 수와 함께 나와 있습니다.
  • 실행 시간 히스토그램 - 마이그레이션의 쿼리 시간 분포를 나타냅니다.

데이터베이스 크기 증가

가끔씩, 예상치 않게 마이그레이션은 +8.00 KiB 크기 증가를 보일 수 있습니다. 모든 마이그레이션 완료시 schema_migrations 테이블에 새로운 행이 추가됩니다. 이는 새로운 디스크 페이지를 생성할 수 있으며, 그러면 데이터베이스의 크기가 정확히 8 KiB 증가합니다.

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

댓글의 다음 섹션에는 배치로 실행되는 각 배경 마이그레이션에 대한 상세 정보가 포함되어 있습니다. 이는 다음 내용을 포함합니다:

  • 샘플링 정보 - 이 테스트 실행 중에 샘플링 된 배치 수를 보여줍니다. 샘플링된 배치는 테이블 ID 범위 전체에서 균일하게 선택됩니다. 샘플링은 각 배경 마이그레이션에 골고루 나뉘어 총 30분간 실행됩니다.
  • 집계된 쿼리 정보 - 샘플링된 배치 전체에서 실행된 각 쿼리에 대한 집계된 데이터를 보여줍니다. 이는 호출 수, 실행 시간 및 변경된 행의 수를 포함합니다.
  • 배치 실행 시간 히스토그램 - 배경 마이그레이션에서 샘플링된 각 배치의 실행 시간에 대한 히스토그램입니다.
  • 쿼리 실행 시간 히스토그램 - 이 배경 마이그레이션의 모든 배치에서 실행된 모든 쿼리에 대한 실행 시간 히스토그램입니다.

복제본 세부 정보 및 결과물

댓글의 하단에는 추가 정보가 포함되어 있습니다:

  • GitLab.com에 대기 중인 마이그레이션 - 아직 GitLab.com에 배포되지 않은 마이그레이션에 대한 요약이 포함됩니다. 이 정보는 병합되었지만 아직 배포되지 않은 마이그레이션을 테스트할 때 유용합니다.
  • 복제본 세부 정보 - 이 테스트 파이프라인에서 생성된 Postgres.ai의 thin 복제본에 대한 링크와 그 만료 정보가 포함됩니다. 이는 마이그레이션 실행 결과를 자세히 살펴볼 때 사용할 수 있습니다. 데이터베이스 유지 보수자 또는 액세스 요청으로만 액세스할 수 있습니다.
  • 결과물 - 파이프라인 결과물에 대한 링크가 있습니다. 각 마이그레이션에 대한 전체 쿼리 로그(확장자 .log)는 여기에서 제공됩니다. 또한 배치로 샘플링된 배경 마이그레이션 배치의 세부 정보도 제공됩니다.

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

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

  1. GitLab Org에 대한 병합 요청
  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의 테스트할 브랜치의 커밋 SHA

# 다음은 각 호출 간에 변경되지 않아야 합니다:
CI_JOB_URL='https://gitlab.com/gitlab-org/database-team/gitlab-com-database-testing/-/jobs/1590162939'
# 파이프라인이 정상적으로 실행되기 위해 CI_JOB_URL을 특별히 설정해야 하는 것으로 보이지는 않지만, 이는 일반적으로 DB 테스트 파이프라인을 호출하는 상위 작업의 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"