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