综合大项目:分布式 KV 存储
学习目标
- 综合运用所有知识
- 设计分布式系统
- 理解一致性与可用性权衡
项目设计
架构
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 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,
}
扩展方向
- 持久化: 添加 WAL (Write-Ahead Log)
- 快照: 定期压缩日志
- 客户端库: 实现连接池和重试
- 监控: 添加 Prometheus 指标
- 测试: 分区测试、混沌测试
小结
| 技能 | 应用 |
|---|
| TCP | tokio 异步网络 |
| 序列化 | serde 自定义协议 |
| 并发 | Arc<RwLock>、tokio |
| 一致性 | Raft 共识算法 |
| 分布式 | 多节点协调 |