NoSQL이 인기가 많은 주된 이유 중 하나는 대규모 클러스터에서 데이터베이스를 실행할 수 있는 능력 때문입니다. 데이터 크기가 증가함에 따라 수직 확장은 점점 더 어려워지고 비용도 늘어나는 반면 수평 확장은 집합과 분산이 자연스러운 단위로 사용할 수 있으므로 잘 맞습니다.
분산 모델에 따라, 더 많은 양의 데이터를 처리할 수 있는 데이터 저장소를 만들 수 도 있고, 많은 읽기 또는 쓰기 트래픽을 처리하도록 할 수 돼있고, 네트워크 속도가 느려지거나 장애가 발생하는 상황에서도 가용성이 높게 유지할 수도 있습니다. 이런 분산 방법에는 크게 두 가지가 있는데, 복제(Replication)와 샤딩(sharding)이 있습니다. 복제는 같은 데이터를 복사해 여러 노드에 분산하는 방법이고, 샤딩은 각 노드마다 다른 데이터를 놓는 방식입니다. 복제와 샤딩은 서로 직교하는 기법으로 둘 중 하나만 사용할 수 도 있고 둘 다 사용할 수도 있습니다.
이제 이런 복제 방식과 샤딩 방식을 자세히 살펴보겠습니다.
🖥 단일 노드
첫 번째로 복제와 샤딩을 하지 않고 단일 노드에서 데이터를 저장하는 방식입니다. 이 방식의 장점은 아무래도 모든 복잡성이 사라지기 때문일 것입니다. 운영자가 관리하기도 쉽고 애플리케이션 개발자가 생각하기도 쉽습니다.
많은 NoSQL 데이터베이스가 클러스터 환경을 고려해 설계되기는 했지만, 애플리케이션 상황에 따라 더 적합하다면 단일 서버에서 사용한다고 해서 문제가 될 것 은 없습니다. 이에 대표되는 것이 바로 그래프 데이터베이스입니다. 그래프 데이터베이스는 단일 서버 환경에서 가장 잘 동작합니다. 데이터 사용이 대부분 집합 구조를 처리하는 것이라면 단일 서버에서 Document Database 또는 key-value Database를 사용하는 것도 충분히 괜찮은 방법입니다.
한마디로 애플리케이션 상황에 따라서 분산하지 않아도 문제를 해결할 수 있다면 단일 노드 방식도 좋은 방법 중 하나 일 것입니다.
🖥 🖥 샤딩 (Sharding)
두 번째로 샤딩입니다. 이 방식은 여러 노드에 데이터를 분산하여 저장하는 방식입니다. 사용자는 단일 노드에서는 한 서버와 통신하면 되므로 서버로부터 빠른 응답을 받을 수 있습니다. 하지만 부하가 늘어남에 따라 이 부하를 나눠 서버가 10대가 있다면 이 부하를 1/10로 처리할 수가 있습니다.
샤딩은 이런 데이터를 여러 노드에 잘 배치해 최적의 데이터 접근성을 제공해야만 합니다. 여기 두 가지 문제가 존재하는데, 하나는 데이터를 어떻게 뭉쳐놓으면 한 사용자가 한 서버로부터 데이터를 대부분 얻게 할 수 있냐는 것이다. 두 번째는 부하를 어떻게 균등하게 분배할 것인가입니다. 과거에는 샤딩을 애플리케이션 로직단에서 처리했습니다. 예를 들어 A, B, C 순으로 어디서부터 어디까지는 어디 노드 이런 방식으로 했습니다. 이런 방식은 프로그래밍 모델이 복잡해졌으며, 다시 균형을 맞춰야 할 경우 애플리케이션 코드 수정과 데이터 전환이 필요합니다. 그래서 많은 NoSQL 데이터베이스가 자동 샤딩을 제공합니다. 즉 데이터를 각 샤드에 할당하고 데이터에 접근할 때 올바르게 샤드에 접근하도록 보장하는 책임을 데이터베이스가 직접 하게 되는 것입니다.
샤딩은 성능 면에서 중요한데, 읽기와 쓰기 성능을 모두 향상할 수 있기 때문입니다. 복제는 읽기 성능은 높일 수 있지만 쓰기는 성능 향상이 거의 없습니다.
하지만 샤 당만 단독으로 하면 복원력은 거의 개선되지 않습니다. 데이터가 다른 노드에 있지만, 노드가 실패하면 해당 노드에 있는 데이터를 사용할 수 없게 되는 것은 단일 서버 구성과 마찬가지이기 때문입니다. 이 처럼 데이터가 누락되는 것은 좋은 일이 아닙니다. 따라서 샤딩만 단독으로 사용하는 것은 복원력이 줄어들게 되는 것입니다.
🖥 🖥 Master-Slave 복제 (Replication)
마스터-스레이브 분산은 여러 노드에 데이터를 복제하는 방식입니다. 마스터 노드는 믿을 만한 출처가 되고 데이터에 대한 업데이트를 처리할 책임을 집니다. 슬레이브 노드는 마스터 노드에서 발생되는 데이터를 저장하게 됩니다.
마스터 -슬레이브 복제는 읽기가 많이 발생하는 데이터 집합을 가진 경우를 확장할 때 도움이 됩니다. 많은 읽기 요청을 슬레이브들에게 처리하게 되면 더 많은 읽기 요청을 처리라 수 있게 수평적으로 확장할 수 있습니다. 그러나 업데이터를 처리하거나 쓰기 많은 경우는 능력에 제한이 생기게 됩니다.
또한 마스터-슬레이브 복제는 읽기 복원력이 있습니다. 마스터가 실패하더라도 슬레이브가 읽기 요청을 처리할 수 있기 때문입니다. 만약 마스터 노드가 다운되면 마스터 노드가 되살아나거나 새로운 마스터가 지정될 때까지 쓰기 능력은 사라지지만 모든 데이터가 복제되어 있어 빠르게 복구할 수 있습니다.
마스터-슬레이브 복제는 확장말고도 백업의 목적을 가지고도 사용될 수 있습니다.
🖥 🖥 Peer to Peer 복제 (Replication)
마스터-슬레이브 복제는 읽기 확장성에 도움이 되지만 쓰기 확장성에는 도움이 되지 않습니다. 또한 슬레이브 실패에 대해서는 복원력을 제공하지만, 마스터 실패에 대해서는 복원력을 제공하지 못합니다 (읽기 복원력은 있습니다). 본질적으로, 마스터는 여전히 병목이고 단일 실패 지점이 되게 됩니다. Peer-to-Peer 복제는 마스터를 두지 않는 구조의 방식입니다.
모든 복제본의 가중치는 똑같으며, 모든 노드에서 쓰기 요청을 처리하고 노드 중 어느 것이 실패하더라도 데이터 저장소에 대한 접근이 중단되지 않습니다.
여기까지만 보면 괜찮아보입니다. 노드가 실패해도 데이터에 계속 접근할 수 있고 쉽게 노드를 추가해 성능을 향상할 수 도 있습니다. 하지만 복잡합니다.
가장 큰 복잡성은 역시 일관성과 관련됩니다. 동일한 레코드를 쓰기를 두 사람이 했을 경우 이는 쓰기 충돌의 위험에 처할 수 있다. 이런 쓰기 비일관성은 문제가 있을 수 있어 쓰기 조율을 위한 네트워크 트래픽 비용은 늘어나지만 마스터와 같은 강력한 보장을 받을 수 있도록 합니다.
이번 포스팅을 통해 NOSQL 에서 사용하는 분산 모델에 대해서 알아보았습니다.
데이터를 분산하는 형식에는 샤딩과 복제 두 가지가 있습니다.
- 샤딩은 여러 서버에 데이터를 나눠 분산한다.
- 복제는 여러 서버에 데이털르 복사하므로, 같은 데이터를 여러 곳에서 찾을 수 있다.
- 마스터-슬레이브 : 마스터는 데이터의 원본 출처가 되어 쓰기를 처리하고 슬레이브는 마스터오 데이터를 동기화하고 읽기를 처리한다. 업데이트 충돌 발생을 줄인다.
- 피어-투-피어 : 모든 노드에 쓰기를 허용한다. 노드는 데이터 복사를 동기화하기 위해 조율한다. 한 노드에 모든 쓰기 부담을 지우지 않도록 해 단일 실패 지점이 생기지 않도록 한다.
두 방식 중 하나만 사용할 수 있으며, 두 가지 모두 사용할 수 있습니다.
[REFERENCE]
해당 글의 모든 레퍼런스는 "NoSQL, 빅데이터 세상으로 떠나는 간결한 안내서" (프라모드 사달게이, 마틴 파울러 지음)을 알립니다.
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."