100·实战项目高级

综合大项目:分布式 KV 存储

综合大项目:分布式 KV 存储

学习目标

  1. 综合运用所有知识
  2. 设计分布式系统
  3. 理解一致性与可用性权衡

项目设计

架构

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Client    │────▶│   Server 1  │◀───▶│   Server 2  │
└─────────────┘     └─────────────┘     └─────────────┘
                           ▲                   ▲
                           │        ▲          │
                           ▼        │          ▼
                    ┌─────────────┐ │   ┌─────────────┐
                    │   Server 3  │◀┘───│   Server 4  │
                    └─────────────┘     └─────────────┘

核心模块

kv-store/
├── Cargo.toml
├── src/
│   ├── main.rs          # 入口
│   ├── server.rs        # TCP 服务端
│   ├── client.rs        # 客户端
│   ├── storage.rs       # 存储引擎
│   ├── raft.rs          # Raft 共识
│   └── network.rs       # 网络层

存储引擎

use std::collections::HashMap;
use std::sync::{Arc, RwLock};

#[derive(Clone)]
pub struct KvStore {
    data: Arc<RwLock<HashMap<String, Vec<u8>>>>,
}

impl KvStore {
    pub fn new() -> Self {
        KvStore {
            data: Arc::new(RwLock::new(HashMap::new())),
        }
    }

    pub fn get(&self, key: &str) -> Option<Vec<u8>> {
        self.data.read().unwrap().get(key).cloned()
    }

    pub fn set(&self, key: String, value: Vec<u8>) {
        self.data.write().unwrap().insert(key, value);
    }

    pub fn delete(&self, key: &str) -> bool {
        self.data.write().unwrap().remove(key).is_some()
    }
}

协议设计

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, Debug)]
pub enum Request {
    Get { key: String },
    Set { key: String, value: Vec<u8> },
    Delete { key: String },
}

#[derive(Serialize, Deserialize, Debug)]
pub enum Response {
    Ok(Option<Vec<u8>>),
    Error(String),
}

Raft 共识(简化)

pub enum NodeState {
    Follower,
    Candidate,
    Leader,
}

pub struct RaftNode {
    state: NodeState,
    term: u64,
    voted_for: Option<String>,
    log: Vec<LogEntry>,
}

#[derive(Clone)]
pub struct LogEntry {
    term: u64,
    command: Request,
}

扩展方向

  1. 持久化: 添加 WAL (Write-Ahead Log)
  2. 快照: 定期压缩日志
  3. 客户端库: 实现连接池和重试
  4. 监控: 添加 Prometheus 指标
  5. 测试: 分区测试、混沌测试

小结

技能应用
TCPtokio 异步网络
序列化serde 自定义协议
并发Arc<RwLock>、tokio
一致性Raft 共识算法
分布式多节点协调

练习编辑器

rust
Loading...