읽기 복제본은 읽기:쓰기 비율이 80:20을 초과하는 읽기 중심 워크로드, 장시간 실행되는 분석 쿼리로 인한 트랜잭션 지연, 또는 지리적으로 분산된 사용자에게 낮은 지연 시간의 읽기 서비스를 제공해야 할 때 유용합니다. 그러나 쓰기 병목 현상, 최적화되지 않은 쿼리, 또는 복제 지연을 허용할 수 없는 실시간 요구사항에는 적합하지 않습니다. PostgreSQL은 WAL(Write-Ahead Log) 스트리밍을 통해 복제본을 동기화하며, 이때 발생하는 복제 지연(replication lag)을 이해하는 것이 중요합니다.
Rails에서 읽기 복제본을 설정하려면, database.yml
에 primary
와 primary_replica
연결을 정의하고, 복제본에 replica: true
플래그를 설정합니다. ApplicationRecord
에 connects_to database: { writing: :primary, reading: :primary_replica }
를 구성하여 읽기 작업은 복제본으로 라우팅될 수 있도록 합니다. 특정 쿼리를 명시적으로 복제본으로 라우팅하려면 ApplicationRecord.connected_to(role: :reading)
블록을 사용하며, 이는 분석 쿼리와 같이 무거운 읽기 작업을 오프로드하는 데 유용합니다. 또한, Analytics::Base
와 같은 별도의 모델 모듈을 생성하여 특정 유형의 쿼리가 항상 복제본을 사용하도록 강제할 수 있습니다.
읽기 복제본의 효과적인 사용을 위해서는 모니터링이 필수적입니다. pg_last_xact_replay_timestamp()
함수를 활용하여 복제 지연을 측정하고, 주기적으로 지연을 보고하며 임계값 초과 시 경고를 발생시키는 시스템을 구축해야 합니다. 일반적인 함정으로는 의도치 않게 복제본에 쓰기 작업을 시도하는 경우가 있는데, Rails는 이를 방지하지만 PostgreSQL 사용자에게 읽기 전용 권한만 부여하는 것이 중요합니다. 또한, connected_to
블록 외부에서 지연 로딩된 쿼리가 실행될 경우 주 데이터베이스를 사용하게 될 수 있으므로, .load
와 같은 메서드를 사용하여 쿼리가 복제본에서 즉시 실행되도록 강제해야 합니다.