K-Streams์™€ Flink์—์„œ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ Key-value๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์“ฐ๋Š” RocksDB๋ฅผ ์•Œ์•„๋ณด์ž!

4 minute read

ํšŒ์‚ฌ์—์„œ 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 ์ŠคํŠธ๋ฆฌ๋ฐ ์‚ฌ๋ ˆ๋ฅผ ์ข€ ๋งŒ๋“ค์–ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ์žˆ๋Š”๋ฐ์š”! ์š” ๋ฐฉํ–ฅ์œผ๋กœ ์ข€๋” ํŒŒ๋ณด๊ณ  ๊ณ ๋ฏผํ•ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ใ…Žใ…Ž

Categories:

Updated: