데이터베이스 부하 분산

데이터베이스 부하 분산을 사용하면 읽기 전용 쿼리를 여러 PostgreSQL 노드에 분산시켜 성능을 향상시킬 수 있습니다.

이 문서에서는 GitLab Rails 및 Sidekiq에서 데이터베이스 부하 분산이 어떻게 구현되는지 기술적인 개요를 제공합니다.

명명법

  1. 호스트: 각 데이터베이스 호스트입니다. 주(primary)거나 복제(replica)일 수 있습니다.
  2. 주(primary): 쓰기 전용 및 읽기 및 쓰기 작업에 사용되는 기본 PostgreSQL 호스트입니다.
  3. 복제(replica): 읽기 전용 작업에 사용되는 보조 PostgreSQL 호스트입니다.
  4. 작업량(workload): 데이터베이스 연결이 필요한 Rails 요청 또는 Sidekiq 작업입니다.

컴포넌트

부하 분산 프로세스에는 몇 가지 루비 클래스가 관련되어 있습니다. 이들 모두는 Gitlab::Database::LoadBalancing 네임스페이스에 있습니다:

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

각 작업량은 Gitlab::Database::LoadBalancing::Session의 새 인스턴스에서 시작합니다. Session은 수행된 데이터베이스 작업을 추적합니다. 그런 다음 작업량이 주(primary) 호스트 또는 복제(replica) 호스트로의 연결이 필요한 지를 결정합니다.

작업량이 데이터베이스 연결을 필요로 할 때 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와 같은 우선 주(primary) 또는 복제(replica)를 선호하는 특수 블록이 사용되었는지 여부.

그런 다음 LoadBalancer는 해당 데이터베이스 연결 풀에서 요청된 연결을 생성합니다.

  • 주(primary) 연결 풀에서 read_write 연결을 생성합니다.
  • 복제(replica) 연결 풀에서 read 연결을 생성합니다.

read 연결 요청에 응답할 때 LoadBalancer는 먼저 복제(replica) 호스트들을 연결을 부하 분산하기 위해 시도합니다. 다음 online 복제(replica) 호스트를 찾아 호스트의 연결 풀에서 연결을 생성합니다. 복제 호스트는 주(primary)와 동기화된 경우, 복제 지연 크기 또는 시간에 따라 online으로 간주됩니다. 이러한 요구 사항에 대한 임계값은 구성 가능합니다.