복제란 네트워크로 연결된 여러 장비에 동일한 데이터의 복사본을 유지한다는 의미이다. 이는 다음과 같은 이유에서 필요하다.
이번 장에서는 데이터셋이 아주 작아 각 장비에 전체 데이터 셋의 복사본을 보유할 수 있다고 가정한다. 6장에서 이 가정을 완화해 단일 장비에 넣기는 너무 큰 데이터셋을 대상으로 한 파티셔닝(샤딩)을 살펴본다. 이후 장에서는 복제된 데이터 시스템에서 발생할 수 있는 다양한 종류의 장애와 이에 대한 대처 방법을 설명한다.
노드 간 변경을 복제하기 위한 세가지 인기있는 알고리즘인 단일리더, 다중리더, 리더없는 복제를 살펴보자. 거의 모든 분산 데이터베이스는 이 세가지 방법 중 하나를 사용하고 각 알고리즘은 다양한 장단점이 있다.
복제는 고려해야할 많은 트레이드 오프가 있다. 예를 들면 동기식 복제와 비동기식 복제, 잘못된 복제본을 어떻게 처리할지 등이 있다. 이런 트레이드 오프는 대개 DB의 설정 옵션이다.
DB의 복사본을 저장하는 각 노드를 replica 라고 한다. 다중 복제 서버를 사용하면 모든 복제 서버에 모든 데이터가 있다는 사실을 어떻게 보장할 수 있을까?
DB의 모든 쓰기는 모든 복제 서버에서 처리돼야 한다. 그렇지 않으면 복제 서버는 더이상 동일한 데이터를 유지할 수 없다. 이 문제를 위한 가장 일반적인 해결책은 리더 기반 복제이다.
복제 서버 중 하나를 리더로 지정하고, 클라이언트가 DB에 쓰기를 할 때 요청을 리더한테 보내야한다. 리더는 먼저 로컬 저장소에 데이터를 기록하고 팔로워로 불리는 다른 복제 서버는 리더가 로컬 저장소에 새로운 데이터를 기록하고 데이터 변경을 복제 로그, 변경 스트림의 일부로 팔로워에게 전달한다. 각 팔로워가 리더로부터 로그를 받으면 리더가 처리한 순서와 동일하게 모든 쓰기를 적용해 복사본을 갱신한다. → 읽기는 팔로워를 통해서도 할 수 있다.