읽기 레플리카가 왜 필요한지, 어떤 문제를 해결하는지, 언제 도움이 되는지(혹은 해가 되는지)를 설명합니다. 일반적인 사용 사례, 한계와 실무적 의사결정 팁 포함.

읽기 레플리카는 기본 데이터베이스(종종 primary라 부름)의 복사본으로, 변경 사항을 지속적으로 받아 최신 상태를 유지합니다. 애플리케이션은 레플리카에 읽기 전용 쿼리(예: SELECT)를 보낼 수 있고, 기본은 계속해서 모든 쓰기(예: INSERT, UPDATE, DELETE)를 처리합니다.
약속은 간단합니다: 기본에 더 많은 부담을 주지 않으면서 읽기 용량을 늘린다는 것입니다.
홈페이지, 제품 페이지, 사용자 프로필, 대시보드처럼 조회 트래픽이 많은 애플리케이션에서는 일부 읽기를 하나 이상의 레플리카로 옮기면 기본이 쓰기와 중요한 읽기에 집중할 수 있게 됩니다. 많은 환경에서 이는 애플리케이션 변경을 최소화하고, 하나의 데이터베이스를 진실의 원본으로 유지하면서 레플리카를 추가해 쿼리할 수 있는 또 다른 장소를 제공하는 방식으로 이루어집니다.
읽기 레플리카는 유용하지만 마법의 성능 버튼은 아닙니다. 레플리카는 다음을 하지 않습니다:
레플리카를 읽기 확장 도구이자 트레이드오프가 있는 옵션으로 생각하세요. 나머지 글은 언제 레플리카가 실제로 도움이 되는지, 자주 실패하는 방식들, 그리고 복제 지연(replication lag) 과 최종적 일관성(eventual consistency) 이 레플리카에서 읽을 때 사용자가 보게 되는 동작에 어떻게 영향을 주는지를 설명합니다.
단일 기본 데이터베이스 서버는 처음에는 "충분히 큰" 것처럼 보입니다. 쓰기(삽입, 업데이트, 삭제)를 처리하고 앱, 대시보드, 내부 도구의 모든 읽기 요청(SELECT 쿼리)을 응답합니다.
사용량이 증가하면 보통 읽기가 쓰기보다 더 빠르게 늘어납니다: 페이지 뷰마다 여러 쿼리가 발생할 수 있고, 검색 화면은 많은 조회로 분산될 수 있으며, 분석형 쿼리는 많은 행을 스캔할 수 있습니다. 쓰기량이 중간 정도여도 기본은 두 가지 일을 동시에 해야 해서 병목이 될 수 있습니다: 변경을 안전하고 빠르게 받아들이는 것과 증가하는 읽기 트래픽을 낮은 대기시간으로 서비스하는 것입니다.
읽기 레플리카는 그 작업 부하를 분리하기 위해 존재합니다. 기본은 쓰기를 처리하고 "진실의 원본"을 유지하는 데 집중하고, 하나 이상의 레플리카는 읽기 전용 쿼리를 처리합니다. 애플리케이션이 일부 쿼리를 레플리카로 라우팅할 수 있다면 기본의 CPU, 메모리, I/O 압력을 줄일 수 있습니다. 이는 일반적으로 전반적인 응답성을 개선하고 쓰기 버스트를 처리할 여유를 남겨줍니다.
복제는 기본의 변경을 다른 서버로 복사하여 레플리카를 최신 상태로 유지하는 메커니즘입니다. 기본은 변경을 기록하고, 레플리카는 그 변경을 적용해 거의 동일한 데이터를 사용해 쿼리에 응답할 수 있게 됩니다.
이 패턴은 PostgreSQL, MySQL 등 여러 데이터베이스 시스템과 관리형 서비스 전반에 걸쳐 일반적입니다. 구현 세부는 다르지만 목표는 같습니다: 기본을 계속 수직 확장하지 않고 읽기 용량을 늘리는 것.
기본 데이터베이스를 "진실의 원본"으로 생각하세요. 기본은 주문 생성, 프로필 업데이트, 결제 기록 같은 모든 쓰기를 받아들여 확실한 순서를 지정합니다.
그 다음 하나 이상의 읽기 레플리카가 기본을 따라가며, 변경 사항을 복사해(SELECT 같은 읽기 쿼리에 답할 수 있도록) 더 이상의 부하를 기본에 주지 않고 읽기 요청에 응답할 수 있게 됩니다.
읽기는 레플리카에서 제공될 수 있지만 쓰기는 여전히 기본으로 갑니다.
복제는 대략 두 가지 모드로 일어납니다:
레플리카가 기본보다 뒤처지는 그 지연을 복제 지연(replication lag) 이라 부릅니다. 이는 자동으로 실패를 의미하지 않으며, 읽기를 확장하기 위해 수용하는 일반적인 트레이드오프입니다.
사용자에게 지연은 최종적 일관성으로 나타납니다: 무언가를 변경한 후 시스템은 결국 모든 곳에서 일관성을 갖게 되지만 즉시 그렇지 않을 수 있습니다.
예: 이메일 주소를 업데이트하고 프로필 페이지를 새로고침하면, 페이지가 몇 초 뒤처진 레플리카에서 서빙될 경우 잠시 옛 이메일이 보일 수 있습니다—레플리카가 업데이트를 적용하고 따라잡을 때까지.
읽기 레플리카는 기본 데이터베이스가 쓰기에는 건강하지만 읽기 트래픽을 처리하느라 과부하일 때 도움이 됩니다. 쓰기 데이터(INSERT/UPDATE/DELETE)를 변경하지 않고도 의미 있는 SELECT 부하를 오프로드할 수 있을 때 가장 효과적입니다.
다음과 같은 패턴을 찾아보세요:
SELECT 쿼리 비율이 INSERT/UPDATE/DELETE에 비해 매우 높음\n- 쓰기는 안정적인데 피크 시 읽기 쿼리가 느려짐\n- 제품 페이지, 피드, 검색 결과 같은 읽기 중심 엔드포인트로 인한 커넥션 풀 포화레플리카를 추가하기 전에 다음 신호로 검증하세요:\n\n- CPU vs I/O: 읽기 지연이 증가할 때 기본의 CPU가 최대치인지, 아니면 디스크 읽기 I/O가 병목인지?\n- 쿼리 구성: 슬로우 쿼리 로그/APM에서 SELECT에 소비되는 비율\n- p95/p99 읽기 지연: 읽기 엔드포인트와 데이터베이스 쿼리 지연을 별도로 추적\n- 버퍼/캐시 적중률: 적중률이 낮으면 읽기가 디스크 접근을 강제할 수 있음\n- 총 시간 기준 상위 쿼리: 하나의 비싼 쿼리가 전체 "읽기 부하"를 좌우할 수 있음
종종 첫 번째로 할 일은 튜닝입니다: 올바른 인덱스 추가, 쿼리 재작성, N+1 호출 줄이기, 핫 읽기 캐시. 이런 변경은 레플리카 운영보다 더 빠르고 저렴할 수 있습니다.
레플리카를 선택하세요, 만약:\n\n- 대부분의 부하가 읽기 트래픽이고 읽기가 이미 합리적으로 최적화되어 있다\n- 오프로드된 쿼리에 대해 가끔 오래된 읽기를 허용할 수 있다\n- 위험한 스키마/쿼리 변경 없이 빠르게 추가 용량이 필요하다
먼저 튜닝을 선택하세요, 만약:\n\n- 몇몇 쿼리가 전체 읽기 시간의 대부분을 차지한다\n- 인덱스 누락이나 비효율적 조인이 명확하다\n- 낮은 트래픽에서도 읽기가 느리다면(쿼리 설계 문제의 신호)
읽기 레플리카는 기본 데이터베이스가 체크아웃, 가입, 업데이트 같은 쓰기를 처리하느라 바쁠 때 특히 가치가 있습니다. 프라이머리–레플리카 아키텍처에서 적절한 쿼리를 레플리카로 보내면 애플리케이션 기능을 바꾸지 않고 데이터베이스 성능을 개선할 수 있습니다.
대시보드는 종종 그룹화, 긴 기간 필터링, 여러 테이블 조인을 포함하는 긴 쿼리를 실행합니다. 이런 쿼리는 CPU, 메모리, 캐시를 트랜잭션 작업과 경쟁하게 만듭니다.
레플리카는 다음에 적합합니다:\n\n- 내부 보고 워크로드\n- 운영 대시보드\n- 일별/주별 메트릭 뷰
기본을 빠르고 예측 가능한 트랜잭션에 집중시키고 분석 읽기를 독립적으로 확장합니다.
카탈로그 브라우징, 사용자 프로필, 콘텐츠 피드는 비슷한 읽기 쿼리를 대량으로 생성할 수 있습니다. 읽기 확장이 병목일 때 레플리카는 트래픽을 흡수하고 지연 스파이크를 줄일 수 있습니다.
특히 캐시 미스가 많거나(많은 고유 쿼리) 전적으로 애플리케이션 캐시에 의존할 수 없을 때 효과적입니다.
내보내기, 백필, 요약 재계산, 조건에 맞는 모든 레코드를 찾는 작업은 기본을 괴롭힐 수 있습니다. 이런 스캔을 레플리카에서 실행하는 것이 종종 더 안전합니다.
단, 작업이 최신 업데이트를 보는 것을 요구하면 복제 지연을 허용해야 합니다.
전 세계로 서비스한다면, 사용자에게 더 가까운 곳에 레플리카를 배치해 왕복 시간을 줄일 수 있습니다. 트레이드오프는 지연이나 네트워크 문제 동안 오래된 읽기에 더 많이 노출된다는 점이므로(탐색, 추천, 공개 콘텐츠처럼) "거의 최신"이 허용되는 페이지에 적합합니다.
읽기 레플리카는 "충분히 가까운" 결과가 좋을 때 훌륭합니다. 제품이 조용히 모든 읽기가 최신 쓰기를 반영한다고 가정할 때 레플리카는 문제를 일으킵니다.
사용자가 프로필을 편집하거나 폼을 제출하거나 계정 설정을 바꾸고 다음 페이지 로드가 몇 초 뒤처진 레플리카에서 서비스되면 업데이트가 성공했음에도 사용자는 옛 데이터를 보게 됩니다—재시도, 중복 제출, 신뢰 상실로 이어질 수 있습니다.
이것은 즉시 확인을 기대하는 흐름에서 특히 고통스럽습니다: 이메일 변경, 환경설정 토글, 문서 업로드, 댓글 작성 후 리디렉션 등.
일부 읽기는 잠깐이라도 오래된 것을 허용하면 안 됩니다:\n\n- 장바구니와 결제 총합\n- 지갑 잔액, 포인트, 재고 수량\n- "내 결제가 성공했나?" 상태 화면
레플리카가 뒤처지면 잘못된 장바구니 총합을 보여주거나 재고를 과매도하거나 오래된 잔액을 표시할 수 있습니다. 시스템이 나중에 수정하더라도 사용자 경험(및 고객지원량)에 타격을 줍니다.
내부 대시보드는 사기 검토, 고객 지원, 주문 이행, 중재, 사고 대응 같은 실제 결정을 내립니다. 운영 도구가 레플리카를 읽으면 불완전한 데이터를 기반으로 조치를 취할 위험이 있습니다—예: 이미 환불된 주문을 다시 환불하거나 최신 상태 변경을 놓치는 경우.
일반적인 패턴은 조건부 라우팅입니다:\n\n- 사용자가 쓰기를 한 후 일정 시간(초~분) 동안 그들의 확인성 읽기를 기본으로 보냅니다.\n- 배경, 익명, 비핵심 읽기는 레플리카에 유지합니다.
이렇게 하면 레플리카의 이점을 유지하면서 일관성 문제를 줄일 수 있습니다.
복제 지연은 기본에서 쓰기가 커밋된 시점과 그 변경이 레플리카에서 보이는 시점 사이의 지연입니다. 애플리케이션이 그 지연 동안 레플리카에서 읽으면 "오래된" 결과를 반환할 수 있습니다—한 순간 전에는 참이었지만 지금은 그렇지 않은 데이터입니다.
지연은 정상이며 보통 부하가 증가할 때 커집니다. 일반적인 원인:\n\n- 기본의 부하 급증: 더 많은 쓰기가 전송되고 적용되어야 함\n- 레플리카의 성능 부족/과부하: 레플리카가 변경을 도착하는 속도만큼 빠르게 적용하지 못함(예: CPU, 디스크 I/O)\n- 네트워크 지연 또는 지터: 복제 스트림 이동 지연\n- 대용량 트랜잭션/일괄 업데이트: 하나의 큰 변경이 직렬화, 전송, 재생하는 데 시간이 걸림
지연은 단순히 "신선도"에만 영향을 주지 않습니다—사용자 관점에서의 정확성에도 영향을 줍니다:\n\n- 사용자가 프로필을 업데이트한 뒤 새로고침하면 옛 값이 보일 수 있음\n- "안 읽은 메시지" 배지나 알림 카운트가 약간 뒤처짐\n- 운영/보고 화면이 최신 주문, 환불, 상태 변경을 놓침
기능이 무엇을 허용할 수 있는지 결정하세요:\n\n- 허용 시간 창 추가: "데이터는 최대 30초 오래될 수 있음" 같은 문구는 많은 대시보드에서 받아들여짐\n- 쓰기 직후 읽기는 기본으로 라우팅: 사용자가 무언가를 변경한 뒤 그 엔티티를 일정 기간 기본에서 읽도록 함\n- UI 안내: 기대 설정("업데이트 중…", "표시되기까지 몇 초 걸릴 수 있음")\n- 재시도 로직: 중요한 읽기에서 방금 쓴 레코드가 없으면 기본으로 재시도하거나 짧게 대기 후 재시도
레플리카 지연(시간/바이트 뒤처짐), 레플리카 적용률, 복제 오류, 레플리카 CPU/디스크 I/O를 추적하세요. 지연이 합의된 허용치를 초과할 때(예: 5s, 30s, 2m) 및 지연이 계속 증가할 때 알림을 설정하세요(레플리카가 개입 없이 따라잡지 못할 수 있다는 신호).
읽기 레플리카는 읽기 확장(read scaling) 을 위한 도구입니다: SELECT 쿼리를 제공할 수 있는 장소를 늘립니다. 이들은 쓰기 확장(write scaling) 을 위한 도구가 아닙니다: 시스템이 더 많은 INSERT/UPDATE/DELETE를 수용하는 방법을 늘려주지 않습니다.
레플리카를 추가하면 읽기 용량이 늘어납니다. 애플리케이션이 읽기 중심 엔드포인트(제품 페이지, 피드, 조회)에 병목이 걸려 있다면 쿼리를 여러 머신에 분산할 수 있습니다.
이는 종종 다음을 개선합니다:\n\n- 피크 시 쿼리 지연(기본의 경쟁 감소)\n- 읽기 처리량(더 많은 CPU/메모리/I/O를 SELECT에 사용 가능)\n- 무거운 읽기의 분리(보고서 작업이 트랜잭션 트래픽에 간섭하지 않음)
많은 사람이 "레플리카가 늘면 쓰기 처리량도 늘어난다"고 오해합니다. 전형적인 프라이머리-레플리카 구성에서 모든 쓰기는 여전히 기본으로 갑니다. 실제로 레플리카가 많아지면 기본은 각 레플리카로 복제 데이터를 생성하고 전송해야 하기 때문에 약간의 작업이 더 늘어날 수 있습니다.
쓰기 처리량이 문제라면 레플리카는 해결책이 아닙니다. 보통 쿼리/인덱스 튜닝, 배치 처리, 파티셔닝/샤딩, 또는 데이터 모델 변경 같은 다른 접근을 고려해야 합니다.
레플리카가 읽기 CPU를 제공해도 먼저 연결 한도에 도달할 수 있습니다. 각 데이터베이스 노드는 동시 연결 수에 한계가 있고, 레플리카를 추가하면 애플리케이션이 연결할 수 있는 장소가 늘어나지만 총 수요는 줄지 않습니다.
실용 규칙: 커넥션 풀링(또는 풀러)을 사용하고 서비스별 연결 수를 의도적으로 관리하세요. 그렇지 않으면 레플리카는 단지 "과부하시킬 수 있는 더 많은 데이터베이스"가 될 뿐입니다.
레플리카는 다음과 같은 실비용을 추가합니다:\n\n- 더 많은 노드(컴퓨트 비용)\n- 더 많은 스토리지(각 레플리카가 전체 복사본을 저장)\n- 운영 노력 증가(지연 모니터링, 백업/복구 전략, 스키마 변경, 사고 대응)
트레이드오프는 간단합니다: 레플리카는 읽기 헤드룸과 분리를 사올 수 있지만 복잡성을 더하고 쓰기 한계는 옮기지 않습니다.
레플리카는 읽기 가용성(read availability) 을 개선할 수 있습니다: 기본이 과부하되거나 잠시 사용 불가 시에도 레플리카에서 일부 읽기 전용 트래픽을 계속 제공할 수 있습니다. 이는 고객 페이지의 응답성을 유지하고 기본 사고의 영향 범위를 줄이는 데 도움이 됩니다(약간 오래된 데이터를 허용할 때).
레플리카 자체만으로 완전한 고가용성 계획을 제공하지는 않습니다. 레플리카는 보통 자동으로 쓰기를 받을 준비가 되어 있지 않고, "읽기 가능한 복사본이 존재한다"는 것과 "시스템이 안전하게 빠르게 쓰기를 다시 받을 수 있다"는 것은 다릅니다.
장애 조치는 일반적으로: 기본 실패 감지 → 레플리카 선택 → 레플리카를 새 기본으로 승격 → 쓰기(및 보통 읽기) 대상 리디렉션입니다.
일부 관리형 데이터베이스는 이를 자동화하지만 핵심 아이디어는 동일합니다: 누가 쓰기를 받아들일 수 있는지를 변경하는 것.
장애 조치는 연습해야 합니다. 스테이징에서(그리고 프로덕션에서는 낮은 위험 창에 신중히) 게임데이 테스트를 실행하세요: 기본 손실을 시뮬레이션하고 복구 시간 측정, 라우팅 검증, 앱이 읽기 전용 기간과 재연결을 정상적으로 처리하는지 확인하세요.
레플리카는 트래픽이 실제로 레플리카에 도달할 때만 도움이 됩니다. "읽기/쓰기 분리"는 쓰기를 기본으로 보내고 적절한 읽기를 레플리카로 보내는 규칙 모음으로, 정확성을 깨뜨리지 않고 동작해야 합니다.
가장 단순한 접근은 데이터 액세스 레이어에서 명시적 라우팅을 하는 것입니다:\n\n- 모든 쓰기(INSERT/UPDATE/DELETE, 스키마 변경)는 기본으로 갑니다.\n- 선택된 읽기만 레플리카를 사용하도록 허용합니다.
이 방식은 이해하기 쉽고 롤백도 쉽습니다. 또한 "체크아웃 후 일정 시간 주문 상태는 기본에서 읽기" 같은 비즈니스 규칙을 인코딩하기 적합합니다.
일부 팀은 프록시나 스마트 드라이버를 선호합니다. 이것은 기본/레플리카 엔드포인트를 이해하고 쿼리 유형이나 연결 설정에 따라 라우팅합니다. 이는 애플리케이션 코드 변경을 줄여주지만 주의할 점은: 프록시가 제품 관점에서 어떤 읽기가 "안전한지"를 확실히 알 수는 없다는 것입니다.
좋은 후보:\n\n- 분석, 보고 작업, 대시보드\n- 약간 오래된 데이터가 허용되는 검색/브라우징 페이지\n- 재시도 가능하고 최신 값이 필요 없는 백그라운드 작업
사용자가 방금 쓴 직후의 읽기(예: "프로필 업데이트 → 프로필 다시 로드")는 일관성 전략이 없다면 레플리카로 보내지 마세요.
트랜잭션 내에서는 모든 읽기를 기본에서 유지하세요.
트랜잭션 외부에서는 “read-your-writes” 세션을 고려하세요: 쓰기 후 사용자/세션을 짧은 TTL 동안 기본에 고정하거나 특정 후속 쿼리를 기본으로 라우팅합니다.
레플리카 하나를 추가하고 제한된 엔드포인트/쿼트에 라우팅을 적용한 뒤 비교하세요:\n\n- 기본 CPU 및 읽기 IOPS\n- 레플리카 활용률\n- 에러율 및 지연 백분위수\n- 오래된 읽기 관련 사고
영향이 명확하고 안전할 때만 라우팅을 확장하세요.
읽기 레플리카는 "한 번 설정하고 잊어버리는" 대상이 아닙니다. 추가적인 데이터베이스 서버로서 자체 성능 한계, 실패 모드, 운영 작업이 있습니다. 약간의 모니터링 규율이 "레플리카가 도움이 되었다"와 "레플리카가 혼란을 더했다"를 가르는 차이입니다.
사용자 체감 증상을 설명해주는 지표에 집중하세요:\n\n- 레플리카 지연: 레플리카가 기본에 얼마나 뒤처져 있는지(초/바이트/LSN 위치). 오래된 읽기의 조기 경보입니다.\n- 복제 오류: 연결 끊김, 인증 실패, 디스크 풀, 복제 슬롯 문제. 이런 건 소음이 아니라 사고로 취급하세요.\n- 쿼리 지연(p50/p95): 레플리카 대 기본. 레플리카도 캐시 상태나 하드웨어 차이로 느릴 수 있습니다.\n- 캐시 적중률: 레플리카가 재시작이나 트래픽 변화 후 지속적으로 적중하지 못하면 지연이 커집니다.
읽기 오프로드가 목표라면 레플리카 하나로 시작하세요. 명확한 제약이 있을 때 추가하세요:\n\n- 읽기 처리량: 하나의 레플리카가 피크 QPS나 무거운 분석 쿼리를 감당 못함\n- 분리: 대시보드용으로 레플리카를 전용하면 사용자 트래픽과 자원 경쟁을 피할 수 있음\n- 지리적 요구: 지역별 레플리카는 읽기 지연을 줄이지만 운영 오버헤드를 증가시킴
실용 규칙: 읽기가 병목임을 인덱스, 느린 쿼리, 앱 캐싱 문제가 아님을 확인한 뒤에만 레플리카를 늘리세요.
읽기 레플리카는 읽기 확장을 위한 도구 중 하나이지만 보통 첫 번째 레버는 아닙니다. 운영 복잡성을 추가하기 전에 더 단순한 해결책이 동일한 결과를 줄 수 있는지 확인하세요.
캐싱은 데이터베이스에서 일부 읽기를 완전히 제거할 수 있습니다. 제품 상세, 공개 프로필, 구성 같은 읽기 우위 페이지는 앱 캐시나 CDN으로 큰 부하를 줄일 수 있습니다—복제 지연을 도입하지 않고.
인덱싱 및 쿼리 최적화는 일반적으로 대부분의 상황에서 레플리카보다 더 큰 효과를 냅니다: 올바른 인덱스 추가, 필요 없는 컬럼 제거, N+1 회피, 나쁜 조인 수정 등은 "레플리카가 필요"하다는 결론을 "더 나은 계획이 필요"로 바꿀 수 있습니다.
머티리얼라이즈드 뷰 / 사전 집계는 워크로드가 본질적으로 무겁을 때(분석, 대시보드)에 유용합니다. 복잡한 쿼리를 재실행하는 대신 계산된 결과를 저장하고 주기적으로 갱신합니다.
만약 쓰기가 병목이라면(핫 로우, 락 컨텐션, 쓰기 IOPS 한계), 레플리카는 큰 도움이 되지 않습니다. 이럴 때는 테이블을 시간/테넌트별로 파티셔닝하거나 고객 ID 기준으로 샤딩해 쓰기 부하와 컨텐션을 분산하는 것이 필요합니다. 이는 더 큰 건축적 변화이지만 실제 제약을 해결합니다.
네 가지 질문을 하세요:\n\n1. 목표가 무엇인가? 읽기 지연을 줄이는 것, 보고서 워크로드 오프로드, 아니면 가용성 향상?\n2. 읽기는 얼마나 신선해야 하는가? 오래된 읽기를 허용할 수 없다면 레플리카가 사용자 눈에 보이는 문제를 일으킬 수 있음.\n3. 예산은? 레플리카는 인프라 비용과 지속적 운영 비용을 늘립니다.\n4. 얼마나 많은 복잡성을 감당할 수 있는가? 읽기/쓰기 분리, 최종적 일관성 처리, 장애 조치 테스트는 쉬운 일이 아님.
프로토타입 단계나 서비스를 빠르게 띄울 때는 이 제약들을 아키텍처에 미리 반영하는 것이 도움이 됩니다. 예를 들어 Koder.ai(채팅 인터페이스로 React 앱을 Go + PostgreSQL 백엔드로 생성하는 바이브-코딩 플랫폼)에 구축하는 팀들은 보통 단순성을 위해 단일 기본에서 시작하고, 대시보드, 피드, 내부 보고가 트랜잭션 트래픽과 경쟁하기 시작하면 레플리카로 확장합니다. 계획 우선 워크플로를 사용하면 어떤 엔드포인트가 최종적 일관성을 견딜 수 있고 어떤 것은 기본에서 "read-your-writes"여야 하는지를 미리 결정하기가 쉽습니다.
도움이 필요하면 /pricing에서 옵션을 확인하거나 /blog에서 관련 가이드를 찾아보세요.
읽기 레플리카는 기본(primary) 데이터베이스의 복사본으로, 변경 사항을 지속적으로 받아 읽기 전용 쿼리(예: SELECT)에 응답할 수 있습니다. 이는 특정 읽기 트래픽을 기본에서 분산시켜 읽기 용량을 늘리는 데 도움이 됩니다.
아니요. 일반적인 primary–replica 구성에서는 모든 쓰기는 여전히 기본(primary)에 기록됩니다. 레플리카는 오히려 기본에서 각 레플리카로 변경 사항을 전송해야 하므로 약간의 오버헤드를 추가할 수 있습니다.
주로 읽기 바운드(read-bound) 상황에서 도움이 됩니다. SELECT 트래픽이 많아 기본의 CPU/I/O나 연결이 압박받을 때, 그리고 보고서나 내보내기 작업 같은 무거운 읽기 작업을 트랜잭션 작업과 분리하고 싶을 때 유효합니다.
반드시 그렇지는 않습니다. 쿼리가 인덱스 부족, 비효율적 조인, 큰 테이블 스캔 등으로 느리다면 레플리카에서도 느릴 가능성이 높습니다—단지 다른 곳에서 느려질 뿐입니다. 몇몇 쿼리가 전체 시간을 지배한다면 먼저 쿼리와 인덱스를 최적화하세요.
복제 지연(replication lag)은 기본에서 쓰기가 커밋된 시점과 그 변경이 레플리카에서 보이는 시점 사이의 지연입니다. 이 동안 레플리카에서 읽으면 일시적으로 오래된(stale) 데이터를 볼 수 있어, 일부 읽기는 결국 일관성을 갖게 되지만 즉시 일관성을 보장하지 않습니다.
일반적인 원인들:
다음과 같은 읽기는 레플리카에서 읽는 것을 피하세요:
이런 경우에는 최소한 중요한 경로에서는 기본(primary) 에서 읽는 것이 안전합니다.
다음과 같은 read-your-writes 전략을 사용하세요:
다음 신호들을 추적하세요:
제품 허용치(예: 5초/30초/2분)를 초과하면 알림을 설정하세요.
대안으로는:
레플리카는 읽기가 이미 합리적으로 최적화되어 있고 어느 정도의 일시적 불일치를 허용할 수 있을 때 가장 적합합니다.