Geo 프록시를 사용하면 보조 시스템이 프라이머리를 통해 웹 요청을 프록시하므로, 보조 시스템을 방문하는 사용자는 읽기-쓰기 UI를 보며 프라이머리에서 수행할 수 있는 모든 작업을 수행할 수 있습니다.
요청 수명주기
최상위 수준 보기
프록시 상호작용은 다음 다이어그램을 통해 고수준으로 설명할 수 있습니다.
프록시 탐지 메커니즘
Geo가 활성화된 경우, 프라이머리로의 프록시 요청 여부와 프라이머리의 URL을 확인하기 위해 Workhorse는 내부 API를 폴링합니다. 프록시가 활성화되어야 하는 경우 내부 API는 프라이머리 URL과 모든 요청에 전달되는 JWT로 서익합니다.
자세한 요청 흐름 및 프록시링을 통한 로컬 데이터 가속
보조(요청된) 사이트의 Workhorse는 데이터 유형을 “가속”할 수 있는지(라운드트립 요청을 저장할 수 있는지) 여부를 결정합니다. 데이터를 즉시 반환할 수 있다면 반환합니다. 그렇지 않으면, 트래픽은 프라이머리의 내부 URL로 보내지며, 프라이머리의 Workhorse에서 직접 요청한 것처럼 처리됩니다. 응답은 결국 보조 Workhorse를 통해 사용자에게 프록시됩니다.
보조에서 리포지터리가 프라이머리와 동기화되어 있고 최신인 경우, 프록시하지 않고 직접 제공합니다.
프록시된 리포지터리
요청된 리포지터리가 동기화되지 않거나 최신이 아닌 경우, 요청은 최신 변경 사항을 가져오기 위해 프라이머리에 프록시됩니다.
Git pull over SSH
SSH 작업은 Workhorse 대신에 GitLab Shell을 거쳐 가기 때문에, Workhorse 요청에 사용되는 메커니즘을 통해 프록시되지 않습니다. SSH 작업의 경우, 이는 보조 Rails 내부 API에 의해 Git HTTP 요청으로 프록시됩니다.
가속화된 리포지터리
보조에 리포지터리가 있고 주요 리포지터리와 동기화되어 있는 것으로 감지되면, 프록시하는 대신에 바로 제공됩니다.
프록시된 리포지터리
요청된 리포지터리가 동기화되지 않았거나 주요 리포지터리에서 최신 버전을 가져오기 위해 업데이트가 필요한 경우, 요청은 주요 리포지터리로 프록시됩니다.
Git push
SSH로 Git push
SSH 작업은 Workhorse 대신에 GitLab Shell을 거쳐 가기 때문에, Workhorse 요청에 사용되는 메커니즘을 통해 프록시되지 않습니다. SSH 작업의 경우, 이는 보조 Rails 내부 API에 의해 Git HTTP 요청으로 프록시됩니다.
HTTP(S)로 Git push
통합된 URL을 사용한 HTTP(S)로 Git push
통합된 URL을 사용하면, 푸시가 /-/push_from_secondary/$SECONDARY_ID/*로 형식화된 로컬 경로로 리디렉션되어, 이 경로를 통해 추가 요청은 주요 리포지터리로 프록시되어 처리됩니다.
별도의 URL을 사용한 HTTP(S)로 Git push
별도의 URL을 사용하면, 보조는 $PRIMARY/-/push_from_secondary/$SECONDARY_ID/*로 형식화된 URL로 리디렉션합니다.
```mermaid
sequenceDiagram
participant Wsec as Workhorse (secondary)
participant C as Git client
participant W as Workhorse (primary)
participant R as Rails (primary)
participant G as Gitaly (primary)
C-»Wsec: GET $SECONDARY/foo/bar.git/info/refs/?service=git-receive-pack
Wsec-»C: 302 Redirect to $PRIMARY/-/push_from_secondary/2/foo/bar.git/info/refs?service=git-receive-pack
C-»W: GET $PRIMARY/-/push_from_secondary/2/foo/bar.git/info/refs/?service=git-receive-pack
W-»R: <데이터>
R-->>W: 401 Unauthorized
W-->>C: <응답>
C->>W: GET /-/push_from_secondary/2/foo/bar.git/info/refs/?service=git-receive-pack
W->>R: <데이터>
R-->>W: Workhorse OK로 렌더링
W-->>C: <응답>
C->>W: POST /-/push_from_secondary/2/foo/bar.git/git-receive-pack
W->>R: GitHttpController:git_receive_pack
R-->>W: Workhorse OK로 렌더링
W->>G: Rails로부터 연결 세부 정보를 받아 SmartHTTP Service에 연결, ReceivePack RPC
G-->>W: Proto 메시지의 스트림 반환
W-->>C: Git 클라이언트로 메시지 파이프응답>데이터>응답>데이터>