단 한 대의 서버에서 실행되는 간단한 시스템을 설계해보자.
사용자 요청의 처리 흐름은 아래와 같다.
사용자가 증가하면 데이터베이스 서버를 분리하여 두어서 각각 독립적으로 확장해 나갈 수 있게 한다.
일반적으로는 관계형 데이터베이스를 사용하지만 아래와 같은 경우에는 NoSQL 데이터베이스를 고려해보아야 한다.
RDB는 데이블마다 스키마가 정의되어 있어 데이터 타입 및 크기 제약을 통해 데이터의 정합성을 보장한다. 또한 중복된 데이터가 없기 때문에 데이터 무결성을 보장하고 변경이 용이하다. 하지만 이러한 관계들로 인해 수평적 확장이 어렵다는 큰 단점이 있다. 이에 반해 NoSQL은 스키마 및 관계(Relation)이 없기 때문에 비정형 데이터를 다루는데 유용하고 일반적으로 검색 속도가 RDB보다 빠르다. 또한 샤딩과 같은 기술을 통해 수평적 확장이 용이하다는 장점이 있다. 하지만 NoSQL은 중복된 데이터들로 인해 Write 작업시 여러 데이터를 수정해야한다는 단점이 있다.
따라서 RDB는 데이터 구조가 명확하고 스키마가 중요한 경우 사용하는 것이 좋고 write 작업이 많을때 사용하는 것이 좋다.
이에 반해 NoSQL은 데이터가 비정형이며 변경/확장 될 가능성이 높은 경우에 사용하면 좋다. 또한 중복된 데이터들의 업데이트 비용이 비싸기 때문에 주로 Read 작업이 많은 경우에 사용한 것이 좋다.
본 포스트는 알렉스 쉬 저자의 가상 면접 사례로 배우는 대규모 시스템 설계 기초를 기반으로 스터디하며 정리한 내용들입니다.