데이터베이스

  • 다양한 종류의 데이터베이스를 목적에 맞게 사용하는 것이 중요하다.

RDBMS vs NoSQL

ACID

  • RDBMS 는 기본적으로 관계에 기반한 데이터 베이스이다. ACID 를 지키는 것이 특징이다.
  • 반면에, NoSQL 은 ACID 를 지키지 못한다. 예를 들어, 특정 서버에서 데이터를 write 하고 있는 동안에 다른 서버에서는 read 를 하고 있을 수 있다. 그러면 동시점에서 봤을 때, consistency 가 깨졌기 때문에 ACID 를 보장할 수 없다는 것이다.

Sharding

  • RDBMS 가 샤딩을 지원하는 방법은 partitioning 과 같은 방법을 사용한다. Parititioning 이란, 하나의 데이터베이스에 저장되어야 할 데이터가 매우 크다고 하면, 다른 서버의 데이터베이스로 분산하여 저장하는 것으로 볼 수 있다. 예를 들어, 사용자 수가 1억명이라고 할 때, id 가 1부터 5000만인 사용자들은 A 서버에, 5000만 1부터 1억까지의 사용자들은 B 서버의 데이터베이스에 저장할 수 있다. 이렇게 샤딩을 사용하게 되면 기본적으로 shard key라 하여 조회하고자하는 데이터가 A 서버에 있는지 B 서버에 있는지 알 수 있어야 한다.
  • NoSQL 이 샤딩을 지원하는 방법은 간단하다. 샤드 서버를 추가하는 방법이다. 애초에 NoSQL 은 분산형 데이터베이스를 고려하고 나왔으며, 초기 데이터 자체도 여러 서버의 데이터베이스에 걸쳐서 저장되어 있다. 따라서, 데이터베이스를 scale out 하고 싶으면 샤드를 추가하고, 샤드는 NoSQL 데이터베이스의 관리 정책에 따라서 새로운 데이터를 적재하고, 관리된다.

종류

  • 대표적인 RDBMS 에는 MySQL, Oracle PL/SQL, Postgre, SQLite 등이 있다. 이들의 차이점은 약간의 알고리즘과 쿼리문의 문법에 있을 것 같다.
  • NoSQL 의 종류는 정말 다양하다. Document based 데이터베이스인 MongoDB도 있고, key-value 기반의 데이터베이스인 LevelDB, Cassandra, Redis 등이 있다. 각각은 목적에 따라 다른데, LevelDB 는 SQLite와 같은 embedded database 이다.
  • 참고로 embedded database 는 DB 적인 기능을 하나의 application에서 사용하기 편하도록 만들어 놓은 DBMS 로, SQLite 는 Django 와 같은 웹프레임워크에 기본적으로 들어가있기도 하고, levelDB의 경우 go-ethereum 의 데이터베이스로 사용한다.
  • 또한 Redis 의 경우, 대표적인 '인메모리 데이터베이스' 라고 볼 수 있다. Memcahced 와 같이 인메모리 캐싱을 위해서 사용되는 경우가 많다고 하는데, 데이터를 메모리에 저장하는 것 뿐만 아니라 일정 주기로 데이터를 디스크에 쓰는 작업을 하기도 한다. 그리고 key-value 기반의 데이터베이스로 구성되어 있다.