2016년 7월 6일 수요일

NoSQL과 Couchbase에 대한 가이드

 안녕하세요? 김성중입니다.

 이전 글에서 보셨듯이 야미야미가 만들 모바일 게임 서버에 Node.js를 사용하기로 하였습니다. 처음 만들어보는 게임이고 사용자가 생각보다 많지 않을 수 있지만, 시스템에 대한 설계는 확실히 해야한다고 생각하였습니다. 프로젝트 초기에 확장성을 염두에 두고 시스템을 설계한다면, 추후 유사한 시스템을 설계할 때 매우 유용할 것입니다.

 모바일 게임 서버의 주 역할은 사용자의 요청에 응답을 해주고, 사용자와 관련된 게임 데이터를 관리하는 것입니다. 하지만 이 때, 요청에 따른 상태를 저장하는 구조는 Scalability를 고려하기 힘들 수 있습니다. 이전의 상태가 저장된 특정 인스턴스로 요청이 계속 전달된다면 단순히 AutoScaling을 하여도 트래픽이 골고루 분산되지 않기 때문입니다. 이러한 문제점이 발생하지 않도록 각 인스턴스는 상태가 없는 구조로 Scalability를 고려하여 설계해야 합니다.

 그래서 이번에는 대용량 입출력하면 빼놓을 수 없는 NoSQL, NoSQL 데이터베이스인 Couchbase 그리고 node.js 서버에 활용하는 방법까지 알아보겠습니다. Couchbase에 대해 알아보기 전에 먼저 NoSQL이 무엇이고, RDB와 무엇이 다른지 알아보겠습니다.


 NoSQL(Not Only SQL)은 관계형 데이터베이스가 맞으면 관계형 데이터베이스를, 그렇지 않으면 무리하게 관계형 데이터베이스에 얽매이지 말고 용도에 맞는 데이터 저장소를 사용하자 는 취지에서 시작한 데이터베이스입니다.


 일반적으로 관계형 데이터베이스는 데이터의 일관성을 보증할 수 있고(트랜잭션), 정규화를 전제로 하고 있기 때문에 갱신 시의 비용이 적게 든다, JOIN이나 복잡한 검색 조건으로 검색이 가능하다 등의 장점을 가지고 있지만, 대량의 데이터 입력 처리나 갱신이 발생한 테이블의 인덱스 생성이나 스키마 변경, 단순히 빨리 결과를 내놓아야 하는 상황에서는 약점을 가지고 있습니다.

 대용량 데이터에 대한 입력 처리

 예를 들어, 대용량 데이터 입력을 처리할 때 입력 성능을 높이는 방법으로 마스터를 1대에서 2대 늘려 서로 데이터 복제를 하는 듀얼마스터 구조를 생각할 수 있습니다. 하지만 같은 데이터를 양쪽 마스터가 동시에 서로 다른 값으로 갱신할 경우 문제가 발생할 수 있고, 이를 방지하기 위해 테이블에 매번 쿼리의 발행 대상을 할당시키는 작업을 해야하는데 만만치 않다는 것입니다. 이 외에도 서로 다른 서버에 DB를 분할하여 설치할 수 있는데, 서로 다른 서버에 설치된 테이블 사이에는 JOIN 연산이 불가능하기 때문에, 이러한 부분 또한 일이 복잡해집니다.

 단순히 빠른 결과를 위한 상황

 요즘 관계형 데이터베이스와는 약간 차이가 있는 이야기이지만(실제로 RDB만으로 구성하여 부하를 충분히 견디는 시스템이 많음), 관계형 데이터베이스는 단순히 결과를 빠르게 보여주는 경우에는 어울리지 않습니다. SQL이라는 것 자체가 가져오는 SQL 해석이나 테이블의 Lock/Unlock 과 같은 오버헤드 때문입니다.

 데이터 분산에 용이

 JOIN을 전제로 하며, JOIN을 하기 위해서는 같은 서버 안에 데이터가 존재해야 한다(DB Link 기능을 이용하면 할 수 있긴 함)는 제약이 있는 관계형 데이터베이스와 달리, NoSQL 데이터베이스는 각 데이터가 독립적으로 설계되어 있어 데이터를 여러 서버에 분산시키는 것이 용이합니다. 데이터를 여러 서버에 분산하는 것을 통해, 각 서버에서 다루는 데이터 양이 줄고 대용량 데이터에 대한 처리도 쉬워집니다.


 Couchbase

 Couchbase는 오픈소스이고, 분산 NoSQL 데이터베이스입니다. key-value 형식으로 데이터를 관리하고, 빠른 쿼리를 위해 미리 지정된 인덱서와 SQL과 같은 쿼리를 수행하기 위한 쿼리 엔진이 있습니다. Couchbase 서버는 low-latency 데이터 관리를 제공하는데 특화되어 있어서 규모가 큰 웹, 모바일 그리고 IoT 애플리케이션에 적합합니다. 따라서, 야미야미의 아키텍쳐에 Performance 뿐만 아니라 확장도 용이하도록 Couchbase를 도입하였습니다. (low-latency: 처리에 소요되는 시간을 줄이는 것)


댓글 없음:

댓글 쓰기