2 minute read

데이터베이스의 복사본을 저장하는 각 노드를 복제본(replica)이라고 한다.

복제본이 여러 개 있다고 가정하자. 반드시 데이터가 모든 복제본에 저장되도록 하려면 어떻게 해야 할까?

데이터베이스에 대한 모든 쓰기는 모든 복제본에서 처리되어야 한다. 그렇지 않으면 복제본이 더 이상 동일한 데이터를 포함하지 않게 된다. 이를 위한 가장 일반적인 방법은 리더 기반 복제(액티브/패시브 또는 마스터-슬레이브 복제)이다.

리더 기반 복제는 다음과 같이 작동한다:

  1. 복제본 중 하나를 리더(마스터 또는 프라이머리)로 지정한다. 클라이언트가 데이터베이스에 쓰려면 요청을 리더에게 보내야 하며, 리더는 먼저 로컬 스토리지(마스터 자신의 데이터베이스)에 새 데이터를 쓴다.

  2. 다른 복제본을 팔로워(읽기 복제본, 슬레이브, 보조 또는 핫 스탠바이)라고 한다. 리더가 로컬 스토리지에 새 데이터를 쓸 때마다 복제 로그 또는 변경 스트림의 일부로 모든 팔로워에게 데이터 변경 내용도 보낸다. 각 팔로워는 리더에서 로그를 가져와 리더에서 처리된 것과 동일한 순서로 모든 쓰기를 적용하여 로컬 데이터 베이스 사본을 업데이트한다.

  3. 클라이언트가 데이터베이스에서 읽기를 원할 때, 리더 또는 팔로워 중 어느 쪽이든 쿼리할 수 있다. 그러나 쓰기는 리더에서만 허용된다(클라이언트 관점에서 팔로워는 읽기 전용이다).

이 복제 모드는 다음과 같은 많은 관계형 데이터베이스에 내장된 기능이다.

  • PostgreSQL(버전 9.0부터)
  • MySQL
  • Oracle Data Guard
  • SQL Server AlwaysOn 가용성 그룹
  • 일부 비관계형 데이터베이스(예: 몽고DB, 리씽크DB, 에스프레소)

리더 기반 복제는 데이터베이스에만 국한되지 않는다. Kafka 및 RabbitMQ 고가용성 큐와 같은 분산 메시지 브로커에서도 이 기술을 사용한다. 일부 네트워크 파일시스템과 DRBD와 같은 복제된 블록 장치도 유사하다.

동기식 복제 vs 비동기식 복제

리플리케이션 시스템에서 중요한 세부 사항은 복제가 동기식으로 수행되는지 비동기식으로 수행되는지 여부이다. 단, 관계형 데이터베이스에서는 구성 가능한 옵션인 경우가 많지만, 다른 시스템에서는 둘 중 하나로 하드코딩되어 있는 경우가 많다.

예를 들어, 웹사이트 사용자가 프로필 이미지를 업데이트할 때 어떤 일이 발생하는지 떠올려보자.

  • 클라이언트가 리더에게 업데이트 요청을 보내고, 얼마 지나지 않아 리더가 이를 수신한다.
  • 리더는 데이터 변경 사항을 팔로워에게 전달한다. 결국 리더는 업데이트가 성공했음을 클라이언트에 알린다.

일반적으로 복제는 매우 빠르다. 대부분의 데이터베이스 시스템은 1초 이내에 팔로워에게 변경 사항을 적용한다.

하지만 다음과 같은 상황에서 시간이 얼마나 걸릴지는 보장할 수 없다.

  • 팔로워가 장애에서 복구 하는 중일 때
  • 시스템이 최대 용량에 가깝게 작동 중일 때
  • 노드 간에 네트워크 문제가 있는 경우 일 때

동기식 복제의 장점

팔로워가 리더와 일치하는 최신 데이터 사본을 확보할 수 있다. 따라서, 리더가 갑자기 실패하더라도 팔로워에서 데이터를 계속 사용할 수 있다.

동기식 복제의 단점

동기식 팔로워가 충돌하거나 네트워크 오류 또는 기타 이유로 응답하지 않으면 쓰기를 처리할 수 없다는 것이다. 리더는 모든 쓰기를 차단하고 동기식 복제본을 다시 사용할 수 있을 때까지 기다려야 한다.

동기식과 비동기식 복제, 그 두 극단의 절충안

따라서 모든 팔로워가 동기식인 것은 비현실적이다. 한 노드만 중단되면 전체 시스템이 중단될 수 있기 때문이다. 데이터베이스에서 동기식 복제를 활성화하는 경우 일반적으로 팔로워 중 하나는 동기식이고 다른 팔로워는 비동기식으로 구성한다. 동기 팔로워를 사용할 수 없거나 속도가 느려지면 비동기 팔로워 중 하나가 동기화된다. 이렇게 하면 리더 노드와 동기 팔로워 노드 등 최소 두 개의 노드에 최신 데이터 사본이 보장된다. 이 구성을 반동기식이라고도 한다.

완전히 비동기식인 경우도 많다.

한편, 팔로워가 많거나 지리적으로 분산되어 있는 경우 리더 기반 복제는 완전히 비동기식으로 구성된다.

완전 비동기식 복제의 특징은:

  • 리더가 실패하여 복구할 수 없는 경우 팔로워에게 아직 복제되지 않은 모든 쓰기가 손실된다.
  • 클라이언트에 확인된 쓰기라도 내구성이 보장되지 않는다.
  • 완전 비동기 구성은 모든 팔로워가 뒤처지더라도 리더가 쓰기를 계속 처리할 수 있다는 장점이 있다.

TLDR;

  • 반드시 데이터가 모든 복제본에 저장하기 위한 가장 일반적인 방법은 리더 기반 복제이다.
  • 리플리케이션에서 가장 중요하게 선택해야할 트레이드 오프는 비동기식이냐 동기식이냐이다.
  • 팔로워를 동기식과 비동기식으로 혼합하여 복제하는 반동기식 방법도 있다.
  • 지리적으로 팔로워가 분산되어 있거나 팔로워 수가 많을 경우 완전히 비동기식으로 구성되는 것이 일반적이다.