Geo blob 복제
업로드, LFS 객체, CI 잡 아티팩트와 같은 blob은 Self-Service Framework를 사용하여 보조 사이트에 복제됩니다. 아래 다이어그램에서는 blob의 한 예시로 잡 아티팩트가 사용됩니다. PostgreSQL DB 행이 복제된 후 보조 사이트:
업로드, LFS 객체, CI 잡 아티팩트와 같은 blob은 Self-Service Framework를 사용하여 보조 사이트에 복제됩니다. 동기화 상태를 추적하기 위해, 각 모델은 해당 레지스트리 테이블을 가집니다. 예를 들어, Upload는 PostgreSQL Geo 추적 데이터베이스에 Geo::UploadRegistry를 가집니다.
서비스 간 blob 복제 해피 패스 워크플로우#
아래 다이어그램에서는 blob의 한 예시로 잡 아티팩트가 사용됩니다.
새 잡 아티팩트 복제#
기본 사이트:
소스 코드 보기
sequenceDiagram
participant R as Runner
participant P as Puma
participant DB as PostgreSQL
participant SsP as Secondary site PostgreSQL
R->>P: Upload artifact
P->>DB: Insert `ci_job_artifacts` row
P->>DB: Insert `geo_events` row
P->>DB: Insert `geo_event_log` row
DB->>SsP: Replicate rows- Runner가 아티팩트를 업로드합니다
- Puma가
ci_job_artifacts행을 삽입합니다 - Puma가 "ID 123을 가진 잡 아티팩트가 업데이트됨"과 같은 데이터를 가진
geo_events행을 삽입합니다 - Puma가
geo_events행을 가리키는geo_event_log행을 삽입합니다 (SSF가 일부 레거시 로직 위에 구축되었기 때문) - PostgreSQL 스트리밍 복제가 읽기 복제본에 행을 삽입합니다
PostgreSQL DB 행이 복제된 후 보조 사이트:
소스 코드 보기
sequenceDiagram
participant DB as PostgreSQL
participant GLC as Geo Log Cursor
participant R as Redis
participant S as Sidekiq
participant TDB as PostgreSQL Tracking DB
participant PP as Primary site Puma
GLC->>DB: Query `geo_event_log`
GLC->>DB: Query `geo_events`
GLC->>R: Enqueue `Geo::EventWorker`
S->>R: Pick up `Geo::EventWorker`
S->>TDB: Insert to `job_artifact_registry`, "starting sync"
S->>PP: GET <primary site internal URL>/geo/retrieve/job_artifact/123
S->>TDB: Update `job_artifact_registry`, "synced"- Geo Log Cursor 루프가 새
geo_event_log행을 찾습니다 - Geo Log Cursor가
geo_events행을 처리합니다- Geo Log Cursor가
geo_events행 데이터를 전달하여Geo::EventWorker잡을 큐에 넣습니다
- Geo Log Cursor가
- Sidekiq이
Geo::EventWorker잡을 가져옵니다- Sidekiq이 존재하지 않기 때문에 PostgreSQL Geo 추적 데이터베이스에
job_artifact_registry행을 삽입하고 "동기화 시작됨"으로 표시합니다 - Sidekiq이 기본 Geo 사이트의 API 엔드포인트에 GET 요청을 하고 파일을 다운로드합니다
- Sidekiq이
job_artifact_registry행을 "동기화됨"과 "검증 대기 중"으로 표시합니다
- Sidekiq이 존재하지 않기 때문에 PostgreSQL Geo 추적 데이터베이스에
기존 잡 아티팩트 백필#
- 시스템 관리자에게 Geo 없이 기존 GitLab 사이트가 있습니다
- 기존 CI 잡과 잡 아티팩트가 있습니다
- 시스템 관리자가 새 GitLab 사이트를 설정하고 보조 Geo 사이트로 구성합니다
보조 사이트:
매분 실행되는 두 개의 크론 잡이 있습니다: Geo::Secondary::RegistryConsistencyWorker와 Geo::RegistrySyncWorker. 아래 워크플로우는 이러한 라인을 따라 두 부분으로 나뉩니다.
소스 코드 보기
sequenceDiagram
participant SC as Sidekiq-cron
participant R as Redis
participant S as Sidekiq
participant DB as PostgreSQL
participant TDB as PostgreSQL Tracking DB
SC->>R: Enqueue `Geo::Secondary::RegistryConsistencyWorker`
S->>R: Pick up `Geo::Secondary::RegistryConsistencyWorker`
S->>DB: Query `ci_job_artifacts`
S->>TDB: Query `job_artifact_registry`
S->>TDB: Insert to `job_artifact_registry`- Sidekiq-cron이 매분
Geo::Secondary::RegistryConsistencyWorker잡을 큐에 넣습니다. 활발하게 작업을 수행하는 한(행 생성 및 삭제), 이 잡은 즉시 자체적으로 다시 큐에 넣습니다. 이 잡은 동시에 여러 인스턴스가 실행되는 것을 방지하기 위해 배타적 임대를 사용합니다. - Sidekiq이
Geo::Secondary::RegistryConsistencyWorker잡을 가져옵니다- Sidekiq이 최대 10000개 행에 대해
ci_job_artifacts테이블을 쿼리합니다 - Sidekiq이 최대 10000개 행에 대해
job_artifact_registry테이블을 쿼리합니다 - Sidekiq이 기존 잡 아티팩트에 해당하는 PostgreSQL Geo 추적 데이터베이스에
job_artifact_registry행을 삽입합니다
- Sidekiq이 최대 10000개 행에 대해
소스 코드 보기
sequenceDiagram
participant SC as Sidekiq-cron
participant R as Redis
participant S as Sidekiq
participant DB as PostgreSQL
participant TDB as PostgreSQL Tracking DB
participant PP as Primary site Puma
SC->>R: Enqueue `Geo::RegistrySyncWorker`
S->>R: Pick up `Geo::RegistrySyncWorker`
S->>TDB: Query `*_registry` tables
S->>R: Enqueue `Geo::EventWorker`s
S->>R: Pick up `Geo::EventWorker`
S->>TDB: Insert to `job_artifact_registry`, "starting sync"
S->>PP: GET <primary site internal URL>/geo/retrieve/job_artifact/123
S->>TDB: Update `job_artifact_registry`, "synced"- Sidekiq-cron이 매분
Geo::RegistrySyncWorker잡을 큐에 넣습니다. 활발하게 작업을 수행하는 한, 이 잡은 동기화 잡을 예약하며 최대 한 시간 동안 루프합니다. 이 잡은 동시에 여러 인스턴스가 실행되는 것을 방지하기 위해 배타적 임대를 사용합니다. - Sidekiq이
Geo::RegistrySyncWorker잡을 가져옵니다- Sidekiq이 "동기화 시도 없음" 행에 대해 PostgreSQL Geo 추적 데이터베이스의 모든
registry테이블을 쿼리합니다. 각 테이블의 행을 인터리브하고 메모리 내 큐에 추가합니다. - 이전 단계에서 1000개 미만의 행이 반환된 경우, Sidekiq이 "동기화 실패 및 재시도 준비됨" 행에 대해 모든
registry테이블을 쿼리하고 그것들을 인터리브하여 메모리 내 큐에 추가합니다. - Sidekiq이 큐의 각 항목에 대해 "ID 123을 가진 잡 아티팩트가 업데이트됨"과 같은 인수로
Geo::EventWorker잡을 큐에 넣고, 큐에 넣어진 Sidekiq 잡 ID를 추적합니다. - "최대 동시성 제한" 설정에 도달하면 Sidekiq은
Geo::EventWorker잡 큐에 넣기를 중지합니다 - Sidekiq은 더 이상 할 작업이 없을 때까지 이런 종류의 작업을 루프합니다
- Sidekiq이 "동기화 시도 없음" 행에 대해 PostgreSQL Geo 추적 데이터베이스의 모든
- Sidekiq이
Geo::EventWorker잡을 가져옵니다- Sidekiq이
job_artifact_registry행을 "동기화 시작됨"으로 표시합니다 - Sidekiq이 기본 Geo 사이트의 API 엔드포인트에 GET 요청을 하고 파일을 다운로드합니다
- Sidekiq이
job_artifact_registry행을 "동기화됨"과 "검증 대기 중"으로 표시합니다
- Sidekiq이
새 잡 아티팩트 검증#
기본 사이트:
소스 코드 보기
sequenceDiagram
participant Ru as Runner
participant P as Puma
participant DB as PostgreSQL
participant SC as Sidekiq-cron
participant Rd as Redis
participant S as Sidekiq
participant F as Filesystem
Ru->>P: Upload artifact
P->>DB: Insert `ci_job_artifacts`
P->>DB: Insert `ci_job_artifact_states`
SC->>Rd: Enqueue `Geo::VerificationCronWorker`
S->>Rd: Pick up `Geo::VerificationCronWorker`
S->>DB: Query `ci_job_artifact_states`
S->>Rd: Enqueue `Geo::VerificationBatchWorker`
S->>Rd: Pick up `Geo::VerificationBatchWorker`
S->>DB: Query `ci_job_artifact_states`
S->>DB: Update `ci_job_artifact_states` row, "started"
S->>F: Checksum file
S->>DB: Update `ci_job_artifact_states` row, "succeeded"- Runner가 아티팩트를 업로드합니다
- Puma가
ci_job_artifacts행을 생성합니다 - Puma가 검증 상태를 저장하기 위해
ci_job_artifact_states행을 생성합니다.- 행은 "검증 대기 중"으로 표시됩니다
- Sidekiq-cron이 매분
Geo::VerificationCronWorker잡을 큐에 넣습니다 - Sidekiq이
Geo::VerificationCronWorker잡을 가져옵니다- Sidekiq이 "검증 대기 중" 또는 "검증 실패 및 재시도 준비됨"으로 표시된 행 수에 대해
ci_job_artifact_states를 쿼리합니다 - Sidekiq이 "최대 검증 동시성" 설정으로 제한된 하나 이상의
Geo::VerificationBatchWorker잡을 큐에 넣습니다
- Sidekiq이 "검증 대기 중" 또는 "검증 실패 및 재시도 준비됨"으로 표시된 행 수에 대해
- Sidekiq이
Geo::VerificationBatchWorker잡을 가져옵니다- Sidekiq이 "검증 대기 중"으로 표시된 행에 대해
ci_job_artifact_states를 쿼리합니다 - 이전 단계에서 10개 미만의 행이 반환된 경우, Sidekiq이 "검증 실패 및 재시도 준비됨"으로 표시된 행에 대해
ci_job_artifact_states를 쿼리합니다 - 각 행에 대해
- Sidekiq이 "검증 시작됨"으로 표시합니다
- Sidekiq이 파일의 SHA256 체크섬을 가져옵니다
- Sidekiq이 체크섬을 행에 저장하고 "검증 성공"으로 표시합니다
- 이제 보조 Geo 사이트가 이 체크섬과 비교할 수 있습니다
- Sidekiq이 "검증 대기 중"으로 표시된 행에 대해
보조 사이트:
소스 코드 보기
sequenceDiagram
participant SC as Sidekiq-cron
participant R as Redis
participant S as Sidekiq
participant TDB as PostgreSQL Tracking DB
participant F as Filesystem
participant DB as PostgreSQL
SC->>R: Enqueue `Geo::VerificationCronWorker`
S->>R: Pick up `Geo::VerificationCronWorker`
S->>TDB: Query `job_artifact_registry`
S->>R: Enqueue `Geo::VerificationBatchWorker`
S->>R: Pick up `Geo::VerificationBatchWorker`
S->>TDB: Query `job_artifact_registry`
S->>TDB: Update `job_artifact_registry` row, "started"
S->>F: Checksum file
S->>DB: Query `ci_job_artifact_states`
S->>TDB: Update `job_artifact_registry` row, "succeeded"- 아티팩트가 성공적으로 동기화된 후, "검증 대기 중"이 됩니다
- Sidekiq-cron이 매분
Geo::VerificationCronWorker잡을 큐에 넣습니다 - Sidekiq이
Geo::VerificationCronWorker잡을 가져옵니다- Sidekiq이 "검증 대기 중" 또는 "검증 실패 및 재시도 준비됨"으로 표시된 행 수에 대해 PostgreSQL Geo 추적 데이터베이스의
job_artifact_registry를 쿼리합니다- Sidekiq이 "최대 검증 동시성" 설정으로 제한된 하나 이상의
Geo::VerificationBatchWorker잡을 큐에 넣습니다
- Sidekiq이 "최대 검증 동시성" 설정으로 제한된 하나 이상의
- Sidekiq이 "검증 대기 중" 또는 "검증 실패 및 재시도 준비됨"으로 표시된 행 수에 대해 PostgreSQL Geo 추적 데이터베이스의
- Sidekiq이
Geo::VerificationBatchWorker잡을 가져옵니다- Sidekiq이 "검증 대기 중"으로 표시된 행에 대해 PostgreSQL Geo 추적 데이터베이스의
job_artifact_registry를 쿼리합니다 - 이전 단계에서 10개 미만의 행이 반환된 경우, Sidekiq이 "검증 실패 및 재시도 준비됨"으로 표시된 행에 대해
job_artifact_registry를 쿼리합니다 - 각 행에 대해
- Sidekiq이 "검증 시작됨"으로 표시합니다
- Sidekiq이 파일의 SHA256 체크섬을 가져옵니다
- Sidekiq이 행에 체크섬을 저장합니다
- Sidekiq이 체크섬을 PostgreSQL에 의해 복제된
ci_job_artifact_states행의 체크섬과 비교합니다 - 체크섬이 일치하면 Sidekiq이
job_artifact_registry행을 "검증 성공"으로 표시합니다
- Sidekiq이 "검증 대기 중"으로 표시된 행에 대해 PostgreSQL Geo 추적 데이터베이스의
