그룹과 프로젝트를 직접 전송으로 마이그레이션 하면, UI 또는 API를 사용하여 GitLab 인스턴스 간에 GitLab 리소스를 쉽게 이전할 수 있습니다. 이전 블로그 게시물에서 GitLab은 모든 사람이 사용할 수 있는 베타 기능으로 프로젝트 마이그레이션을 발표했습니다. 아울러 이 방법의 이점과 마이그레이션 단계도 설명했습니다.
이후 GitLab은 특히 대규모 프로젝트의 효율적이고 안정적인 마이그레이션에 초점을 맞추어 추가 개선 작업을 진행하였습니다. 이 글에서는 이러한 개선 사항과 전반적인 프로세스, 마이그레이션 속도에 미치는 영향을 자세히 설명하려고 합니다. 또한 마이그레이션 시간 추정치도 다루겠습니다.
CI/CD 파이프라인 가져오기
Timeout 문제
GitLab은 CI/CD 파이프라인의 가져오기가 Timeout으로 실패하는 버그 보고를 받았고, 기본 마이그레이션 프로세스를 개선할 필요가 있다고 판단했습니다. 이에 문제의 근본 원인과 가능한 해결책을 고려하고 PoC(Proof of Concept)를 진행했습니다. 그리고 GitLab은 ‘특정 관계 유형(예: 파이프라인)의 대량 프로젝트에 대한 하나의 거대 아카이브 파일 문제를 해결해야 한다’라고 결론 내렸습니다.
개선 사항
Timeout 문제를 해결하기 위해, 관계(예: Merge Request(MR) 또는 파이프라인)를 내보내고 가져오는 과정에 배치(Batch)를 도입하기로 결정했습니다.
그리고 배치 도입을 위한 에픽을 완전히 완료하기 전에, CI/CD 파이프라인을 내보내는 과정에 몇 가지 다른 최적화를 도입해야 했습니다.
GitLab 15.10에서는:
이러한 최적화로 인해 CI/CD 파이프라인의 내보내기 속도가 크게 빨라졌습니다. 이에 따라 프로젝트의 대량 파이프라인을 아카이브 파일로 내보낼 수 있었고 그 다음, 목적지 인스턴스에도 가져올 수 있었습니다. 하지만 파이프라인을 최종적으로 가져왔기 때문에 마이그레이션의 전체 시간은 증가했습니다.
GitLab 16.3에서는 배치로 관계를 내보내고 가져오기 기능을 도입했습니다. 이는 두 가지 이점이 있습니다:
- 한 번의 관계 당 하나의 파일 대신 더 작은 아카이브 파일을 만들고 전송하여 마이그레이션 성능을 향상합니다. 프로젝트에 수천 개의 파이프라인이 있으면 이러한 파일은 매우 클 수 있습니다.
- 더 많은 병렬 처리를 가능하게 합니다. 예를 들어, CI 파이프라인 데이터는 이제 여러 배치로 나누어지며, 동시 Sidekiq job(목적지 인스턴스에서 Sidekiq Worker를 사용할 수 있을 때, 아래 참조)이 각 배치를 가져옵니다.
이 개선 사항은 GitLab.com에서 이미 기본으로 사용할 수 있습니다.
- 자체 관리형 GitLab 인스턴스에서 GitLab.com으로 마이그레이션 하는 사용자는 배치 내보내기를 사용할 수 있는 GitLab 16.2 이상 버전에 자체 관리형 인스턴스가 있어야 이 개선 사항의 이점을 누릴 수 있습니다.
- GitLab.com에서 자체 관리형 GitLab 인스턴스로 마이그레이션 하는 사용자는 GitLab 16.2 이상 버전에 자체 관리형 인스턴스가 있어야 하고,
bulk_imports_batched_import_export기능 플래그(Feature Flag)를 활성화해야 이 개선 사항의 이점을 활용할 수 있습니다.
마이그레이션 시간을 추정할 수 있을까요?
이 질문은 자주 제기되었습니다. 답변은 ‘직접 전송으로 마이그레이션 한 시간이 다양한 요인에 따라 달라진다’라는 것입니다. 이러한 요인 중 일부는 다음과 같습니다:
- 소스와 목적지 GitLab 인스턴스에서 사용할 수 있는 하드웨어와 데이터베이스 리소스 - 소스와 목적지 인스턴스의 리소스가 더 많을수록 마이그레이션 시간이 더 짧아질 수 있습니다. 이유는 다음과 같습니다.
- 소스 인스턴스는 API 요청을 받고, 내보낼 엔티티를 추출하며 직렬화해야 합니다.
- 목적지 인스턴스는 job을 실행하고 해당 데이터베이스에 엔티티를 생성해야 합니다.
- 내보낼 데이터의 복잡성과 크기 - 예를 들어, 각각 1000개의 MR이 있는 두 개의 다른 프로젝트를 마이그레이션 한다고 생각해 보세요. 프로젝트 중 하나가 MR에 첨부 파일, 댓글, 기타 항목이 아주 많다면, 두 프로젝트는 마이그레이션 시간이 매우 다를 수 있습니다. 따라서 프로젝트의 MR 수는 ‘프로젝트를 마이그레이션 하는 데 시간이 얼마나 걸릴지’ 예측하는 데 적합하지 않습니다.
마이그레이션을 신뢰할 만하게 추정할 정확한 공식은 없습니다. 그러나 GitLab은 프로젝트 관계를 가져오는 각 job의 지속 시간을 확인하여 평균 수치를 공유하므로 ‘프로젝트를 가져오는 데 시간이 얼마나 걸릴지’ 아이디어를 얻을 수 있습니다. GitLab이 발견한 내용은 다음과 같습니다:
- 빈 프로젝트를 가져오는 데 약 2.4초 걸립니다.
- 하나의 MR을 가져오는 데 약 1초 걸립니다.
- 하나의 이슈를 가져오는 데 약 0.1초 걸립니다.
아래 표에서 프로젝트 관계와 이를 가져오는 데 걸리는 평균 시간을 더 찾아볼 수 있습니다.
| 프로젝트 리소스 유형 | 단일 레코드를 가져오는 데 걸리는 평균 시간 (초 단위) |
|---|---|
| Empty project | 2.4 |
| Repository | 20 |
| Project attributes | 1.5 |
| Members | 0.2 |
| Labels | 0.1 |
| Milestones | 0.07 |
| Badges | 0.1 |
| Issues | 0.1 |
| Snippets | 0.05 |
| Snippet repositories | 0.5 |
| Boards | 0.1 |
| Merge requests | 1 |
| External pull requests | 0.5 |
| Protected branches | 0.1 |
| Project feature | 0.3 |
| Container expiration policy | 0.3 |
| Service desk setting | 0.3 |
| Releases | 0.1 |
| CI/CD pipelines | 0.2 |
| Commit notes | 0.05 |
| Wiki | 10 |
| Uploads | 0.5 |
| LFS objects | 0.5 |
| Design | 0.1 |
| Auto DevOps | 0.1 |
| Pipeline schedules | 0.5 |
| References | 5 |
| Push rule | 0.1 |