Paxos KV
发布于 • 作者: Ethan
个人使用,复习 Distributed System Final Project (Paxos Implementation) 项目结构。


该项目分为三个核心层次:
paxos_impl.go)实现基础的分布式一致性协议 Paxos,用于在多节点间就某个值达成一致。
paxosrsm/server_impl.go)构建在 Paxos 之上的 Replicated State Machine(复制状态机),保证多个节点按相同顺序执行操作。
ShardKV 与 ShardMaster)使用 RSM 保证线性一致的键值存储,并通过 ShardMaster 动态调整分片与组的映射。
paxos_impl.go)slotInfo:每个序列号(seq)的状态,包含:
npnavaftpaxosStatus:存储所有实例及每个节点的 done 状态。
PaxosImpl:封装全部通信用的 channel,用于隔离多线程操作。
通过多个 goroutine 与 channel 实现线程安全:
Prepare、Accept、Inform 请求;实现了标准的 三阶段 Paxos 算法:
Prepare(n);n > n_p,Acceptor 接受请求并返回当前最高的 (n_a, v_a);v'(优先取最大 n_a 对应的 v_a,否则使用自己的 v);Accept(n, v');Decided(v');Decided。Done() 更新本节点完成的最大序列;Min() 返回所有节点最小 done + 1;Min() 的实例会被清除(freeMem)。| 特性 | 说明 |
|---|---|
| 多线程安全 | 通过 channel 和 goroutine 实现 |
| 全异步、非阻塞 Start | 不会阻塞主线程 |
| 状态自动回收 | 避免内存泄漏 |
| 可容忍部分节点失败 | Paxos 天然支持容错 |
paxosrsm/server_impl.go)在 Paxos 上实现一个 复制状态机(RSM),保证多节点按相同顺序执行操作(共识日志)。
opRequest;privateAddOp() 循环调用 Paxos 协议,直到该操作被决定;applyOp() 执行状态更新;slotChan 管理;slot + 1;goroutine + channel 保证。shardkv/server_impl.go)Get、Put、Append、Assign、Pull。channel 维护一致快照(snapshot)。Op → nonBlockingAddOp() → PaxosRSM.AddOp();ApplyOp() 应用到本地快照;Get/Put/Append:
Assign/Pull 用于分片迁移与复制。snapshot,通过 updateSnapshotChan 更新;Get 请求直接读取 snapshot,保证 线性一致性(Linearizability)。shardmaster/server_impl.go)负责全局 分片与组(group)的分配与管理,支持以下操作:
Join:新组加入;Leave:组退出;Move:移动某个 shard;Query:查询当前配置。Op;configs;动态平衡分片分配:
| 特性 | 说明 |
|---|---|
| 一致性 | Paxos 保证强一致性 |
| 容错性 | 节点宕机后自动恢复共识 |
| 可扩展性 | 通过 ShardMaster 支持动态扩展 |
| 并发性 | 全面使用 channel 实现无锁并发 |
| 持久性 | 通过 snapshot 机制维持状态副本 |