공부한 것 꼭꼭 씹어먹기

데이터 저장의 기본 개념 : 복제와 샤딩 본문

데이터 분석

데이터 저장의 기본 개념 : 복제와 샤딩

젤라솜 2022. 11. 5. 19:46
반응형

 

데이터 복제에는 두 가지 방법이 있습니다.

 

 

데이터 복제 방법 1. 마스터 슬레이브

말그대로 주인과 하인의 관계를 만들어 내는 복제 방법입니다. 우선 데이터가 마스터 서버에 저장이 되고나면 이 데이터들은 슬레이브 서버로 복제됩니다. 읽기 작업은 마스터 서버 뿐 아니라 모든 슬레이브 서버들에서 가능하지만 쓰기 작업은 마스터 서버에서만 가능합니다. 만약 읽기에 대한 request가 증가할 경우 슬레이브 서버를 추가하여 효율적으로 처리할 수 있습니다. 그러나 쓰기 작업의 경우는 마스터 서버에서만 감당하므로, 만약 쓰기에 대한 request가 증가할 경우 성능 저하가 있을 수 있습니다. 따라서 마스터 슬레이브 복제 방법은 쓰기 작업이 많지 않고 읽기 작업이 많은 데이터 세트에 최적화된 방법이라고 할 수 있습니다. 모든 복제가 마찬가지이지만 마스터 슬레이브의 경우, 슬레이브가 마스터의 백업 노드가 될 수 있습니다. 만약 마스터 서버가 고장나면 쓰기 작업에서 에러가 나겠지요. 마스터 서버가 다시 복구되지 않으면 슬레이브 서버 중에서 새로운 마스터 서버가 선택됩니다. 그런데 만약 슬레이브 서버에 마스터 서버의 업데이트된 데이터가 복사되기 전에 슬레이브 서버에서 읽기 작업이 발생되면 어떻게 될까요? 간발의 차로 부정확한 데이터를 읽게 됩니다. 이러한 문제를 방지하기 위해 투표 시스템이라는 것이 있는데요. 대부분의 슬레이브 서버에 같은 버전의 데이터가 업데이트 되어 있으면 읽기 작업의 일관성이 확보된 것으로 간주하여 선언하는 시스템입니다. 모든 슬레이브에서 yes에 투표를 했다면 데이터의 정합성을 신뢰할 수 있게 되는 것이지요. 최근 서로 다른 두 개의 서버에서 보내는 데이터를 주고 받는 시스템을 구축하였는데 각 시스템이 각각 1분, 3분 간격으로 서로의 데이터를 읽는 배치가 돌다보니 간발의 차로 데이터가 꼬이는 경우가 발생하고 있습니다. 이 시스템에 이러한 투표 시스템을 도입하여 100% yes가 아닐 경우 다시 한 번 더 데이터를 읽도록 로직을 수정해야겠습니다.

 

 

 

데이터 복제 방법 2. 피어 투 피어

마스터 슬레이브 복제는 원본과 복사본 간에 계급을 설정하는 방법이었다면, 피어 투 피어는 모든 서버가 같은 레벨에서 작동하는 복제입니다. 쓰기를 마스터만 감당했던 마스터 슬레이브와 달리 피어 투 피어 복제에서는 모든 서버가 읽기와 쓰기 작업을 실행합니다. 어느 한 서버에서 쓰기 작업이 실행되면 모든 서버에 복사가 됩니다. 피어 투 피어 복제는 아무래도 데이터의 일관성이 지켜지기가 쉽지 않습니다. 여러 서버에서 동시 다발적으로 업데이트가 발생하는 경우 주로 발생하는 비일관성의 문제를 어떻게 해결해야 할까요. 이러한 경우에 적용할 수 있는 전략으로 비관적 동시성과 낙관적 동시성이 있는데요. 비관적 동시성은 데이터를 한 번에 한 서버에만 업데이트 할 수 있도록 하는 것입니다. 한 노드에서 업데이트가 발생하는 동안 잠금을 해둠으로써 비일관성을 미리 막는 전략입니다. 물론 잠금이 해제될때까지 데이터 접근이 막히는 점을 고려해야 합니다. 낙관적 동시성은 잠깐의 데이터 불일치가 발생하더라도 결국 모든 업데이트가 끝나고 복제가 끝나고 나면 데이터의 일관성은 맞춰진다는 전략입니다. 이 때 잠금이 발생하지 않기 때문에 데이터 접근은 계속 가능하다는 장점이 있습니다. 이 부분은 마치 마스터 슬레이브 복제에서 투표 시스템을 이용했던 것처럼 피어 투 피어의 모든 서버들의 버전이 동일한지 체크하는 것으로 읽기 작업의 신뢰성을 확보 할 수 있겠지요. 

 

 

 

샤딩과 복제

샤딩과 복제 각각의 장단점을 보완하기 위해 두 가지를 결합하여 사용할 수 있습니다. 샤딩과 마스터 슬레이브 복제를 함께 활용하면 어떨까요. 우선 마스터 서버는 하나의 샤드가 되고 분산된 다른 샤드들은 슬레이브로 쓸 수 있습니다. 마스터 샤드가 있기 때문에 쓰기 작업의 일관성은 확보가 되지요. 하지만 마스터 샤드에 장애가 발생하거나 통신에 문제가 생긴다면 쓰기 작업에 대한 결함 포용성에 영향이 갑니다. 이럴때 샤드의 복제본이 슬레이브 샤드에 저장되어 있기 때문에 결함 포용성을 제공하게 됩니다. 샤딩을 피어 투 피어 방법과 결합하게 되면 기본적인 샤딩처럼 각 샤드들이 모든 피어 서버에 복제가 됩니다. 그리고 전체 데이터의 일정 부분만 담당하게 되지요. 피어 투 피어 복제에서는 마스터 샤드가 따로 없고 모든 피어 샤드에서 쓰기와 읽기가 지원되기 때문에 이에 대한 결함 포용성이 지원됩니다. 즉, 하나의 피어 샤드에서 쓰기 작업이 발생했을 경우 모든 노드 피어에 복제가 되는 것입니다. 

반응형
Comments