새 서버로 마이그레이션
GitLab v19.4Offering: GitLab Self-Managed
요약
GitLab 백업 및 복원을 사용해 Linux 패키지 인스턴스를 새 서버로 마이그레이션합니다. GitLab Geo를 운영 중이라면 계획된 장애 조치를 위한 Geo 재해 복구를 대안으로 사용할 수 있습니다. 새 서버와 기존 서버가 조율 없이 데이터를 처리하는 상황을 피합니다.
GitLab 백업 및 복원을 사용해 Linux 패키지 인스턴스를 새 서버로 마이그레이션합니다. Linux 패키지 GitLab 인스턴스를 Docker로 마이그레이션하는 방법도 있습니다.
GitLab Geo를 운영 중이라면 계획된 장애 조치를 위한 Geo 재해 복구를 대안으로 사용할 수 있습니다. 마이그레이션에 Geo를 선택하기 전에 모든 사이트가 Geo 요구 사항을 충족하는지 확인해야 합니다.
새 서버와 기존 서버가 조율 없이 데이터를 처리하는 상황을 피합니다. 여러 서버가 동시에 연결되어 같은 데이터를 처리할 수 있습니다. 예를 들어 수신 이메일을 사용할 때 두 GitLab 인스턴스가 동시에 이메일을 처리하면 두 인스턴스 모두 일부 데이터를 놓칩니다. 이러한 문제는 다른 서비스에서도 발생할 수 있습니다. 예를 들어 비패키지 데이터베이스, 비패키지 Redis 인스턴스, 비패키지 Sidekiq 입니다.
사전 요구 사항:
- 예정된 마이그레이션을 사용자에게 알리기 위해 미리 게시한 브로드캐스트 메시지 배너.
- 완전하고 최신 상태인 백업.
rm과 같은 파괴적 명령이 잘못 실행되는 경우에 대비해 전체 시스템 수준 백업을 생성하거나 마이그레이션에 관여하는 모든 서버의 스냅샷을 확보합니다. - 관리자 액세스 권한.
새 서버 준비#
새 서버를 준비하려면 다음 단계를 따릅니다.
-
중간자 공격 경고를 피하기 위해 기존 서버의 SSH 호스트 키를 복사합니다. 예시 단계는 기본 사이트의 SSH 호스트 키 수동 복제를 참고합니다.
-
기존 서버의
/etc/gitlab파일을 새 서버로 복사해 구성하고, 필요에 따라 업데이트합니다. 자세한 내용은 Linux 패키지 설치의 백업 및 복원 안내를 참고합니다. -
해당하는 경우 수신 이메일을 비활성화합니다.
-
백업 및 복원 이후 최초 기동 시 새 CI/CD job 이 시작되지 않도록 차단합니다.
/etc/gitlab/gitlab.rb를 편집해 다음을 설정합니다.nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n deny all;\n return 503;\n }\n" -
GitLab을 재구성합니다.
sudo gitlab-ctl reconfigure -
불필요하고 의도하지 않은 데이터 처리를 막기 위해 GitLab을 중지합니다.
sudo gitlab-ctl stop -
Redis를 중지합니다.
sudo gitlab-ctl stop redis -
새 서버가 Redis 데이터베이스와 GitLab 백업 파일을 받을 수 있도록 구성합니다.
sudo rm -f /var/opt/gitlab/redis/dump.rdb sudo chown <your-linux-username> /var/opt/gitlab/redis /var/opt/gitlab/backups
기존 서버의 콘텐츠 준비 및 전송#
-
기존 서버의 최신 시스템 수준 백업 또는 스냅샷이 있는지 확인합니다.
-
GitLab 에디션이 지원한다면 유지 관리 모드를 활성화합니다.
-
새 CI/CD job 이 시작되지 않도록 차단합니다.
-
/etc/gitlab/gitlab.rb를 편집해 다음을 설정합니다.nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n deny all;\n return 503;\n }\n" -
GitLab을 재구성합니다.
sudo gitlab-ctl reconfigure
-
-
주기적 백그라운드 job을 비활성화합니다.
- 오른쪽 상단에서 Admin을 선택합니다.
- 왼쪽 사이드바에서 Monitoring > Background jobs를 선택해 Sidekiq 대시보드를 표시합니다.
- Sidekiq 대시보드 상단 메뉴에서 Cron을 선택합니다.
- Sidekiq 대시보드 오른쪽 위에서 Disable All을 선택합니다.
-
실행 중인 CI/CD job 이 끝나기를 기다리거나, 완료되지 않은 job 이 유실될 수 있음을 감수합니다. 실행 중인 모든 job을 확인하려면 다음 단계를 따릅니다.
- 왼쪽 사이드바에서 CI/CD > Jobs를 선택합니다.
- 필터 바에서 Status > Running을 선택합니다.
-
Sidekiq job 이 끝나기를 기다립니다.
- 왼쪽 사이드바에서 Monitoring > Background jobs를 선택합니다.
- Sidekiq 대시보드 상단 메뉴에서 Queues를 선택합니다.
- Sidekiq 대시보드 오른쪽 위에서 Live Poll을 선택합니다. Busy와 Enqueued가 0으로 떨어질 때까지 기다립니다. 이 큐에는 사용자가 제출한 작업이 들어 있으며, 이 job 이 끝나기 전에 종료하면 해당 작업이 유실될 수 있습니다. 마이그레이션 이후 검증을 위해 Sidekiq 대시보드에 표시된 숫자를 기록해 둡니다.
-
Redis 데이터베이스를 디스크에 플러시하고, 마이그레이션에 필요한 서비스를 제외한 GitLab을 중지합니다.
sudo /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket save && \ sudo gitlab-ctl stop && \ sudo gitlab-ctl start postgresql && \ sudo gitlab-ctl start gitaly -
GitLab 백업을 생성합니다.
sudo gitlab-backup create -
백업이 완료되면
/etc/gitlab/gitlab.rb맨 아래에 다음을 추가해 아래 GitLab 서비스를 비활성화하고 의도하지 않은 재시작을 방지합니다.alertmanager['enable'] = false gitaly['enable'] = false gitlab_exporter['enable'] = false gitlab_pages['enable'] = false gitlab_workhorse['enable'] = false logrotate['enable'] = false gitlab_rails['incoming_email_enabled'] = false nginx['enable'] = false node_exporter['enable'] = false postgres_exporter['enable'] = false postgresql['enable'] = false prometheus['enable'] = false puma['enable'] = false redis['enable'] = false redis_exporter['enable'] = false registry['enable'] = false sidekiq['enable'] = false -
GitLab을 재구성합니다.
sudo gitlab-ctl reconfigure -
모든 것이 중지되었는지 확인하고, 실행 중인 서비스가 없는지 검증합니다.
sudo gitlab-ctl status -
Redis 데이터베이스와 GitLab 백업을 새 서버로 전송합니다.
sudo scp /var/opt/gitlab/redis/dump.rdb <your-linux-username>@new-server:/var/opt/gitlab/redis sudo scp /var/opt/gitlab/backups/your-backup.tar <your-linux-username>@new-server:/var/opt/gitlab/backups
Git 및 오브젝트 데이터 용량이 큰 인스턴스#
GitLab 인스턴스의 로컬 볼륨에 데이터가 많다면, 예를 들어 1 TB를 넘는다면 백업에 오랜 시간이 걸릴 수 있습니다. 이 경우 데이터를 새 인스턴스의 해당 볼륨으로 직접 전송하는 편이 수월합니다.
수동으로 마이그레이션해야 할 수 있는 주요 볼륨은 다음과 같습니다.
- 모든 Git 데이터가 들어 있는
/var/opt/gitlab/git-data디렉터리. Git 데이터 손상 가능성을 없애기 위해 리포지터리 이전 문서 섹션을 반드시 읽습니다. - 아티팩트 같은 오브젝트 데이터가 들어 있는
/var/opt/gitlab/gitlab-rails/shared디렉터리. - 사용자 프로필 사진 같은 업로드 데이터가 들어 있는
/var/opt/gitlab/gitlab-rails/uploads디렉터리. - Linux 패키지에 포함된 번들 PostgreSQL을 사용한다면
/var/opt/gitlab/postgresql/data아래의 PostgreSQL 데이터 디렉터리도 함께 마이그레이션해야 합니다.
모든 GitLab 서비스를 중지한 뒤에는 rsync 같은 도구나 볼륨 스냅샷 마운트를 사용해 데이터를 새 환경으로
옮길 수 있습니다.
새 서버에서 데이터 복원#
-
적절한 파일 시스템 권한을 복원합니다.
sudo chown gitlab-redis /var/opt/gitlab/redis sudo chown gitlab-redis:gitlab-redis /var/opt/gitlab/redis/dump.rdb sudo chown git:root /var/opt/gitlab/backups sudo chown git:git /var/opt/gitlab/backups/your-backup.tar -
Redis를 시작합니다.
sudo gitlab-ctl start redisRedis가
dump.rdb를 자동으로 읽어 복원합니다. -
Redis 데이터베이스가 올바르게 복원되었는지 확인합니다.
- 오른쪽 상단에서 Admin을 선택합니다.
- 왼쪽 사이드바에서 Monitoring > Background jobs를 선택합니다.
- Sidekiq 대시보드에서 기존 서버에 표시되었던 숫자와 일치하는지 확인합니다.
- Sidekiq 대시보드에서 Cron을 선택한 다음 Enable All을 선택해 주기적 백그라운드 job을 다시 활성화합니다.
-
GitLab 인스턴스의 읽기 전용 작업이 정상 동작하는지 테스트합니다. 예를 들어 프로젝트 리포지터리 파일, 머지 리퀘스트, 이슈를 둘러봅니다.
-
앞서 활성화했다면 유지 관리 모드를 비활성화합니다.
-
GitLab 인스턴스가 정상 동작하는지 테스트합니다.
-
해당하는 경우 수신 이메일을 다시 활성화하고 정상 동작하는지 테스트합니다.
-
새 서버를 가리키도록 DNS 또는 로드 밸런서를 업데이트합니다.
-
앞서 추가한 사용자 정의 NGINX 구성을 제거해 새 CI/CD job 이 시작될 수 있도록 차단을 해제합니다.
# The following line must be removed nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n deny all;\n return 503;\n }\n" -
GitLab을 재구성합니다.
sudo gitlab-ctl reconfigure -
예정된 유지 관리 브로드캐스트 메시지 배너를 제거합니다.