데이터베이스 로드 밸런싱

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

이 문서에서는 GitLab Rails와 Sidekiq에서 데이터베이스 로드 밸런싱이 어떻게 구현되는지 기술적 개요를 제공합니다.

용어

  1. 호스트(Host): 각 데이터베이스 호스트. 주(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은 수행된 데이터베이스 작업을 추적한 다음, 워크로드가 주 호스트 또는 복제 호스트에 연결이 필요한지를 결정합니다.

워크로드가 데이터베이스 연결을 필요로 할 때, ConnectionProxy는 먼저 연결 요청을 LoadBalancer로 리디렉션합니다. ConnectionProxy는 일부 기준에 따라 LoadBalancer로부터 read 또는 read_write 연결을 요청합니다.

  1. 쿼리가 읽기 전용인지 또는 쓰기가 필요한지 여부.
  2. 이전에 기록된 쓰기 작업이 있는지 여부.
  3. use_primary, ignore_writes, use_replicas_for_read_queries, fallback_to_replicas_for_ambiguous_queries와 같은 특수 블록이 사용되었는지 여부.

그런 다음 LoadBalancer는 해당 데이터베이스 연결 풀로부터 요청된 연결을 양보합니다.

  • 주 연결 풀로부터 read_write 연결.
  • 복제 연결 풀로부터 read 연결.

read 연결에 응답할 때, LoadBalancer는 먼저 복제 호스트 간의 연결을 로드 밸런스하려고 합니다. 다음 온라인(online) 복제 호스트에서 연결을 양보합니다. 복제 호스트가 기본과 동기화되어 있으면(복제 지연 크기 또는 시간에 따라), 이 복제 호스트는 온라인으로 간주됩니다. 이러한 요구 사항에 대한 임계값은 구성 가능합니다.