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 핵심 개념
API 개선
주요 구현 사항
|
주요 개선 사항
|
📑 Raft 논문 | 📚 RocksDB 공식 문서 | 🦀 Rust 공식 문서 |