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