Scaling Rails on Bare Metal - Horizontal Scaling, Connection Pooling, Read Replicas, Load Balancing
개요
베어 메탈 환경에서 Rails 애플리케이션을 확장하는 것은 병목 현상을 단계별로 제거하는 과정이며, 반복 가능한 설정이 중요합니다.
주요 내용
* 단일 노드 안정화: 확장 전에 Puma 설정(workers, threads)과 PostgreSQL 연결 풀 설정을 최적화하여 단일 노드를 안정적으로 만듭니다.
* Nginx를 통한 수평 확장: Nginx를 로드 밸런서로 사용하여 여러 애플리케이션 노드(Puma 프로세스)로 트래픽을 분산합니다. least_conn 설정을 활용합니다.
* 데이터베이스 연결 관리: 여러 애플리케이션 서버, 워커, 스레드로 인해 PostgreSQL 연결 수가 증가하므로, 총 연결 예산을 계산하고 필요시 PgBouncer를 사용하여 연결 풀링을 관리합니다.
* Redis 활용: 캐싱, 속도 제한, 백그라운드 작업 큐, 메타데이터 저장 등 다양한 용도로 Redis를 활용하여 PostgreSQL의 부하를 줄입니다.
* 읽기 복제본(Read Replica) 도입: 읽기 작업이 많은 경우, PostgreSQL의 읽기 복제본을 설정하여 기본 데이터베이스의 부하를 분산합니다. 복제본 지연(replica lag)에 유의해야 합니다.
* 부하 테스트: wrk와 같은 도구를 사용하여 실제 트래픽을 생성하고, 테스트 중에 Puma, Nginx, PostgreSQL, Redis의 성능 지표를 모니터링하여 병목 현상을 식별합니다.
* 확장 순서: 베어 메탈 환경에서는 일반적으로 Puma/DB 풀 튜닝, Redis 추가, Nginx 통한 다중 앱 노드, PgBouncer, 읽기 복제본, 백그라운드 작업 분리 순서로 확장하는 것이 관리하기 용이합니다.
시사점
Rails 애플리케이션의 성능 확장은 복잡한 컴포넌트의 집합이 아닌, 각 계층의 압력 지점을 이해하고 체계적으로 병목 현상을 해결하는 데 달려 있습니다.
댓글
GitHub Discussions