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
- ๋ฆฌ๋ ์ ์ถ: ๋๋คํ๋ ํ์ด๋จธ ๊ธฐ๋ฐ ์ ์ถ ์์คํ
- ๋ก๊ทธ ๋ณต์ : ๋ฆฌ๋ ์ฃผ๋ ๋ก๊ทธ ๋๊ธฐํ
- ์ํ ๊ด๋ฆฌ: Term ๊ธฐ๋ฐ ์ํ ์ถ์
pub trait StableStorage: Storage {
const STORAGE_TYPE: StorageType;
fn append(&mut self, entries: &[Entry]) -> Result<()>;
fn hard_state(&self) -> Result<HardState>;
// ... ๊ธฐํ ๋ฉ์๋
}
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 })
}
}
-
Write Ahead Logging (WAL)
- ๋ฐ์ดํฐ ์์์ฑ ๋ณด์ฅ
- ์ฅ์ ๋ณต๊ตฌ ๋ฉ์ปค๋์ฆ
-
MemTable
- ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- ๋น ๋ฅธ ์ฝ๊ธฐ/์ฐ๊ธฐ ์ง์
-
SST (Sorted String Table) Files
- ๊ณ์ธตํ๋ ๋ฐ์ดํฐ ์ ์ฅ
- ํจ์จ์ ์ธ ์์ถ
-
Compaction
- ์๋ ๋ก๊ทธ ์์ถ
- ์คํ ๋ฆฌ์ง ์ต์ ํ
-
Bloom Filter
- ํจ์จ์ ์ธ ํค ๊ฒ์
- ๋ถํ์ํ ๋์คํฌ ์ ๊ทผ ๋ฐฉ์ง
#[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 ์๊ณ ๋ฆฌ์ฆ ์๋ฆฌ์ฆ
RocksDB ํ์ต ์๋ฆฌ์ฆ
RocksDB ํต์ฌ ๊ฐ๋
์ฃผ์ ๊ตฌํ ์ฌํญ
|
์ฃผ์ ๊ฐ์ ์ฌํญ
|
๐ Raft ๋ ผ๋ฌธ | ๐ RocksDB ๊ณต์ ๋ฌธ์ | ๐ฆ Rust ๊ณต์ ๋ฌธ์ |