Skip to content

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%