Hello, RocksDB!
ํ์ฌ์์ Confluent๋ฅผ ํตํด Kafka ํด๋ฌ์คํฐ๋ฅผ ์ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ, ์ด ์นดํ์นด์ ๋ํด์ ์ข๋ ์์ธํ ์๊ณ , ์ ๋ฌธ์ฑ์ ๊ฐ์ถ๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์ด์ 2025๋ ๋ชฉํ๋ก Confluent์ Kafka ์๊ฒฉ์ฆ์ธ Confluent Certified Developer for Apache Kafkaยฎ ์๊ฒฉ์ฆ์ ์ค๋นํ๊ณ ์์ต๋๋ค โ๏ธ ์ ์ฒด ํฌ์คํธ๋ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ต๋๋ค.
๋ค์ด๊ฐ๋ฉฐ
K-streams์ Flink ๊ด๋ จ ์๋ฃ๋ฅผ ์ฐพ์๋ณด๋ฉด์, RocksDB๋ฅผ ์ํ์ ์ฅ ๋ฐฑ์๋๋ก ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. RocksDB๋ฅผ ์ ๋๋ก ์ฌ์ฉํด๋ณธ ์ ์ด ์๋ ๊ฒ ๊ฐ์์ ํ๋ฒ ์นํด์ ธ๋ณด๋ ค๊ณ , ๋ก์ปฌ ํ๊ฒฝ์์ ํธ์ฆ์จ์ ์งํํด๋ณด์์ต๋๋ค.
์ฒ์์๋ Python์ผ๋ก ์งํํด๋ณด๋ ค๊ณ ํ๋๋ฐ, Python์ ๊ณต์ pip ํจํค์ง๊ฐ ์๊ณ ์ปค๋ฎค๋ํฐ์ Maintanence๋ ์ด๋ค์ง์ง ์์์ ์ต์ python ๋ฒ์ (3.13)๊ณผ ํธํ๋์ง ์๋ ๊ฒ ๊ฐ๋๋ผ๊ตฌ์ ใ ใ ๊ทธ๋์ Java(JDK 17) ํ๊ฒฝ์์ RocksDB๋ฅผ ์ฒ์ ์์ํด๋ณด์์ต๋๋ค.
RocksDB๋?
์คํธ๋ฆผ ์ดํ๋ฆฌ์ผ์ด์ ์์ ์๋์ฐ์ ๋ํ ์ง๊ณ๋ฅผ ์ํํ ๋, ์ค๊ฐ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ RocksDB์ ์ ์ฅํฉ๋๋ค.
๊ตฌ์ฒด์ ์ผ๋ก๋ ์คํธ๋ฆฌ๋ฐ ์ง๊ณ ์ฐ์ฐ์ ์ํํ ๋, ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ค๊ณ ์๋ค๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ๊ณ๋ฅผ ๋๊ฒ ๋๋ฉด, RocksDB์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ค๊ณ ์๊ณ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์คํธ๋ฆฌ๋ฐ ์ฒ๋ฆฌ๊ฐ OOM์ผ๋ก ์ค๋จ๋์ง ์๋๋ก ์ง์ํ๋ค๊ณ ํฉ๋๋ค.
RocksDB๋ฅผ โ์๋ฒ ๋๋โ Key-Value Store๋ผ๊ณ ํ๋๋ฐ์. ๋น์ทํ ์๋ฒ ๋๋ DB๋ก๋ SQLite(์๋ฒ ๋๋ SQL), derby(Hive Metastore), duckDB ๋ฑ์ด ์์ต๋๋ค. ์ ๋ RocksDB๋ Redis์ ์๋ฒ ๋๋ ๋ฒ์ ์ด๋ผ๊ณ ์ดํด ํ์ต๋๋ค.
RocksDB๋ ์คํธ๋ฆฌ๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์์ค์์ ์ฌ์ฉ ๋ฉ๋๋ค. Kafka ํด๋ฌ์คํฐ ์ชฝ์์๋ ์ ํ ์ฌ์ฉํ์ง ์์ต๋๋ค.
Hello, RocksDB!
์ผ๋จ ๋ฐ๋ก ์ค์ต์ ํด๋ด
์๋ค! gradle init
์ผ๋ก ๋น ํ๋ก์ ํธ๋ฅผ ํ๋ ๋ง๋ค๊ณ , ๊ทธ๊ณณ์ app/build.gradle
์ ์๋์ ๊ฐ์ด RocksDB ์์กด์ฑ์ ์ถ๊ฐํฉ๋๋ค.
dependencies {
...
implementation 'org.rocksdb:rocksdbjni:8.10.0'
...
}
๊ทธ๋ฆฌ๊ณ App.java
๋ฅผ ์๋ ๊ฒ ๊ตฌ์ฑ ํฉ๋๋ค.
package org.example;
import org.rocksdb.*;
public class App {
public static void main(String[] args) throws RocksDBException {
Options options = new Options();
options.setCreateIfMissing(true);
RocksDB db = RocksDB.open(options, "rocksdb");
db.put("hahahaha".getBytes(), "hohohoho".getBytes());
System.out.println(new String(db.get("hahahaha".getBytes())));
db.close();
}
}
๊ทธ๋ฆฌ๊ณ ./gradlew run
์ ์คํํ๋ฉด, RocksDB๊ฐ app/rocksdb/
ํด๋์ ๊ตฌ์ฑ ๋ฉ๋๋ค.
tree .
.
โโโ 000008.sst
โโโ 000009.log
โโโ CURRENT
โโโ IDENTITY
โโโ LOCK
โโโ LOG
โโโ LOG.old.1751384040339784
โโโ MANIFEST-000010
โโโ OPTIONS-000007
โโโ OPTIONS-000012
1 directory, 10 files
์ฃผ๋ชฉํ ๊ฒ์ .sst
ํ์ผ๊ณผ .log
ํ์ผ ์
๋๋ค.
Sorted String Table (SST)
RocksDB๊ฐ ์ค์ Key-Value ์ ์ฅ์๋ก ์ฌ์ฉํ๋ ํ์ผ ์
๋๋ค. ์ด ํ์ผ์ persistentํ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ด ํฉ๋๋ค. RocksDB์ ์ธ๋ฉ๋ชจ๋ฆฌ ํ
์ด๋ธ์ด ๊ฐ๋ ์ฐจ๋ฉด, .sst
๋ก ํ๋ฌ์ฌ ๋๊ณ , ๋์ค์ ์ฌ๋ฌ .sst
ํ์ผ์ด ๋ณํฉ๋๋ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌ ๋ฉ๋๋ค.
.sst
ํ์ผ ๋ด๋ถ๋ Key ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ ๋์ด ์๊ธฐ ๋๋ฌธ์, ๋น ๋ฅธ Range Search๋ฅผ ์ง์ ํฉ๋๋ค.
๋จ, .sst
ํ์ผ์ ๋ถ๋ณ์ ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฒ ๋ง๋ค์ด์ง๋ฉด ์์ ํ์ง ์์ต๋๋ค. .sst
ํ์ผ์ ๋ํ ์์ ์ ๋ณํฉ(compaction) ๋จ๊ณ์์ ์ด๋ค์ง๋๋ค.
Write-Ahead log (WAL, LOG)
๋ฐ์ดํฐ๋ฅผ ์ธ๋ฉ๋ชจ๋ฆฌ ํ ์ด๋ธ์ ๋ฃ๊ธฐ ์ ์ ๋์คํฌ์ ๋จผ์ ๊ธฐ๋กํ๋ ๋ก๊ทธ ํ์ผ ์ ๋๋ค. ํฌ๋์ฌ ์ํฉ์์ ๋ณต๊ตฌ ์ฉ๋๋ก ์ฌ์ฉํฉ๋๋ค.
๋ฐ์ดํฐ๊ฐ .log
ํ์ผ์ ์์ฑ๋ ๋, .sst
ํ์ผ์ ๊ฑด๋๋ฆฌ์ง๋ ์์ต๋๋ค. .sst
๋ ์ธ๋ฉ๋ชจ๋ฆฌ ํ
์ด๋ธ์ ๋ด์์ด ํ๋ฌ์ฌ ๋ ๋๋ง ์ํฅ์ ๋ฐ์ต๋๋ค.
์ผ์ ์๊ฐ์ด ์ง๋๊ฑฐ๋, ์ธ๋ฉ๋ชจ๋ฆฌ ํ
์ด๋ธ์ด ํ๋ฌ์ฌ ๋ ๋ .log
ํ์ผ๋ ๊ฐ์ด ์ ๋ฆฌ ๋ฉ๋๋ค.
๋ ๋์๊ฐ๊ธฐ
RocksDB๋ ๊ทธ์ธ์๋ Transaction์ด๋ TTL ๊ธฐ๋ฅ์ ์ง์ ํ๋ค๊ณ ํฉ๋๋ค!
Kafka ์คํธ๋ฆฌ๋ฐ ์ฑ์ ๊ณต๋ถํ๋ฉด์ RocksDB๋ฅผ ์ฒ์ ์๊ฒ ๋์์ง๋ง, Spark Streaming์์๋ ์ง๊ณ์ ๊ฐ์ Stateful ์ฐ์ฐ์ ์ํํ ๋ RocksDB๋ฅผ ๋ฐฑ์๋๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ํฉ๋๋ค.
์ด์ ์ฒ์ ์ดํด๋ณด๊ฒ ๋ ๋ ์์ด๋ผ ์ค๋ฌด์์ ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ ์ง๋ ๋ ์ดํด๋ด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค ใ ใ ์์ฆ ์ํฉํธ ์๋ Kafka ์คํธ๋ฆฌ๋ฐ ์ฌ๋ ๋ฅผ ์ข ๋ง๋ค์ด๋ณด๊ณ ์ถ๋ค๋ ์๊ฐ์ด ์๋๋ฐ์! ์ ๋ฐฉํฅ์ผ๋ก ์ข๋ ํ๋ณด๊ณ ๊ณ ๋ฏผํด๋ด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค ใ ใ