피드로 돌아가기
Dev.toInfrastructure
원문 읽기
Bare Metal 환경 Rails 앱의 단계적 수평 확장 및 DB 병목 제거 전략
Scaling Rails on Bare Metal - Horizontal Scaling, Connection Pooling, Read Replicas, Load Balancing
AI 요약
Context
단일 서버 구조의 Rails API에서 발생하는 리소스 병목을 해결하기 위한 확장 전략 분석. 단순 서버 증설이 아닌 App-DB-Cache 계층별 압력 지점 파악을 통한 최적화 필요성 대두.
Technical Solution
- Nginx의
least_conn알고리즘을 통한 요청 처리 시간이 가변적인 Rails 앱의 트래픽 분산 최적화 total_connections = servers * workers * threads공식을 통한 PostgreSQL Connection Budget 사전 계산 및 고갈 방지- Redis Cache Store 도입을 통한 DB 조회 빈도 감소 및 반복 작업 제거로 CPU 부하 경감
- ActiveRecord의
connected_to(role: :reading)설정을 활용한 Read Replica 분리로 Primary DB 쓰기 부하 격리 - systemd 기반의 일관된 App Node 배포 환경 구축으로 수평 확장 시 구성 일관성 확보
- PgBouncer 도입을 통한 DB Connection Churn 문제 해결 및 커넥션 풀링 효율화
실천 포인트
- Puma Worker와 Thread 수 설정에 따른 DB Max Connection 가용량 사전 계산 - 읽기 비중이 높은 쿼리를 Read Replica로 분리하여 Primary DB 부하 분산 - DB 확장 전 Redis 캐싱을 통한 데이터 레이어 압력 제거 우선 검토 - `wrk` 등 부하 테스트 도구로 p95, p99 Latency 및 DB Active Connection 모니터링 - Bare Metal 확장 순서를 'Puma 튜닝 → Redis 캐싱 → Nginx 분산 → PgBouncer → Read Replica' 순으로 적용