데이터베이스 부하 분산
데이터베이스 부하 분산을 통해 읽기 전용 쿼리를 여러 PostgreSQL 노드에 분산하여 성능을 향상시킬 수 있습니다.
이 문서는 GitLab Rails 및 Sidekiq에서 데이터베이스 부하 분산이 구현된 기술적 개요를 제공합니다.
용어
- 호스트: 각 데이터베이스 호스트입니다. 주(primary) 또는 복제(replica)일 수 있습니다.
- 주(primary): 쓰기 전용 및 읽기 및 쓰기 작업에 사용되는 주 PostgreSQL 호스트입니다.
- 복제(replica): 읽기 전용 작업에 사용되는 보조 PostgreSQL 호스트입니다.
- 작업량: 데이터베이스 연결이 필요한 Rails 요청이나 Sidekiq 작업입니다.
구성 요소
데이터베이스 부하 분산 프로세스에는 몇 가지 루비 클래스가 관련되어 있습니다. 모두 Gitlab::Database::LoadBalancing
네임스페이스에 있습니다.
Host
LoadBalancer
ConnectionProxy
Session
각 작업량은 Gitlab::Database::LoadBalancing::Session
의 새 인스턴스로 시작됩니다.
Session
은 수행된 데이터베이스 작업을 추적합니다. 그런 다음 작업량이 주(primary) 호스트 또는 복제(replica) 호스트로 연결이 필요한지 결정합니다.
작업량이 ActiveRecord
를 통해 데이터베이스 연결이 필요한 경우 ConnectionProxy
는 먼저 연결 요청을 LoadBalancer
로 리디렉션합니다.
ConnectionProxy
는 LoadBalancer
로부터 read
또는 read_write
연결을 요청하며 다음 몇 가지 기준에 따라 연결을 제공합니다.
- 쿼리가 읽기 전용인지 또는 쓰기가 필요한지 여부.
-
Session
이 이전에 쓰기 작업을 기록했는지 여부. - 다음과 같이 주(primary) 또는 복제(replica)를 선호하는 특수 블록이 사용되었는지 여부.
use_primary
ignore_writes
use_replicas_for_read_queries
fallback_to_replicas_for_ambiguous_queries
그런 다음 LoadBalancer
는 해당 데이터베이스 연결 풀에서 요청된 연결을 양도합니다.
다음을 양도합니다.
- 주(primary)의 연결 풀에서
read_write
연결입니다. - 복제(replica)의 연결 풀에서
read
연결입니다.
read
연결에 대한 요청에 응답할 때 LoadBalancer
는 먼저 복제(replica) 호스트에 대해 연결을 부하 분산합니다.
다음 온라인(online)
복제(replica) 호스트를 찾아 호스트의 연결 풀에서 연결을 양도합니다.
복제(replica) 호스트는 복제 지연 크기 또는 시간에 따라 주(primary)와 최신 상태인 경우 온라인(online)
으로 간주됩니다. 이러한 요구 사항의 임계값은 구성할 수 있습니다.