Geo 자체 서비스 프레임워크

note
이 문서는 프레임워크를 구현하고 반복하는 과정에서 계속 변경될 수 있습니다. 프로그레스는 epic에서 확인하세요. 새로운 데이터 유형을 복제해야 하는 경우 Geo 팀에 연락하여 옵션에 대해 논의하세요. Slack의 #g_geo에서 연락하거나 이슈나 Merge Request에서 @geo-team을 언급할 수 있습니다.

Geo는 Geo 사이트 간에 데이터 유형을 쉽게 복제할 수 있도록 API를 제공합니다. 이 API는 루비 도메인별 언어(DSL)로 제공되며, 데이터 유형을 만든 엔지니어가 최소한의 노력으로 데이터를 복제할 수 있도록 지원합니다.

Geo는 done의 정의 요구 사항입니다

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

이러한 이유로 새로운 기능이 Geo 지원과 함께 출시되며 고객이 데이터 손실에 노출되지 않도록 하기 위해 GitLab 생성 데이터에 대한 Geo 복제 및 확인 지원은 done의 정의의 일부입니다.

자체 서비스 프레임워크(SSF)를 사용하여 Geo 지원을 추가하는 것은 간단하며 이 페이지에는 다양한 데이터 유형에 대한 자세한 내용이 개요되어 있습니다. 그러나 새로운 GitLab 기능에 Geo 지원을 추가해야하는지 및 어떻게 추가해야하는지 결정하는 데 도움이 되는보다 일반적인 가이드를 원하는 경우 여기에서 시작할 수 있습니다.

명명 법

API로 들어가기 전에 개발자들이 알아야 할 일부 Geo 특정 명명 규칙이 있습니다.

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

  • Resource: 리소스는 모델에 속한 데이터 조각으로 GitLab 기능에 의해 생성됩니다. 보통 저장 메커니즘을 사용하여 지속됩니다. 기본적으로 리소스는 Geo 복제 가능한 것이 아닙니다.

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

    더 자세한 내용은 데이터 유형을 참조하십시오.

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

  • Geo 복제기: Geo 복제기는 복제 가능을 복제하는 방법을 알고 있는 객체입니다. 다음을 담당합니다:
    • 이벤트 발생 (프로덕션자)
    • 이벤트 소비 (소비자)

    이는 Geo 복제 가능 데이터 유형에 바인딩되어 있습니다. 모든 복제기에는 이벤트를 처리하기 위해 사용할 수있는 공통 인터페이스가 있습니다. 이것은 이벤트를 생성하는 주 사이트와 이벤트를 소비하는 수종 사이트 간의 통신을 처리합니다. Geo를 기능에 통합하려는 엔지니어는 이러한 것을 가능하게 하기 위해 복제기의 API를 사용합니다.

  • Geo 도메인별 언어(DSL): 엔지니어가 쉽게 복제할 리소스를 지정할 수 있도록 하는 구문 당설탕입니다.

Geo 도메인별 언어(DSL)

복제기

먼저, 복제기를 작성해야합니다. 복제기는 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’s Uploader::Base를 사용하는 모델은 Geo::BlobReplicatorStrategy 모듈을 사용하여 Geo에서 지원됩니다. 예를 들어, Pipeline Artifacts에 대한 Geo 복제가 어떻게 구현되었는지를 확인하십시오.

모든 파일이 자체 기본 ID와 모델을 가지고 있을 것으로 예상됩니다. 저희의 경험상 이렇게 함으로써 복제 및 확인 상태를 추적하는 것이 매우 단순화됩니다.

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

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

리포지터리 복제기 전략

디스크에있는 모든 Git 리포지터리를 참조하는 모델은 Geo::RepositoryReplicatorStrategy 모듈을 사용하여 Geo에서 지원됩니다. 예를 들어, 그룹 레벨 위키에 대한 Geo 복제가 어떻게 구현되었는지 확인하십시오. 이슈는 아직 Geo 자체 서비스 프레임워크에 리포지터리의 확인을 구현하지 않았았으므로 모델에 대한 이슈는 구현되지 않습니다. 확인을 구현하는 예는 스니펫 리포지터리 확인 추가에있습니다.

새로운 Git 리포지터리 유형의 모델의 Geo 복제를 구현하기 위해서는 제공된 이슈 템플릿으로 이슈를 열어주세요.

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