Geo Self-Service Framework

note
이 문서는 계속 구현 및 반복하면서 변경될 수 있습니다. 진행 상황은 epic에서 확인하세요. 새로운 데이터 유형을 복제해야 하는 경우 Geo 팀에 연락하여 옵션을 논의하세요. Slack의 #g_geo에서 연락하거나 문제 또는 Merge Request에서 @geo-team을 언급할 수 있습니다.

Geo는 간편하게 Geo 사이트 전체에 데이터 유형을 복제할 수 있도록 하는 API를 제공합니다. 이 API는 Ruby 도메인별 언어(DSL)로 제공되며, 데이터 유형을 생성한 엔지니어가 최소한의 노력으로 데이터를 복제할 수 있도록 하는 것을 목표로 합니다.

Geo는 완료 기준에 포함된 요구사항입니다

Geo는 재해 복구를 위한 GitLab 솔루션입니다. 강력한 재해 복구 솔루션은 모든 GitLab 데이터를 복제하여 모든 GitLab 서비스가 재해 발생 시 최소한의 데이터 손실로 완전히 복구될 수 있도록 해야 합니다.

이러한 이유로, 새로운 기능을 출시할 때 Geo 지원을 포함하고 고객이 데이터 손실에 노출되지 않도록 하는 것이 완료 기준의 일부입니다. 이는 새로운 기능이 Geo 지원을 함께 제공하고 있음을 보장합니다.

SSF(자체 서비스 프레임워크)를 사용하여 Geo 지원을 추가하는 것은 이 페이지에서 다양한 데이터 유형에 대해 자세히 설명되어 있어 쉽습니다. 그러나 새로운 GitLab 기능에 Geo 지원을 추가해야 하는 경우에 도움이 될 수 있는 일반 가이드는 여기서 시작할 수 있습니다.

용어

API에 들어가기 전에, 개발자들이 Geo 특정 네이밍 규약을 알아야 합니다:

  • 모델: 모델은 전체 Rails 코드베이스에서 알려진 Active Model입니다. 일반적으로 데이터베이스 테이블에 연결됩니다. Geo 관점에서 모델은 하나 이상의 리소스를 가질 수 있습니다.

  • 리소스: 리소스는 모델에 속한 데이터 조각이며 GitLab 기능에 의해 생성됩니다. 기본적으로 리소스는 Geo에서 복제될 수 없습니다.

  • 데이터 유형: 데이터 유형은 리소스의 저장 방식입니다. 각 리소스는 Geo에서 지원하는 데이터 유형 중 하나에 맞아야 합니다:
    • Git 리포지터리
    • Blob
    • 데이터베이스

    자세한 내용은 데이터 유형을 참조하세요.

  • Geo 복제 가능: 복제 가능은 Geo가 Geo 사이트 전체에 동기화하려는 리소스입니다. 지원되는 복제 가능 데이터 유형이 제한적입니다. 이미 알려진 데이터 유형에 속하는 리소스의 복제를 구현하는 데 필요한 노력은 최소화됩니다.

  • Geo 복제기: Geo 복제기는 복제 가능을 복제하는 방법을 아는 객체입니다. 이것은 다음과 같은 역할을 합니다:
    • 이벤트 발생(프로덕션자)
    • 이벤트 소비(소비자)

    이는 Geo 복제 가능 데이터 유형에 연결됩니다. 모든 복제기에는 (다시 말해, 이벤트를 생성하고 소비하는) 처리할 수 있는 공통 인터페이스가 있습니다. 이것은 기능에 Geo를 통합하려는 엔지니어가 이것을 가능하게 하기 위해 복제기의 API를 사용합니다.

  • Geo 도메인별 언어: 엔지니어가 어떤 리소스를 복제해야 하는지 및 어떻게 해야 하는지 쉽게 지정할 수 있도록 하는 문법적 설탕입니다.

Geo 도메인별 언어

복제기

우선적으로, 복제기를 작성해야 합니다. 복제기는 ee/app/replicators/geo에 있습니다. 복제할 필요가 있는 각 리소스마다 별도의 복제기가 지정되어야 합니다, 심지어 여러 리소스가 동일한 모델에 연결되어 있더라도 말이죠.

예를 들어, 다음 복제기는 패키지 파일을 복제합니다:

module Geo
  class PackageFileReplicator < Gitlab::Geo::Replicator
    # 사용하는 리소스에 따라 하나의 전략을 포함합니다
    include ::Geo::BlobReplicatorStrategy
    
    # 사용된 전략에서 필요한 CarrierWave 업로더를 지정합니다
    def carrierwave_uploader
      model_record.file
    end
    
    # 이 복제기가 속하는 모델을 지정합니다
    def self.model
      ::Packages::PackageFile
    end
  end
end

클래스 이름은 고유해야 합니다. 또한, 그것은 레지스트리를 위한 테이블 이름과 강하게 결합되어 있으므로, 이 예시에서 레지스트리 테이블은 package_file_registry입니다.

Geo가 지원하는 다른 데이터 유형에는 다양한 전략이 있습니다. 필요에 맞는 하나를 선택하세요.

모델에 연결

이 복제기를 모델에 연결하려면, 모델 코드에 다음을 추가해야 합니다:

class Packages::PackageFile < ApplicationRecord
  include ::Geo::ReplicableModel
  
  with_replicator Geo::PackageFileReplicator
end

API

이 설정이 완료되면, 모델을 통해 복제기에 쉽게 액세스할 수 있습니다:

package_file = Packages::PackageFile.find(4) # 예를 들어 무작위 ID
replicator = package_file.replicator

또는 복제기에서 모델을 다시 가져올 수 있습니다:

replicator.model_record
=> <Packages::PackageFile id:4>

변경 이벤트를 생성하는 데 복제기를 사용할 수 있습니다. 예를 들어 ActiveRecord 후크에서:

  after_create_commit -> { replicator.publish_created_event }

라이브러리

이것 모두 뒤에 있는 프레임워크는 ee/lib/gitlab/geo/에 있습니다.

기존 복제기 전략

새로운 복제기 전략을 작성하기 전에, 리소스가 기존 전략 중 하나로 이미 처리될 수 있는지 확인하세요. 확실하지 않은 경우 Geo 팀과 상의하세요.

Blob 복제기 전략

CarrierWave의 Uploader::Base를 사용하는 모델은 Geo::BlobReplicatorStrategy 모듈로 Geo에서 지원됩니다. 예를 들어, 파이프라인 아티팩트를 위해 Geo 복제가 구현된 방법을 참조하세요.

각 파일은 자체 기본 ID와 모델이 있어야 합니다. Geo는 모든 단일 파일을 동등한 주체로 취급하는 것이 크게 복제와 검증 상태를 추적하는 데 큰 도움이 된다고 강력히 권장합니다.

새로운 Blob 유형 모델의 Geo 복제를 구현하려면 제공된 이슈 템플릿으로 이슈를 열어주세요.

이슈를 열지 않고 구현 단계를 보려면, 이슈 템플릿 파일을 확인하세요.

리포지터리 복제 전략

디스크 상의 Git 리포지터리를 참조하는 모든 모델은 Geo::RepositoryReplicatorStrategy 모듈을 통해 Geo에서 지원됩니다. 예를 들어, 그룹 레벨 위키의 Geo 복제가 어떻게 구현되었는지 확인해보세요. 이 문제는 아직 Geo 자체 서비스 프레임워크에 Git 리포지터리의 확인이 추가되지 않았기 때문에 확인이 구현되지 않았음을 유의하세요. 확인이 구현된 예는 스니펫 리포지터리 확인 추가에서 찾을 수 있습니다.

각 Git 리포지터리는 각자의 주요 ID와 모델을 가지고 있을 것으로 예상됩니다.

새로운 Git 리포지터리 유형 모델의 Geo 복제를 구현하려면, 제공된 이슈 템플릿으로 이슈를 열어보세요.

이슈를 열지 않고 구현 단계를 확인하려면, 이슈 템플릿 파일을 확인하세요.