배경 마이그레이션 및 업그레이드
- 배치된 백그라운드 마이그레이션은 GitLab 13.11에서 도입되었으며
execute_batched_migrations_on_schedule
이라는 플래그로 동기화되었습니다. 기본적으로 비활성화됩니다. - 피처 플래그execute_batched_migrations_on_schedule
이 GitLab 13.12에서 기본적으로 활성화되었습니다. - GitLab Self-managed 인스턴스의 경우, GitLab 관리자는 이를 비활성화할 수 있습니다.
특정 릴리스는 더 높은 버전으로 업데이트하기 전에 다양한 마이그레이션이 완료되어야 할 수 있습니다. 두 가지 유형의 마이그레이션이 존재합니다. 이들은 다르며 GitLab을 업그레이드하기 전에 둘 다 완료되었는지 확인해야 합니다:
- GitLab 14.0 이상에서 가장 흔히 사용되는 배치된 백그라운드 마이그레이션.
- 배치 처리되지 않는 백그라운드 마이그레이션. GitLab 13.11 이하에서 가장 흔히 사용됩니다.
이러한 마이그레이션을 완료하는 데 필요한 시간을 줄이기 위해 Sidekiq 워커의 수를 늘릴 수 있습니다. 이 워커들은 background_migration
큐에서 작업을 처리할 수 있습니다.
배치된 백그라운드 마이그레이션
데이터베이스 테이블을 일괄로 업데이트하기 위해 GitLab은 배치된 백그라운드 마이그레이션을 사용할 수 있습니다. 이러한 마이그레이션은 GitLab 개발자들에 의해 생성되며 업그레이드시 자동으로 실행됩니다. 그러나 이러한 마이그레이션은 일부 integer
데이터베이스 열을 bigint
로 이동하는 데 도움이 되기 위해 범위가 제한됩니다. 이는 일부 테이블의 정수 오버플로우를 방지하기 위해서 필요합니다.
일부 설치에서는 그 업그레이드에 의해 도입된 데이터베이스 변경 사항을 완료하려면 GitLab 14.0을 적어도 하루동안 실행해야 할 수 있습니다.
배치된 백그라운드 마이그레이션은 Sidekiq에 의해 처리되며 분리되어 실행되므로 마이그레이션이 진행되는 동안 인스턴스는 여전히 운영할 수 있습니다. 그러나 배치된 배경 마이그레이션을 실행하는 동안 적극적으로 사용되는 큰 인스턴스에서 성능이 저하될 수 있습니다. 모든 마이그레이션이 완료될 때까지 Sidekiq 상태를 적극적으로 모니터링해야 합니다.
배치된 백그라운드 마이그레이션의 상태 확인
배치된 백그라운드 마이그레이션의 상태를 GitLab UI에서 확인하거나 데이터베이스를 직접 쿼리하여 확인할 수 있습니다. GitLab을 업그레이드하기 전에 모든 마이그레이션이 Finished
상태여야 합니다.
만약 마이그레이션이 완료되지 않은 채로 GitLab을 업그레이드하려고 하면 다음과 같은 오류가 발생할 수 있습니다.
Expected batched background migration for the given configuration to be marked
as 'finished', but it is 'active':
이 오류가 발생하면, GitLab 업그레이드에 필요한 배치된 백그라운드 마이그레이션을 완료하는 방법에 대한 옵션을 검토하세요.
GitLab UI에서
사전 요구 사항:
- 인스턴스에 대한 관리자 액세스 권한이 있어야 합니다.
배치된 백그라운드 마이그레이션의 상태를 확인하려면 다음을 수행하세요:
- 왼쪽 사이드바에서 가장 아래쪽으로 이동하여 관리 영역을 선택합니다.
- Monitoring > 배경 마이그레이션을 선택합니다.
- 미완료된 마이그레이션을 보려면 Queued 또는 Finalizing을 선택하고, 실패한 마이그레이션은 Failed를 선택합니다.
데이터베이스에서
사전 요구 사항:
- 인스턴스에 대한 관리자 액세스 권한이 있어야 합니다.
배치된 백그라운드 마이그레이션의 상태를 직접 쿼리하기 위해 다음을 수행하세요:
- 인스턴스의 설치 방법에 따라
psql
프롬프트에 로그인합니다. 예를 들어, Linux 패키지 설치의 경우sudo gitlab-psql
을 실행합니다. -
부분적으로 완료된 배치된 백그라운드 마이그레이션에 대한 자세한 내용을 보려면
psql
세션에서 다음 쿼리를 실행합니다:SELECT job_class_name, table_name, column_name, job_arguments FROM batched_background_migrations WHERE status <> 3;
대신, 배치된 백그라운드 마이그레이션의 상태를 확인하기 위해 gitlab-psql -c "<쿼리>"
로 해당 쿼리를 래핑할 수 있습니다.
gitlab-psql -c "SELECT job_class_name, table_name, column_name, job_arguments FROM batched_background_migrations WHERE status <> 3;"
쿼리가 0개의 행을 반환하면 모든 배치된 백그라운드 마이그레이션이 완료된 것입니다.
고급 기능 활성화 또는 비활성화
배치된 백그라운드 마이그레이션은 마이그레이션을 사용자 정의하거나 일시 중지할 수 있는 피처 플래그를 제공합니다. 이러한 피처 플래그는 그 사용 위험을 이해하는 고급 사용자들만이 비활성화해야 합니다.
GitLab 14.x에서 배치된 백그라운드 마이그레이션 일시 중지하기
계속 중인 배치된 백그라운드 마이그레이션을 일시 중지하려면 배치된 백그라운드 마이그레이션 기능을 비활성화하세요. 이 기능을 비활성화하면 현재 배치 마이그레이션을 완료한 후 기능이 다시 활성화될 때 다음 배치를 시작하기 전까지 기다립니다.
사전 요구 사항:
- 인스턴스에 대한 관리자 액세스 권한이 있어야 합니다.
현재 진행 중인 배치된 백그라운드 마이그레이션의 상태를 확인하기 위해 다음 데이터베이스 쿼리를 사용하세요:
-
실행 중인 마이그레이션의 ID를 확인합니다:
SELECT id, job_class_name, table_name, column_name, job_arguments FROM batched_background_migrations WHERE status <> 3;
-
이전 단계에서 얻은 ID로 다음 쿼리를 실행하여 마이그레이션의 상태를 확인합니다:
SELECT started_at, finished_at, finished_at - started_at AS duration, min_value, max_value, batch_size, sub_batch_size FROM batched_background_migration_jobs WHERE batched_background_migration_id = XX ORDER BY id DESC limit 10;
-
몇 분 내에 여러 번 쿼리를 실행하여 새로운 행이 추가되지 않았는지 확인합니다. 새로운 행이 추가되지 않았다면 마이그레이션이 일시 중지된 것입니다.
-
마이그레이션이 일시 중지되었다는 것을 확인한 후에 (위의
enable
명령어를 사용하여) 준비가 되면 배치를 계속할 수 있도록 마이그레이션을 다시 시작합니다. 큰 인스턴스의 경우, 백그라운드 마이그레이션은 각 배치마다 최대 48시간이 소요될 수 있습니다.
자동 배치 사이즈 최적화
-
GitLab 13.2에 도입되었습니다.
optimize_batched_migrations
라는 플래그로 administration/feature_flags.md에서 활성화됩니다.
플래그:
Self-managed GitLab의 경우, 기본적으로 이 기능을 사용할 수 있습니다. 기능을 숨기려면 관리자에게 optimize_batched_migrations
라는 플래그를 비활성화할 것을 요청하십시오.
GitLab.com의 경우 이 기능을 사용할 수 있습니다. GitLab Dedicated의 경우 이 기능을 사용할 수 없습니다.
일괄 배경 마이그레이션의 처리량을 최대화하기 위해(시간 단위당 업데이트된 튜플 수 기준으로) 배치 크기는 이전 배치를 완료하는 데 걸린 시간에 따라 자동으로 조정됩니다.
병렬 실행
-
GitLab 15.7에 도입되었습니다. 기본으로 비활성화된
batched_migrations_parallel_execution
라는 플래그로 활성화됩니다. - GitLab 15.11에 GitLab.com에서 활성화되었습니다.
-
GitLab 16.1에서 일반적으로 사용할 수 있습니다. 피처 플래그
batched_migrations_parallel_execution
가 제거되었습니다.
일괄 배경 마이그레이션의 실행 속도를 높이기 위해 두 개의 마이그레이션이 동시에 실행됩니다.
GitLab 관리자는 GitLab Rails 콘솔에 액세스할 수 있습니다. 이를 통해 동시에 실행되는 일괄 배경 마이그레이션의 수를 변경할 수 있습니다:
ApplicationSetting.update_all(database_max_running_batched_background_migrations: 4)
실패한 일괄 배경 마이그레이션 해결
일괄 배경 마이그레이션이 실패하면, 수정하고 다시 시도하십시오. 마이그레이션이 오류로 계속 실패하는 경우:
마이그레이션 수정 및 다시 시도
- GitLab 14.3에 도입되었습니다.
모든 실패한 일괄 배경 마이그레이션은 GitLab의 새 버전으로 업그레이드하기 위해 해결되어야 합니다. 마이그레이션의 상태를 확인하면 일부 마이그레이션이 Failed 탭에 failed 상태로 표시될 수 있습니다:
일괄 배경 마이그레이션이 실패한 이유를 확인하려면 실패 오류 로그를 확인하거나 UI에서 오류 정보를 확인하십시오.
전제 조건:
- 인스턴스에 관리자 액세스해야 합니다.
- 왼쪽 사이드바에서 아래쪽에서 관리 영역을 선택합니다.
- 모니터링 > 배경 마이그레이션을 선택합니다.
- Failed 탭을 선택합니다. 이렇게하면 실패한 일괄 배경 마이그레이션의 디렉터리이 표시됩니다.
- 실패한 Migration을 선택하여 마이그레이션 매개변수 및 실패한 작업을 볼 수 있습니다.
- Failed jobs에서 각 ID를 선택하여 작업 실패 이유를 확인합니다.
만약 GitLab 고객이라면, 일괄 배경 마이그레이션이 실패한 원인을 찾기 위해 지원 요청을 열어보는 것을 고려하십시오.
문제를 해결하려면, 실패한 마이그레이션을 다시 시도할 수 있습니다.
전제 조건:
- 인스턴스에 관리자 액세스해야 합니다.
- 왼쪽 사이드바에서 아래쪽에서 관리 영역을 선택합니다.
- 모니터링 > 배경 마이그레이션을 선택합니다.
- Failed 탭을 선택합니다. 이렇게하면 실패한 일괄 배경 마이그레이션의 디렉터리이 표시됩니다.
- 재시도할 실패한 일괄 배경 마이그레이션을 선택하여 재시도 버튼을 클릭합니다 ().
재시도한 일괄 배경 마이그레이션을 모니터링하려면, 일정한 간격으로 일괄 배경 마이그레이션의 상태를 확인할 수 있습니다.
매뉴얼으로 실패한 마이그레이션 완료
- GitLab 14.1에 도입되었습니다.
오류로 실패한 일괄 배경 마이그레이션을 매뉴얼으로 완료하려면, 실패 오류 로그나 데이터베이스의 정보를 사용합니다:
-
실패 오류 로그를 확인하고
An error has occurred, all later migrations canceled
오류 메시지를 찾습니다:StandardError: An error has occurred, all later migrations canceled: Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active': {:job_class_name=>"CopyColumnUsingBackgroundMigrationJob", :table_name=>"push_event_payloads", :column_name=>"event_id", :job_arguments=>[["event_id"], ["event_id_convert_to_bigint"]] }
-
다음 명령을 실행하고 꺽쇠 괄호 안의 값을 올바른 인수로 바꿉니다:
sudo gitlab-rake gitlab:background_migrations:finalize[<job_class_name>,<table_name>,<column_name>,'<job_arguments>']
[["id"], ["id_convert_to_bigint"]]
와 같이 여러 개의 인수를 다룰 때는 각 인수 사이의 쉼표를 역슬래시\
로 이스케이핑하여 잘못된 문자 오류를 방지합니다. 예를 들어 이전 단계에서 마이그레이션을 완료하려면:sudo gitlab-rake gitlab:background_migrations:finalize[CopyColumnUsingBackgroundMigrationJob,push_event_payloads,event_id,'[["event_id"]\, ["event_id_convert_to_bigint"]]']
- 일괄 배경 마이그레이션의 상태를 확인합니다.
-
쿼리 결과를 사용하여 올바른 매개변수로 마이그레이션 명령을 작성합니다:
sudo gitlab-rake gitlab:background_migrations:finalize[<job_class_name>,<table_name>,<column_name>,'<job_arguments>']
예를 들어 쿼리에서 다음 데이터를 반환하면:
-
job_class_name
:CopyColumnUsingBackgroundMigrationJob
-
table_name
:events
-
column_name
:id
-
job_arguments
:[["id"], ["id_convert_to_bigint"]]
-
여러 개의 인수를 다룰 때는 각 인수 사이의 쉼표를 역슬래시 \
로 이스케이핑하여 잘못된 문자 오류를 방지합니다. 명령은 다음과 같아야 합니다:
sudo gitlab-rake gitlab:background_migrations:finalize[CopyColumnUsingBackgroundMigrationJob,events,id,'[["id"]\, ["id_convert_to_bigint"]]']
실패한 마이그레이션을 완료로 표시하기
백그라운드 마이그레이션이 실패하는 경우가 있을 수 있습니다: 너무 많은 버전 업그레이드를 건너뛸 때 또는 하위 호환되지 않는 데이터베이스 스키마 변경시. (예: 이슈 393216 참조). 실패한 백그라운드 마이그레이션은 추가적인 응용프로그램 업그레이드를 방해합니다.
백그라운드 마이그레이션이 “건너뛰기”가 안전하다고 판단된 경우, 마이그레이션을 매뉴얼으로 완료로 표시할 수 있습니다:
# 레일스 콘솔 시작
connection = ApplicationRecord.connection # 또는 Ci::ApplicationRecord.connection, 마이그레이션이 예약된 DB에 따라 다름
Gitlab::Database::SharedModel.using_connection(connection) do
migration = Gitlab::Database::BackgroundMigration::BatchedMigration.find_for_configuration(
Gitlab::Database.gitlab_schemas_for_connection(connection),
'BackfillUserDetailsFields',
:users,
:id,
[]
)
# 모든 작업을 완료로 표시
migration.batched_jobs.update_all(status: Gitlab::Database::BackgroundMigration::BatchedJob.state_machine.states['succeeded'].value)
migration.update_attribute(:status, Gitlab::Database::BackgroundMigration::BatchedMigration.state_machine.states[:finished].value)
end
백그라운드 마이그레이션
GitLab 13에서 백그라운드 마이그레이션이 배치 처리되지 않았습니다. GitLab 14 이상에서는 이 유형의 마이그레이션이 배치 처리된 백그라운드 마이그레이션에 의해 대체되었습니다.
대기 중인 백그라운드 마이그레이션 확인
배치 처리되지 않은 백그라운드 마이그레이션을 확인하려면:
sudo gitlab-rails runner -e production 'puts Gitlab::BackgroundMigration.remaining'
sudo gitlab-rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.queued.count'
cd /home/git/gitlab
sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::BackgroundMigration.remaining'
sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.queued.count'
실패한 백그라운드 마이그레이션 확인
배치 처리되지 않은 실패한 백그라운드 마이그레이션을 확인하려면:
GitLab 버전 14.10 이상인 경우:
sudo gitlab-rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.with_status(:failed).count'
GitLab 버전 14.0-14.9인 경우:
sudo gitlab-rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.failed.count'
GitLab 버전 14.10 이상인 경우:
cd /home/git/gitlab
sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.with_status(:failed).count'
GitLab 버전 14.0-14.9인 경우:
cd /home/git/gitlab
sudo -u git -H bundle exec rails runner -e production 'puts Gitlab::Database::BackgroundMigration::BatchedMigration.failed.count'