Big Data/Designing Data-Intensive Applicatiosn

05. 복제(Replication) - 2

Data Engineer 2019. 12. 20. 22:19

동기식 복제와 비동기식 복제

이전 포스트에 이어서 복제에 관해 살펴보겠습니다. 복제는 동기 또는 비동기적으로 이루어집니다. 동기식 복제는 리더가 해당 팔로워가 쓰기를 수신했는지 확인해줄 때까지 기다리는 방식입니다. 아래의 그림에서는 Follwer1의 복제는 동기식으로 동작합니다.

 

 

동기식 복제의 장점은 팔로워가 리더와 일관성 있게 최신 데이터 복사본을 갖는 것을 보장합니다. 동기식의 경우 리더가 동작하지 않아도 데이터는 팔로워에서 계속 사용할 수 있습니다. 그러나 동기적으로 동작하는 팔로워가 응답하지 않는다면 쓰기는 처리될 수 없는 단점이 존재합니다. 즉, 리더는 해당 팔로워가 다시 동작할 때까지 기다려야 하는 문제가 발생합니다. 그렇기 때문에 모든 팔로워가 동기식으로 복제하는 방법은 사용되지 않습니다. 현실적으로 데이터베이스에서 동기식 복제를 사용하려면 팔로워 하나는 동기식 다른 팔로워는 비동기식 복제를 하도록 사용합니다.

보통 리더 기반 복제의 경우 완전히 비동기식으로 구성합니다. 리더가 잘못돼서 복구할 수 없는 경우 데이터가 유실될 수 있습니다. 하지만 모든 팔로워가 잘못되더라도 리더는 쓰기 처리를 계속할 수 있습니다.

리더 기반 복제의 고가용성

팔로워 장애

각 팔로워는 리더로부터 수신한 데이터 변경 로그를 로컬 디스크에 보관합니다. 팔로워에 문제가 발생하는 경우 문제 발생 전에 처리한 마지막 트랜잭션을 알아낸 후 이후에 발생한 데이터 변경을 리더에게 요청해서 복구합니다.

 

리더 장애

리더가 장애가 나면 팔로워 중 하나를 새로운 리더로 승격시키고 클라이언트는 승격된 리더로 쓰도록 재설정을 해야 합니다. 그리고 다른 팔로워들이 새로운 리더로부터 데이터 복제를 하도록 합니다. 

복제 지연 문제

리더 기반 복제는 모든 쓰기가 단일 노드를 거쳐야 하지만 읽기 전용 질의는 어떤 복제 서버에서도 가능합니다. 애플리케이션에서 비동기 팔로워에 데이터를 읽을 때 복제가 지연되어 이전 정보를 읽을 수도 있습니다. 이러한 복제 지연이 있을 때 발생할 수 있는 문제에 대해 살펴보도록 하겠습니다.

 

자신이 쓴 내용 읽기

사용자가 쓰기를 수행한 직후 데이터를 보는 경우 아직 복제 서버에는 반영이 안될 수도 있습니다. 물론 최종적으로는 반영될 것이지만 (이를 eventual consistency라고 합니다) 데이터 변경 직후에는 사용자가 보기엔 데이터가 유실된 것처럼 보이기 때문에 문제가 있습니다. 이러한 문제를 방지하기 위해 read-after-write 일관성이 필요합니다. 이 일관성은 자신이 제출한 모든 갱신은 보장하지만 다른 사용자에 대해서는 보장하지 않는 방식입니다. 이러한 방식은 사용자 자신의 입력이 올바르게 저장됐음을 보장할 수 있습니다. 그럼 이러한 방식은 어떻게 구현할까요?

 

  • 소셜 네트워크에서 사용자 프로필 정보는 리더에서 읽고 다른 사용자 프로필은 팔로워에서 읽도록 하는 방법
  • 마지막 갱신 시각을 찾아서 1분 내에 있는 갱신은 리더에서 읽고 복제 지연이 1분이 넘는 경우 팔로워에 질의를 금지하도록 하는 방법
  • 클라이언트의 타임스탬프를 통해 복제 서버가 타임스탬프까지 따라잡을 때 까지 질의를 대기

단조(Monotonic) 읽기

단조 읽기는 각 사용자의 읽기는 동일한 복제 서버에서 읽도록 하는 방법입니다. 사용자 ID를 해시 기반으로 복제 서버를 선택하여 읽도록 하는 방식입니다. 이 방식은 최종적 일관성(eventual consistency)보다는 더 강한 보장 방식입니다.

 

애플리케이션 개발자가 이러한 미묘한 복제 문제를 걱정하지 않고 항상 데이터베이스를 신뢰할 수 있다면 훨씬 좋을 것입니다. 그것이 트랜잭션이 있는 이유입니다. 오랫동안 단일 노드 트랜잭션은 존재했습니다. 그러나 분산 데이터베이스로 전환하는 과정에서 많은 시스템들이 트랜잭션을 포기했습니다. 트랜잭션이 성능과 가용성 측면에서 너무 비싸고 확장 가능한 시스템에서는 어쩔 수 없는 부분이 있을 수도 있겠죠. 그렇기 때문에 이와 같은 문제점들을 인지하고 어떻게 해결할 것인지 애플리케이션 개발자가 고민해야 합니다.

 

이번 포스트는 복제가 이루어지는 방식에 대해 알아보았습니다. 복제가 동기인지 비동기인지에 따라 장애가 발생하는 경우 시스템 작동에 중요한 영향을 끼칩니다. 또한 복제 지연으로 인해 발생할 수 있는 문제점을 살펴보았습니다. 그리고 애플리케이션이 복제 지연 시 어떻게 동작해야 하는지 결정하는데 도움이 되는 일관성 모델에 대해 알아보았고 이러한 일관성 모델을 잘 이해해서 애플리케이션이 잘 동작하도록 해야 할 것입니다.