๐Ÿ’ฟ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค/RocksDB

Facebook์˜ Key-Value DB, "Rocksdb"

์˜ˆ์ง„-D 2021. 9. 4. 10:47

 

RocksDB ๊ณต์‹ Logo

3ํ•™๋…„ ํ•˜๊ณ„๋ฐฉํ•™ ๋•Œ Facebook์—์„œ ๊ฐœ๋ฐœํ•œ Key-Value ์ €์žฅ์†Œ์ธ RocksDB์— ๋Œ€ํ•ด์„œ ๋ถ„์„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ต์ˆ˜๋‹˜๊ณผ ์กฐ๊ต๋‹˜์˜ ์ง€๋„ ํ•˜์— ์—ฌ๋Ÿฌ ํŒ€๋“ค์ด ๊ฐ์ž ๊ด€์‹ฌ ์žˆ๋Š” ์ฃผ์ œ๋กœ ์—ฐ๊ตฌํ•˜๊ณ , ๋งค์ฃผ ์„ธ๋ฏธ๋‚˜์—์„œ ๊ณต์œ ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋Š”๋ฐ ์Šค์Šค๋กœ ๊ณต๋ถ€๋„ ๋งŽ์ด ํ–ˆ๊ณ  ๋‹ค๋ฅธ ํŒ€์˜ ๋ฐœํ‘œ๋„ ๋“ค์„ ์ˆ˜ ์žˆ์–ด ์œ ์ตํ•œ ์‹œ๊ฐ„์ด์—ˆ์Šต๋‹ˆ๋‹ค!

2๋‹ฌ๊ฐ„ ์ง„ํ–‰๋œ ๋ถ„์„ ์Šคํ„ฐ๋””๋ผ ๊นŠ์€ ๋‚ด์šฉ์„ ๋‹ค๋ฃจ์ง„ ๋ชปํ–ˆ๊ณ , ์ด๋ฏธ ์—ฐ๊ตฌํ•œ ๋‚ด์šฉ๋“ค์€ README์— ์ •๋ฆฌํ•ด๋’€์ง€๋งŒ

ํšŒ๊ณ ํ•˜๋Š” ์˜๋ฏธ์—์„œ ์ •๋ฆฌํ•ด๋‘๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜

 

 

 

 

RocksDB

RocksDB๋ž€ Google์˜ LevelDB๋ฅผ ๊ธฐ๋ฐ˜(fork)์œผ๋กœ Facebook์—์„œ ๊ฐœ๋ฐœํ•œ Key-Value store์ด๋ฉฐ, ์„œ๋ฒ„์™€ ๊ฐ™์ด ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•˜๊ณ  SSD์™€ ๊ฐ™์€ ์Šคํ† ๋ฆฌ์ง€์—์„œ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์„ฑ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ์ด๋Œ์–ด ๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

๋˜ํ•œ RocksDB๋Š” ์ตํžˆ ๋“ค์–ด ์•Œ๊ณ  ์žˆ๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(ex. MYSQL)์™€ ๋‹ค๋ฅด๊ฒŒ NoSQL์ž…๋‹ˆ๋‹ค. 

 

NoSQL?

์—ฌ๊ธฐ์„œ NoSQL์ด๋ž€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ˜๋Œ€, ๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

NoSQL์€ SQL๊ณผ ๋‹ฌ๋ฆฌ ์ •ํ•ด์ง„ ์Šคํ‚ค๋งˆ๋‚˜ JOIN, ๊ด€๊ณ„๋ผ๋Š” ๊ฐœ๋…์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”ํ•œ ํ˜•์‹์— ๋งž์ถฐ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•จ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ ์ค‘๋ณต์ด๋ผ๋Š” ๋ฌธ์ œ์ ๋„ ์žˆ๋Š”๋ฐ, ์ด๋Š” ๋‚˜์ค‘์— Database ํฌ์ŠคํŒ…์—์„œ ๋‹ค์‹œ ์ •๋ฆฌํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ SQL์ด๋“  NoSQL์ด๋“  ์ •๋‹ต์€ ์—†๋‹ค๋Š” ์ , RocksDB๋Š” NoSQL์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค.

 

 

 

 

ํ•ต์‹ฌ 3๊ฐ€์ง€

Memtable

Memtable์€ Memory ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋ฉฐ Disk์˜ SST file๋กœ Flush ๋˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์“ฐ๊ธฐ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ๋ฐ˜๋“œ์‹œ Memtable์— ์šฐ์„ ์ ์œผ๋กœ ์“ฐ์ด๋ฉฐ, ์ฝ๊ธฐ ๋˜ํ•œ RocksDB ํŠน์„ฑ์ƒ ๊ฐ€์žฅ ์ตœ์‹ ์˜ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ์ฐพ๊ธฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ Memtable ๋จผ์ € ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ Memtable์ด ๊ฐ€๋“ ์ฐจ๋ฉด ๋ฐ์ดํ„ฐ๋Š” ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅ ์ฝ๊ธฐ ์ „์šฉ Memtable(Immutable Memtable)๋กœ Flush ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ฝ๊ธฐ ์ „์šฉ Memtable๋„ ๊ฐ€๋“ ์ฐจ๋ฉด Disk๋กœ Flush๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

 

SST files

Memtable์ด ๊ฐ€๋“์ฐจ๋ฉด Disk๋กœ flush ๋˜๋Š”๋ฐ, ๊ฐ€์žฅ ๋จผ์ € Level 0์˜ SST file๋กœ ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. SST file์€ Key ์ˆœ์„œ์— ๋”ฐ๋ผ ์ •๋ ฌ์ด ๋˜์–ด ์žˆ๋Š”๋ฐ, Level 0๋Š” ๊ฐ SST file๋งˆ๋‹ค Key ๊ฐ’์ด ๊ฒน์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ ๋‹ค๋ฅธ Level์€ ์ ˆ๋Œ€ ๊ฒน์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Disk์˜ ๋ ˆ๋ฒจ์€ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ๋ฒจ 0์„ ์ œ์™ธํ•œ ๊ฐ ๋ ˆ๋ฒจ์€ ํ•˜๋‚˜์˜ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์˜ ์—ฐ์†์ž…๋‹ˆ๋‹ค. 

๋˜ํ•œ ๊ฐ ๋ ˆ๋ฒจ์˜ ๋‚ด๋ถ€๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ SST ํŒŒ์ผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋Š”๋ฐ, SST ํŒŒ์ผ์€ ๊ฐ๊ฐ์˜ Key range๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ฐพ๊ณ  ์‹ถ์€ Key๊ฐ’์ด ์žˆ๋‹ค๋ฉด Key๊ฐ€ ๋“ค์–ด์žˆ๋Š” SST ํŒŒ์ผ, ํŒŒ์ผ ๋‚ด๋ถ€์˜ Key range์—์„œ ์ด์ง„ ํƒ์ƒ‰(Binary search)์„ ํ•ฉ๋‹ˆ๋‹ค.

 

 

WAL

RocksDB์—์„œ๋Š” WAL(Write Ahead Log) ๋ฐฉ์‹์„ ์ด์šฉํ•˜์—ฌ ๋กœ๊ทธ ํŒŒ์ผ์„ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค. Memtable์˜ ๋‚ด์šฉ์ด Disk๋กœ ์•ˆ์ „ํ•˜๊ฒŒ flush ๋  ๋•Œ๊นŒ์ง€ Memtable์˜ ์ž‘์—…์„ ์˜๊ตฌ์ ์œผ๋กœ Disk์— ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ์น˜๋ช…์ ์ธ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์— ๊ธฐ๋กํ•ด๋’€๋˜ WAL file์„ ์ด์šฉํ•˜์—ฌ Memtable์„ ์žฌ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. WAL์€ ์ผ์ • ๋ถ€๋ถ„ ์„ฑ๋Šฅ์„ ํ•˜๋ฝ์‹œํ‚ค๊ธฐ๋„ ํ•˜์ง€๋งŒ, RocksDB์˜ ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

 

 

 

 

์ด ์™ธ

LSM Tree

RocksDB์—์„œ๋Š” B Tree๊ฐ€ ์•„๋‹Œ LSM Tree๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. LSM๋Š” in-place Update๊ฐ€ ์•„๋‹Œ out-of-place Update๋กœ Update๋ฅผ ํ•  ๋•Œ ์ด์ „ ํ•ญ๋ชฉ์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์œ„์น˜์— Update ํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— Tree์— ์˜ํ•œ ๊ณต๊ฐ„ ์ฆํญ(Space Amplification)์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

LSM ํŠธ๋ฆฌ๋Š” sequential write๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— B ํŠธ๋ฆฌ์— ๋น„ํ•ด ์“ฐ๊ธฐ ์†๋„๊ฐ€ ์ƒ๋‹นํžˆ ๋น ๋ฅด๊ณ , ์“ฐ๊ธฐ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ฝ๊ธฐ ์ธก๋ฉด์—์„  ์„ฑ๋Šฅ์ด ์ข‹์ง€ ๋ชปํ•œ๋ฐ, ์ตœ์•…์˜ ๊ฒฝ์šฐ๋Š” ์—†๋Š” Key๋ฅผ ์กฐํšŒํ•˜๋ ค ํ•  ๊ฒฝ์šฐ๊ฐ€ ๋Œ€ํ‘œ์ ์œผ๋กœ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. 

์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋ธ”๋ฃธ ํ•„ํ„ฐ(Bloom Filter)๋ฅผ ์ ์šฉํ•˜๋Š”๋ฐ, ๋ธ”๋ฃธ ํ•„ํ„ฐ๋Š” ์ฐพ์œผ๋ ค๋Š” Key๊ฐ€ ๋ฐ˜๋“œ์‹œ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ด์ค๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ธ”๋ฃธ ํ•„ํ„ฐ๊ฐ€ Key ๊ฐ’์ด ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ๋Š” ์žˆ์„ ์ˆ˜๋„ ์—†์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋งŒ์•ฝ Key๊ฐ’์ด ์—†๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ์—†์Šต๋‹ˆ๋‹ค.

 

 

Compaction

Compaction์€ ๊ถ๊ทน์ ์œผ๋กœ ํ•ด๋‹น ๋ ˆ๋ฒจ์— ๋“ค์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ ˆ๋ฒจ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ๋„˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ๋ ˆ๋ฒจ์˜ ํฌ๊ธฐ๋Š” ํ•˜์œ„ ๋ ˆ๋ฒจ๋กœ ๊ฐˆ์ˆ˜๋ก ์ฆ๊ฐ€ํ•˜๋Š”๋ฐ, default multiplier๊ฐ’์€ 10์œผ๋กœ Ln ์˜ ํฌ๊ธฐ๋Š” Ln-1 * 10๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ํฌ๊ฒŒ ์ฆ๊ฐ€๋ฉ๋‹ˆ๋‹ค. 

Compaction์ด ๋ฐœ์ƒํ•˜๋Š” ์กฐ๊ฑด์€ L0์˜ ํŒŒ์ผ ์ˆ˜๊ฐ€ ์ผ์ • ์ˆ˜์ค€(Option: level0_file_num_compaction_trigger)์„ ๋„˜์—ˆ์„ ๋•Œ ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ L0์˜ ํŒŒ์ผ์€ L1์— ๋ณ‘ํ•ฉ๋˜๋Š”๋ฐ, L0์˜ ํŒŒ์ผ์€ Key ๊ฐ’์ด ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ๊ธฐ์— ๋ชจ๋“  ํŒŒ์ผ์ด Compaction ๋Œ€์ƒ์œผ๋กœ ์„ ํƒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์ถฉ ๋“ค์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ

๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—์„œ L0์˜ ํŒŒ์ผ์ด level0_file_num_compaction_trigger๋ฅผ ๋„˜์—ˆ๋‹ค๊ณ  ํ•˜๋ฉด, L1๋กœ์˜ Compaction์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. 

L0์˜ ๋ชจ๋“  ํŒŒ์ผ์ด ์„ ํƒ๋˜์–ด L1์˜ ํŒŒ์ผ๊ณผ ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค. 

๋ณ‘ํ•ฉ ์ดํ›„์—๋Š” ์ค‘๋ณต๋˜๋Š” Key๋“ค์ด ์‚ฌ๋ผ์ง€๊ณ  L1์œผ๋กœ ๋‚ด๋ ค์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, L0๊ณผ์˜ ๋ณ‘ํ•ฉ์œผ๋กœ L1์˜ ํŒŒ์ผ ์ˆ˜๊ฐ€ L1์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ๋„˜์œผ๋ฉด ๋˜ ๋‹ค์‹œ Compaction์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ์—์„  ์ค‘๋ณต๋˜๋Š” Key๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— L0์™€ ๊ฐ™์ด ๋ชจ๋“  ํŒŒ์ผ์„ ์„ ํƒํ•˜์ง€ ์•Š๊ณ  ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒŒ์ผ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  L2์—์„œ ์ด ํŒŒ์ผ๊ณผ ์ค‘๋ณต๋˜๋Š” Key range๋ฅผ ๊ฐ–๋Š” ํŒŒ์ผ๋“ค๋งŒ ์„ ํƒํ•ด ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์ดํ›„ ๊ณผ์ •๋„ ์œ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์€ ๊ฐ„๋žตํ•˜๊ฒŒ L3๊นŒ์ง€ ๊ทธ๋ ธ์ง€๋งŒ ์•„๋ž˜์— ๋” ๋งŽ์€ ๋ ˆ๋ฒจ์—์„œ ํ™œ๋ฐœํ•˜๊ฒŒ Compaction์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

 

 

 


๋‹ค์Œ์—” ์ œ๊ฐ€ ์†ํ•œ ํŒ€์ด ์ค‘์ ์ ์œผ๋กœ ๊ณต๋ถ€ํ–ˆ๋˜ 3๊ฐ€์ง€ ์ฆํญ(write,read,space)์— ๋Œ€ํ•ด ๊ธฐ๋กํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.

๊นŒ๋จน์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๊ธฐ์–ต๋‚˜๋Š” ๋Œ€๋กœ ์ ์–ด๋ดค๋Š”๋ฐ, ํ˜น์‹œ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๊ผญ ๋ง์”€ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. :-)