Skip to content
forked from lablup/raftify

๐ŸŒ 2024 ์˜คํ”ˆ์†Œ์Šค ์ปจํŠธ๋ฆฌ๋ทฐ์…˜ Raftify ํ”„๋กœ์ ํŠธ

License

Notifications You must be signed in to change notification settings

TaskerJang/raftify

ย 
ย 

Repository files navigation

๐Ÿš€ Raftify: Rust ๊ธฐ๋ฐ˜ ๋ถ„์‚ฐ ํ•ฉ์˜ ์‹œ์Šคํ…œ

๐ŸŽฏ ์†Œ๊ฐœ

2024 ์˜คํ”ˆ์†Œ์Šค ์ปจํŠธ๋ฆฌ๋ทฐ์…˜ ์•„์นด๋ฐ๋ฏธ(OSSCA) ํ”„๋กœ์ ํŠธ๋กœ, Raft ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ Rust ๊ตฌํ˜„์ฒด์— RocksDB ์Šคํ† ๋ฆฌ์ง€๋ฅผ ํ†ตํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค.

โฐ ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„

  • ์ „์ฒด: 2024.7.13 - 2024.11.2 (13์ฃผ)
  • Challenges: 2024.7.13 - 2024.8.9
  • Masters: 2024.8.10 - 2024.11.2

๐Ÿ’ป ๊ธฐ์ˆ  ์Šคํƒ

Rust Raftify RocksDB gRPC Actix Protobuf Serde

๐Ÿ”ง ๊ตฌํ˜„ ๋‚ด์šฉ

1. Raft ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„

ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ

  • ๋ฆฌ๋” ์„ ์ถœ: ๋žœ๋คํ™”๋œ ํƒ€์ด๋จธ ๊ธฐ๋ฐ˜ ์„ ์ถœ ์‹œ์Šคํ…œ
  • ๋กœ๊ทธ ๋ณต์ œ: ๋ฆฌ๋” ์ฃผ๋„ ๋กœ๊ทธ ๋™๊ธฐํ™”
  • ์ƒํƒœ ๊ด€๋ฆฌ: Term ๊ธฐ๋ฐ˜ ์ƒํƒœ ์ถ”์ 

์ฃผ์š” ํŠน์ง•

pub trait StableStorage: Storage {
    const STORAGE_TYPE: StorageType;
    fn append(&mut self, entries: &[Entry]) -> Result<()>;
    fn hard_state(&self) -> Result<HardState>;
    // ... ๊ธฐํƒ€ ๋ฉ”์„œ๋“œ
}

2. RocksDB ์Šคํ† ๋ฆฌ์ง€ ๊ตฌํ˜„

ํ•ต์‹ฌ ๊ธฐ๋Šฅ

pub struct RocksDBStorage {
    db: DB,
    logger: Arc<dyn Logger>,
}

impl RocksDBStorage {
    pub fn create(path: &str, logger: Arc<dyn Logger>) -> Result<Self> {
        let mut opts = Options::default();
        opts.create_if_missing(true);
        let db = DB::open(&opts, path)?;
        Ok(RocksDBStorage { db, logger })
    }
}

์ฃผ์š” ์ปดํฌ๋„ŒํŠธ

  1. Write Ahead Logging (WAL)

    • ๋ฐ์ดํ„ฐ ์˜์†์„ฑ ๋ณด์žฅ
    • ์žฅ์•  ๋ณต๊ตฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜
  2. MemTable

    • ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
    • ๋น ๋ฅธ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ง€์›
  3. SST (Sorted String Table) Files

    • ๊ณ„์ธตํ™”๋œ ๋ฐ์ดํ„ฐ ์ €์žฅ
    • ํšจ์œจ์ ์ธ ์••์ถ•
  4. Compaction

    • ์ž๋™ ๋กœ๊ทธ ์••์ถ•
    • ์Šคํ† ๋ฆฌ์ง€ ์ตœ์ ํ™”
  5. Bloom Filter

    • ํšจ์œจ์ ์ธ ํ‚ค ๊ฒ€์ƒ‰
    • ๋ถˆํ•„์š”ํ•œ ๋””์Šคํฌ ์ ‘๊ทผ ๋ฐฉ์ง€

3. HTTP API ๊ฐœ์„ 

#[post("/leave")]  // ์ƒํƒœ ๋ณ€๊ฒฝ ์ž‘์—…์€ POST๋กœ ์ˆ˜์ •
async fn leave(data: web::Data<(HashStore, Raft)>) -> impl Responder {
    let raft = data.clone();
    raft.1.leave().await.unwrap();
    "OK".to_string()
}

#[get("/status")]  // ์ƒํƒœ ์กฐํšŒ๋Š” GET ์œ ์ง€
async fn status(data: web::Data<(HashStore, Raft)>) -> impl Responder {
    // ... ์ƒํƒœ ์กฐํšŒ ๋กœ์ง
}

๐Ÿ“ฆ ์„ค์น˜ ๋ฐ ์‹คํ–‰

์˜์กด์„ฑ ์„ค์ •

[dependencies]
raftify = { version = "0.1.78", features = ["rocksdb_storage"] }
rocksdb = "0.19.0"

์Šคํ† ๋ฆฌ์ง€ ์„ค์ •

[features]
default = ["heed_storage"]
rocksdb_storage = ["rocksdb"]
inmemory_storage = []
heed_storage = ["heed", "heed-traits"]

๐Ÿ— ์•„ํ‚คํ…์ฒ˜

์‹œ์Šคํ…œ ๊ตฌ์กฐ

src/
โ”œโ”€โ”€ storage/
โ”‚   โ”œโ”€โ”€ rocksdb_storage/    # RocksDB ๊ตฌํ˜„
โ”‚   โ”œโ”€โ”€ heed_storage/       # Heed ๊ตฌํ˜„
โ”‚   โ””โ”€โ”€ inmemory_storage/   # ์ธ๋ฉ”๋ชจ๋ฆฌ ๊ตฌํ˜„
โ”œโ”€โ”€ raft/                   # Raft ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”์–ด
โ””โ”€โ”€ api/                    # HTTP API ๋ ˆ์ด์–ด

๐Ÿ“š ๊ธฐ์ˆ  ๋ฌธ์„œ

Raft ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๋ฆฌ์ฆˆ
  1. Raft ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐฐ๊ฒฝ ์ง€์‹๊ณผ ํ•ต์‹ฌ ๊ฐœ๋…
  2. In Search of an Understandable Consensus Algorithm
  3. Raft ์ฝ”๋“œ ๋ถ„์„ 1ํŽธ
  4. Raft ์ฝ”๋“œ ๋ถ„์„ 2ํŽธ
  5. Raft ์ฝ”๋“œ ๋ถ„์„ 3ํŽธ
  6. Raft ์ฝ”๋“œ ๋ถ„์„ 4ํŽธ
RocksDB ํ•™์Šต ์‹œ๋ฆฌ์ฆˆ
  1. RocksDB ์†Œ๊ฐœ
  2. ์Šคํ† ๋ฆฌ์ง€ ๊ตฌํ˜„ 1ํŽธ
  3. ์Šคํ† ๋ฆฌ์ง€ ๊ตฌํ˜„ 2ํŽธ
  4. ์Šคํ† ๋ฆฌ์ง€ ๊ตฌํ˜„ 4ํŽธ
  5. ์Šคํ† ๋ฆฌ์ง€ ๊ตฌํ˜„ 5ํŽธ
RocksDB ํ•ต์‹ฌ ๊ฐœ๋…
  1. Write Ahead Logging
  2. MemTable
  3. SST Files
  4. Compaction
  5. Bloom Filter
  6. Transaction Log
  7. Block Cache
  8. Merge Operators
  9. Iterators
  10. Statistics
  11. Adaptive Mutex
API ๊ฐœ์„ 

๐ŸŽ‰ ํ”„๋กœ์ ํŠธ ์„ฑ๊ณผ

๐Ÿš€ Pull Requests

PR

๐Ÿ“ฆ RocksDB ์Šคํ† ๋ฆฌ์ง€ ๊ตฌํ˜„

RocksDB๋ฅผ Raftify์˜ ๋ฐฑ์—”๋“œ ์Šคํ† ๋ฆฌ์ง€๋กœ ํ†ตํ•ฉํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๊ตฌํ˜„ ์‚ฌํ•ญ

  • โœจ RocksDB ๋ฐฑ์—”๋“œ ํ†ตํ•ฉ
  • ๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • โœ… ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๊ตฌํ˜„

PR

๐Ÿ”„ HTTP API ๊ฐœ์„ 

RESTful ์›์น™์„ ์ค€์ˆ˜ํ•˜์—ฌ API์˜ ์ผ๊ด€์„ฑ๊ณผ ์‚ฌ์šฉ์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๊ฐœ์„  ์‚ฌํ•ญ

  • ๐Ÿ“ RESTful ์›์น™ ์ค€์ˆ˜
  • โšก API ์ผ๊ด€์„ฑ ํ–ฅ์ƒ

๐Ÿ“– ์ „์ฒด ํ™œ๋™ ํ›„๊ธฐ

Velog

13์ฃผ๊ฐ„์˜ ์—ด์ •์ ์ธ ์˜คํ”ˆ์†Œ์Šค ์—ฌ์ •์„ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ์—์„œ ํ™•์ธํ•ด๋ณด์„ธ์š”!

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ

๐Ÿ“‘ Raft ๋…ผ๋ฌธ ๐Ÿ“š RocksDB ๊ณต์‹ ๋ฌธ์„œ ๐Ÿฆ€ Rust ๊ณต์‹ ๋ฌธ์„œ

About

๐ŸŒ 2024 ์˜คํ”ˆ์†Œ์Šค ์ปจํŠธ๋ฆฌ๋ทฐ์…˜ Raftify ํ”„๋กœ์ ํŠธ

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust 87.1%
  • Python 11.3%
  • Other 1.6%