본 발표는 Ruby on Rails 환경에서 다중 데이터베이스를 효과적으로 활용하는 전략과 Harvest의 실제 구현 사례를 공유합니다. Rails 6.0에 도입된 다중 데이터베이스 기능을 중심으로, 실제 운영 환경에서의 도전과 해결책을 다룹니다.
다중 데이터베이스는 여러 데이터베이스 서버 연결을 의미하며, 주로 고가용성(High Availability), 샤딩(Sharding), 보안 및 규정 준수를 위해 도입됩니다. 고가용성은 주 DB 장애 시 복제본으로의 페일오버를 통해 시스템 연속성을 보장하며, 샤딩은 대규모 데이터 분산으로 성능을 최적화합니다. 하지만 데이터 조인 제한, 복잡한 트랜잭션 및 마이그레이션 관리 등의 단점도 존재합니다.
Harvest는 하나의 주 DB와 6개의 읽기 전용 복제본을 운영하며, ProxySQL로 부하를 분산하고 Orchestrator로 페일오버를 관리합니다. Rails 6.0 내장 기능을 통해 database.yml
및 ApplicationRecord
의 connects_to
로 주/복제본 역할을 명시합니다.
Rails는 수동 연결 전환(ActiveRecord::Base.connected_to
)과 자동 역할 전환을 제공합니다. 자동 전환은 기본적으로 GET/HEAD 요청을 복제본으로 라우팅하여 주 DB 부하를 줄이며, 쓰기 후에는 “자신이 쓴 내용을 읽지 못하는” 문제를 방지하기 위해 일시적으로 주 DB 연결을 유지합니다. 이 기능은 미들웨어 수준에서 커스터마이징 가능합니다.
Harvest는 세 가지 Rails 앱에 맞춤형 전략을 적용했습니다:
* Forecast (API 전용): Redis를 컨텍스트로 사용하여 API 요청 자동 전환을 구현했습니다.
* Harvest ID (웹/내부 API): 특정 API 경로 요청은 주 DB를, 웹 요청은 자동 전환을 따르도록 설정했습니다.
* Harvest (모놀리스): 미들웨어 한계로 ApplicationController
에 around_action
Concern을 구현, 컨트롤러 액션 수준에서 DB 연결을 수동으로 전환했습니다.
이러한 구현을 통해 배포 후 주 DB 쿼리 수가 현저히 감소하고 복제본들의 부하 처리량이 증가하여 시스템 성능과 안정성이 크게 향상되었습니다.
다중 데이터베이스는 고가용성, 확장성, 보안에 이점을 제공하지만 복잡성을 수반합니다. Rails 6부터 내장된 다중 DB 지원은 이 관리에 기여하며, Harvest 사례는 Rails 기본 기능을 유연하게 커스터마이징하는 전략이 성공적인 다중 데이터베이스 구축에 필수적임을 보여줍니다. 이를 통해 애플리케이션의 견고함과 성능을 향상시킬 수 있습니다.