데이터베이스 로드 밸런싱

데이터베이스 로드 밸런싱을 통해 읽기 전용 쿼리를 여러 PostgreSQL 노드에 분산하여 성능을 향상시킬 수 있습니다.

이 문서는 GitLab Rails 및 Sidekiq에서 데이터베이스 로드 밸런싱이 구현된 기술적 개요를 제공합니다.

용어

  1. 호스트: 각 데이터베이스 호스트. 기본 또는 레플리카일 수 있습니다.
  2. 프라이머리: 쓰기 전용 및 읽기 및 쓰기 작업에 사용되는 주요 PostgreSQL 호스트입니다.
  3. 레플리카: 읽기 전용 작업에 사용되는 보조 PostgreSQL 호스트입니다.
  4. 작업량: 데이터베이스 연결이 필요한 Rails 요청 또는 Sidekiq 작업입니다.

구성 요소

로드 밸런싱 프로세스에는 몇 가지 Ruby 클래스가 관련되어 있습니다. 이들은 모두 Gitlab::Database::LoadBalancing 네임스페이스에 있습니다.

  1. Host
  2. LoadBalancer
  3. ConnectionProxy
  4. Session

각 작업량은 Gitlab::Database::LoadBalancing::Session의 새 인스턴스로 시작합니다. Session은 수행된 데이터베이스 작업을 추적합니다. 그런 다음 작업량이 주요 호스트 또는 레플리카 호스트에 연결을 필요로 하는지를 결정합니다.

작업량이 ActiveRecord를 통해 데이터베이스 연결이 필요한 경우, ConnectionProxy는 먼저 연결 요청을 LoadBalancer로 리디렉션합니다. ConnectionProxy는 몇 가지 기준에 따라 LoadBalancer에서 read 또는 read_write 연결을 요청합니다.

  1. 쿼리가 읽기 전용인지 쓰기가 필요한지 여부.
  2. Session에서 이전에 쓰기 작업이 기록되었는지 여부.
  3. 다음과 같은 특수 블록을 사용하여 프라이머리 또는 레플리카를 선호하는지 여부:
    • use_primary
    • ignore_writes
    • use_replicas_for_read_queries
    • fallback_to_replicas_for_ambiguous_queries

그런 다음 LoadBalancer는 해당 데이터베이스 연결 풀에서 요청된 연결을 얻습니다. 다음과 같이 얻을 수 있습니다:

  • 프라이머리의 연결 풀에서 read_write 연결.
  • 레플리카의 연결 풀에서 read 연결.

read 연결 요청에 응답할 때, LoadBalancer는 먼저 레플리카 호스트 간의 연결을 로드 밸런싱합니다. 다음 온라인(online) 레플리카 호스트를 찾고 호스트의 연결 풀에서 연결을 얻습니다. 레플리카 호스트는 복제 지연 크기 또는 시간에 따라 프라이머리와 최신 상태인 경우에 온라인으로 간주됩니다. 이러한 요구 사항의 임계값은 구성 가능합니다.