Inflearn brand logo image

인프런 커뮤니티 질문&답변

공부맛있다님의 프로필 이미지
공부맛있다

작성한 질문수

장애를 허용하는 견고한 시스템 만들기

이중화와 복제(Replication)

복제 관련 질문입니다!

작성

·

43

1

안녕하세요. 준형님.

강의와는 조금 벗어나는 얘기라서 답변을 해주시지 않아도 괜찮습니다.!

복제를 구성하는 경우 복제 지연에 대해서 고민을 하게 되었는데, 마땅한 대안을 내지 못해서 이렇게 질문드리게 되었습니다.

혹시 실무에서나 일반적으로 복제 지연을 대응(해결)하기 위한 해결책에는 어떤것이 있을까요...???

 

답변 2

1

이준형(Foo)님의 프로필 이미지
이준형(Foo)
지식공유자

오래 기다리셨습니다.

 

일반적으로는 Primary-Replica 간의 복제 지연이 크게 문제가 되진 않지만, 만약 신경 써야하는 상황이라면

  1. 근본적인 DB 복제 지연 시간 줄이기

     

  2. '방금 글 쓴 사용자(시스템)'의 읽기 요청은 Primary DB로 보내주기

위 2가지 방법이 함께 적용되면 좋을 것 같습니다.

1번은 복제 지연 시간을 줄여 가급적 복제 지연으로 인한 데이터 불일치가 발생하지 않도록 하는겁니다. 방법은 여러가지겠지만, DB 서버들의 사양을 올리고 쿼리 튜닝, 병렬 복제 등 다양한 수단을 활용하면 됩니다. 다만 이 부분은 백엔드 개발자보다는 DBA 레벨에서 다뤄야할 내용들 인 것 같아요.

 

그럼 2번은 복제 지연이 발생하면 안되는 요청과 아닌 요청을 구분하여 복제 지연이 발생하면 안되는 요청에 대해선 읽기 연산도 Primary에서 이루어지도록 하는겁니다.

  • 이 때에는 당연히 사용자나 시스템을 구분할 수 있는 Key를 두어 구분해야하고, 시스템마다 공유할 수 있게 Redis 같은 공유 저장소를 활용해야합니다.

  • 그리고 스프링 부트 애플리케이션 기준으로 DataSource 를 Primary와 Replica 양쪽에 대해 설정해주고, 요청에 따라 읽기 연산이지만 Primary로 연결해야할 요소를 구분해줘야합니다. AOP를 활용하면 좋겠죠?

  • 다만 이렇게 설정하는게 정말 우리 시스템에 필요한지 검토해볼 필요가 있습니다. DataSource 설정이 두개가 되는 것도 설정의 복잡함을 만들고, 일반적으로 Primary-Replica 구조에서 사용하는 DB Proxy를 활용한 자동 Failover가 동작하지 않을 수도 있습니다. 애플리케이션 레벨에서 Failover를 직접 처리해줘야할 수도 있어요. 이런 불편함을 감수할 필요가 있는지 검토가 필요합니다.

 

제가 대략 알고있는, 경험해본 내용은 이정도인데 답변이 됐을까요? 추가적으로 궁금한 내용 있으면 질문 남겨주세요~ :)

안녕하세요, 준형님! 상세하고 깊이 있는 답변에 다시 한번 진심으로 감사드립니다.

보내주신 답변 덕분에 막연하게만 느껴졌던 복제 지연 문제에 대해 조금 더 알아갈 수 있었습니다..! 특히 저는 DB의 성능을 개선하거나 쿼리를 튜닝하는 1번 방법만 단편적으로 생각하고 있었는데, '방금 글을 쓴 사용자의 읽기 요청은 Primary로 보낸다'는 2번 아이디어는 정말 생각지도 못한 부분이었습니다.

 

준형님께서 알려주신 해결 방안들을 보며, 문득 어떤 상황에서 이러한 복잡성을 감수하고서라도 복제 지연을 적극적으로 관리해야 하는지 그 '판단의 기준'이 궁금해졌습니다.

경험하셨던 사례 중, "아, 이 기능(서비스)에서는 복제 지연이 발생하면 안되겠구나"라고 느끼셨던 상황들도 혹시 있으셨을까요?

 

바쁘실 텐데 귀한 시간 내어 답변해주셔서 정말 감사합니다. 덕분에 많이 배우고 있습니다!

이준형(Foo)님의 프로필 이미지
이준형(Foo)
지식공유자

별말씀을요~ ㅎㅎ

경험하셨던 사례 중, "아, 이 기능(서비스)에서는 복제 지연이 발생하면 안되겠구나"라고 느끼셨던 상황들도 혹시 있으셨을까요?

-> 제가 하고있는 업무에서는 복제 지연이 크리티컬한 경우는 많지 않아서.. + 크리티컬하지 않도록, 멱등성 있게 작성하기 때문에 제가 경험한 상황은 아니지만 주로 커머스 서비스의 재고 관리나 티켓 예약 기능 같은게 복제지연에 민감합니다.

 

저는 이 문제를 '기술'의 영역이라기보다, '어떤 사용자 경험을 제공할 것인가'에 대한 '정책'과 '기획'의 영역으로 보는 게 맞다고 생각합니다. 기술적으로는 얼마든지 해결할 수 있지만, 모든 기능에 완벽한 실시간성을 적용하는 건 비용과 복잡성 면에서 비효율적이니까요.

결국 '이 기능이 그 비용을 감수할 만큼 사용자 경험에 치명적인가?' 를 판단하는 우선순위의 문제입니다. 기획/설계 레벨에서 '재고처럼 1초의 오차도 허용 못 하는 경험'이라는 정책을 정하면, 그 기준을 만족시키는 최적의 기술을 선택하고 구현하면 되는 문제라고 생각합니다. 트레이드 오프 관계이니 성능과 일관성 중 어떤게 우선시 되어야할지 선택해야하는 문제 같아요.

 

궁금하신 내용에 대한 답변이 됐을까요?

또 궁금한 내용 있으면 질문 남겨주세요~

감사합니다.

0

이준형(Foo)님의 프로필 이미지
이준형(Foo)
지식공유자

공부맛있다님 안녕하세요!

 

좀 더 구체적으로 복제 지연 때문에 어떤게 문제가 되는지 이야기 해주시면 저도 같이 고민해볼 수 있을 것 같습니다~

DB 레벨에서의 복제 지연에 대한 내용일까요~?

어쩌면 CAP 이론에 대한 내용 읽어보시면 궁금하셨던 내용을 해소하거나 좀 더 구체화시켜서 질문주실 수 있을 것 같습니다!

한번 확인해보시고 마저 질문 남겨주세요~

안녕하세요 준형님! CAP 이론 자료도 제공해 주셔서 감사합니다. :)

강의 내용처럼 MySQL Replication(Primary-Replica)을 구성하는 경우에 복제 지연도 함께 고민할 것 같다고 생각이 들었습니다!

 

RDB의 경우 복제 지연으로 인해서 Primary에서 데이터를 쓴 직후, Replica에서 읽기를 시도할 때 복제가 완료되지 않아 이전 데이터를 읽는 상황이 존재할 것 같은데요...!

이런 상황에서는 무엇을 먼저 고민해봐야 할 지, 실제로 실무에서는 어떤 방식으로 문제를 완화하는지 궁금했습니다! (애플리케이션에서 취할 수 있는 대응 방안 혹은 DB 레벨에서 복제 지연 최소화 방법과 같은..)

강의 내용과 많이 벗어난 질문에도 친절하게 답변해 주셔서 다시 한번 감사드립니다.

이준형(Foo)님의 프로필 이미지
이준형(Foo)
지식공유자

별말씀을요~ 제가 내일까지 외부에 나와있어서 일요일까지는 답변 드리겠습니다!!

공부맛있다님의 프로필 이미지
공부맛있다

작성한 질문수

질문하기