Foundry
분산 시스템
심화
핵심

최종 일관성과 읽기 정합성

내가 쓴 글이 안 보이는 버그, 복제 지연의 얼굴

최종 일관성과 읽기 정합성

왜 방금 쓴 데이터가 안 보이나

쓰기 → [Primary] --복제 지연 50ms--> [Replica]
읽기 →                               [Replica]  아직 이전 값
  • 최종 일관성은 언젠가 같아진다는 약속일 뿐, 언제까지는 말해주지 않는다
  • 사용자가 체감하는 버그는 대부분 이 지연 창 안에서 발생한다

필요한 보장들

보장사용자 경험구현
read-your-writes내가 쓴 것은 즉시 보인다쓴 직후 일정 시간 Primary에서 읽기
monotonic reads값이 과거로 되돌아가지 않는다세션을 같은 복제본에 고정
consistent prefix인과 순서가 뒤집히지 않는다연관 데이터를 같은 파티션에 배치

실무 포인트

  • 글 작성 직후 목록 조회를 Primary로 보내는 것이 가장 값싼 해법이다
  • 읽기 분산을 위해 복제본을 늘리면 지연 창과 불일치 가능성도 함께 늘어난다
  • 잔액과 재고처럼 강한 일관성이 필요한 경로만 골라 비싸게 처리한다. 전체를 강하게 만들 필요는 없다
  • DynamoDB처럼 요청 단위로 강한 읽기를 선택할 수 있는 저장소도 있다. 비용은 읽기 단가로 지불한다
면접에서 이렇게 나옵니다

Q.복제 지연 때문에 생기는 대표적인 사용자 버그를 설명해주세요

방금 자기가 한 일이 사라져 보이는 것입니다.

상황사용자가 겪는 것
댓글 작성 후 목록 조회내가 쓴 댓글이 없다
프로필 수정 후 새로고침옛 이름이 보인다
주문 후 주문 목록주문이 안 보여 다시 결제한다
두 번 새로고침있다가 없어진다. 값이 오갔다

앞의 셋은 쓰기를 리더에, 읽기를 복제본에 보내면서 생깁니다. 쓰기는 성공했지만 그 값이 복제본에 아직 도착하지 않았습니다.

마지막은 복제본이 여러 대일 때 생깁니다. 첫 요청은 전파된 복제본, 두 번째는 아직 아닌 복제본으로 가면 값이 오갑니다. 시간이 거꾸로 가는 것처럼 보입니다.

세 번째는 실제 금전 손실로 이어집니다. 사용자가 실패로 오해해 다시 결제합니다.

흔한 실수: 복제 지연을 밀리초 단위라 무시하는 것. 화면 전환이 그보다 빠른 경우가 많고, 지연은 부하가 몰릴 때 초 단위로 커집니다. 평상시 지표로는 안 보입니다.

Q.read-your-writes 일관성을 어떻게 구현하시겠어요?

자기가 쓴 것은 반드시 보이게 하는 보장입니다. 방법이 여러 층입니다.

방법내용대가
쓴 뒤 잠시 리더에서 읽기쓰기 후 몇 초간 그 사용자만 리더로리더 부하가 는다
자기 데이터만 리더에서프로필처럼 본인만 보는 것판별 로직이 필요하다
복제 위치 비교쓰기 시 받은 위치보다 앞선 복제본에서만 읽는다구현이 복잡하다
클라이언트가 값을 들고 있기응답으로 받은 값을 화면에 바로 반영서버 상태와 어긋날 수 있다
쓰기 완료를 기다린다복제 확인 후 응답쓰기 지연이 는다

가장 많이 쓰는 것이 첫 번째와 네 번째입니다. 네 번째는 서버를 건드리지 않아 값싸고, 대부분의 화면에서 충분합니다. 목록을 다시 불러오는 대신 응답으로 받은 항목을 목록에 끼워 넣는 방식입니다.

세 번째가 가장 정확합니다. 쓰기 응답에 복제 위치를 담아 주고, 읽기 요청이 그 위치를 넘긴 복제본으로만 가게 합니다.

흔한 실수: 모든 읽기를 리더로 보내 해결하는 것. 그러면 복제본을 둔 이유가 없어집니다. 사용자 본인의 최근 쓰기와 관련된 읽기만 좁게 처리해야 합니다.

Q.읽기 복제본을 늘렸을 때 생기는 부작용은 무엇인가요?

읽기 처리량은 늘지만 다른 비용이 함께 늘어납니다.

부작용내용
복제 지연 편차복제본마다 진행 정도가 달라 같은 조회가 다른 값을 준다
리더 부담리더가 모든 복제본에 변경을 보내야 한다
값이 오간다요청이 다른 복제본으로 가면 있다가 없어져 보인다
승격 후보 판단리더 장애 시 어느 복제본이 가장 앞선지 확인해야 한다
비용저장과 인스턴스 비용이 배로 든다
쓰기는 그대로쓰기 병목은 전혀 개선되지 않는다

세 번째를 막으려면 같은 사용자를 같은 복제본에 붙이는 방법을 씁니다. 그러면 최소한 한 사용자 안에서는 시간이 거꾸로 가지 않습니다.

두 번째는 복제본이 많아질 때 실제 한계로 옵니다. 이 경우 복제본이 복제본을 받는 연쇄 구조로 바꿔 리더 부담을 줄입니다. 대신 지연이 더 커집니다.

흔한 실수: 복제본을 늘려 성능 문제를 해결하려는 것. 읽기가 병목일 때만 효과가 있고, 쓰기나 잠금 경합이 원인이면 아무것도 나아지지 않습니다.

Q.어떤 데이터에 강한 일관성이 필요한지 어떤 기준으로 판단하나요?

어긋난 값으로 결정을 내리면 되돌릴 수 없는지를 봅니다.

질문그렇다면
그 값으로 돈이 움직이는가강한 일관성
되돌릴 수 없는 행동을 하는가강한 일관성. 발송, 발권
권한이나 접근을 결정하는가강한 일관성. 회수한 권한이 남으면 사고다
중복이 생기면 손실인가강한 일관성. 재고, 좌석
사용자가 어긋남을 알아채는가자기 쓰기라면 read-your-writes 정도는 필요하다
통계나 집계인가결과적 일관성으로 충분하다

같은 데이터도 쓰임에 따라 다릅니다. 재고 숫자를 목록에 보여줄 때는 옛 값이어도 되고, 주문을 확정할 때는 원본에서 조건부로 확인해야 합니다. 데이터 종류가 아니라 그 순간의 판단 목적이 기준입니다.

비용도 함께 봅니다. 강한 일관성은 지연이 늘고 장애 시 가용성을 잃습니다. 필요 없는 곳에 걸면 그 대가만 남습니다.

흔한 실수: 중요한 데이터니까 전부 강하게 맞추는 것. 중요도가 아니라 어긋남이 만드는 결과로 판단해야 합니다. 중요한 개인 정보도 몇 초 늦게 반영돼도 문제가 없는 경우가 많습니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

분산 시스템 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.