Introduction of RocksDB
- A persistent key-value store for fast storage
- 하드디스크 대부분이 flash store device(flash, RAM)로 구성되어있어서 높은 I/O 성능을 제공한다.
- A log structure database engine, written entirely in C++
- Open-source, based on LevelDB 1.5 (LevelDB란 구글에서 만든 웹 애플리케이션을 위해 만들어진 DB다)
- Focusing on performance and scalability (optimized for server workloads)
Three basic Compornents of RocksDB
Memtable and SST File
memtable과 Disk에 있는 SST File은 서로 다음과 같이 작동한다.
- On-disk SSTable의 인덱스는 항상 메모리에 load 돼있다.
- 모든 Writes는 go directly to the memtable index.
- Reads는 memtable을 먼저 본 후에 SSTable index를 확인한다.
- 주기적으로 memtable은 disk의 SSTable에 flush된다.
- Disk의 SSTable은 주기적으로 합쳐진다. 오래된 data들이 update/delete 돼서 overwrite/remove 된다.
RocksDB Architecture
RocksDB의 구조이다.
- Write Request : write request가 들어오면 Memtable -> Logfile 순서로 데이터가 써진다. memtable이 가득찼거나 모종의 이유로 request가 fail하면, Disk에 있는 SSTable에 flush된다.
- Read Request : 마찬가지로 먼저 Memtable을 본다. 없다면 SSTable에서 read한다.
- Compaction : Update를 위한 작업으로, 이미 존재하는 key-value들이 overlapping되는것을 막아준다. compaction은 background 작업을 통해 이루어지므로, 병렬적으로 처리가 가능하다. 주기적으로 SST file들을 더 큰 SST file로 합치는데, 이 과정에서 같은 key를 가지고있는 data를 하나로 합쳐준다.
B+ Tree
Database indexes를 관리하기 위해서 다양한 tree기반의 자료구조가 사용된다. 대표적인 이진트리 자료구조인 B+ tree를 살펴보자. MySQL/InnoDB이 B+ tree를 사용한다.
- In-place update : B+Tree directly overwrites old records to store new updates.
- read-optimized : 각 record의 최신 버전만 저장되기 때문이다.(record란 데이터베이스에서 하나의 단위로 취급되는 자료의 집합을 말한다.
- 하지만 update가 random I/O를 발생시키기 때문에 write 성능을 희생한다.
B+ Tree는 같은 레벨의 모든 키값들이 정렬되어있고, 같은 레벨의 sibling node는 연결돼있다. 만약 특정 값을 찾아야 하는 상황이 된다면 leaf node에 모든 자료들이 존재하고, 그 자료들이 연결리스트로 연결되어 있으므로 검색속도가 중요한 DB 특성상 B+ Tree를 많이 사용한다.
LSM (Log-Structured Merge) Tree
RocksDB는 key-value 형태로 데이터가 저장돼있다. key-value 형태의 데이터를 저장할 때 좋은 성능을 내는 LSM Tree를 살펴보자.
- Out-of-plcae update
- N-level merge trees
- Disk I/O를 하지 않고 Memory에서만 작동하기때문에 B+Tree보다 빠르다.
- 하나의 Logical tree를 여러개의 physical pieces로 쪼개서, most-recently-updated portion of data를 메모리안에(tree안에) 있도록한다.
- Logfile과 memtable을 사용해서 random write를 sequential write로 변환한다.
Reference