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)์ ๋ํด ๊ธฐ๋กํ๋ ค ํฉ๋๋ค.
๊น๋จน์ง ์๊ธฐ ์ํด ๊ธฐ์ต๋๋ ๋๋ก ์ ์ด๋ดค๋๋ฐ, ํน์ ํ๋ฆฐ ๋ถ๋ถ์ด ์๋ค๋ฉด ๊ผญ ๋ง์ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. :-)