https://github.com/openacid/paxoskv
Naive and Basic impl of a kv-storage based on paxos; for https://blog.openacid.com/algo/paxos/
https://github.com/openacid/paxoskv
Last synced: 4 months ago
JSON representation
Naive and Basic impl of a kv-storage based on paxos; for https://blog.openacid.com/algo/paxos/
- Host: GitHub
- URL: https://github.com/openacid/paxoskv
- Owner: openacid
- Created: 2020-10-29T11:26:30.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2023-04-06T17:11:48.000Z (about 3 years ago)
- Last Synced: 2025-06-05T17:46:54.361Z (about 1 year ago)
- Language: Go
- Size: 2.11 MB
- Stars: 240
- Watchers: 7
- Forks: 31
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# paxoskv: a Naive and Basic paxos kv storage

[](https://travis-ci.com/openacid/paxoskv)
这个repo 目前仅是用于学习的实例代码.
这是一个基于paxos, 只有200行代码的kv存储系统的简单实现, 以最简洁的形式展示paxos如何运行, 作为 [可靠分布式系统-paxos的直观解释][] 这篇教程中的示例.
[200行代码实现基于paxos的kv存储][] 是对本代码讲解的教程.
因为有不少网友跟我问起这篇教程中的实现问题, 例如怎么把只能确定一个值的paxos应用到实际场景中.
既然**Talk is cheap**, 那么就**Show me the code**, 把教程中描述的内容直接用代码实现出来, 希望能覆盖到教程中的每个细节. 帮助大家理解paxos的运行机制.
NB-paxoskv 通过classic paxos建立一个简单的kv存储,
这个版本只支持指定key-version的写入和读取:
- 写入操作通过一次2轮的paxos实现.
- 读取操作也通过一次1轮或2轮的paxos实现.
- 虽然每个key支持更新(通过多个ver),
但在这个版本的代码中只能通过指定ver的方式写入,
目前还不支持把对key的更新自动作为下一个ver来写入(不似生产环境kv存储的实现).
- 没有以状态机的方式实现 WAL and compaction的存储, 它直接把paxos instance对应到key的每个版本上.
# 名词
在paxos相关的paper, [可靠分布式系统-paxos的直观解释][],
以及这个repo中代码涉及到的各种名词, 下面列出的都是等价的:
```
rnd == bal == BallotNum ~= Ballot
quorum == majority == 多数派
voted value == accepted value // by an acceptor
```
# Usage
Requirements: `go >= 1.14`.
跑测试: `go test ./...`.
重新build proto文件(如果宁想要修改下玩玩的话): `make gen`.
数据结构使用protobuf 定义; RPC使用grpc实现;
如想了解最新的go grpc的环境部署,请看[go-grpc文档](https://grpc.io/docs/languages/go/quickstart/)
# 目录结构
- `proto/paxoskv.proto`: 定义paxos相关的数据结构.
- `paxoskv/`:
- `impl.go`: 206行代码实现的paxos协议:
- 实现paxos Acceptor的`Prepare()`和`Accept()`这两个request handler;
- 实现Proposer的功能: 执行`Phase1()`和`Phase2()`,
- 以及完整运行一次paxos的`RunPaxos()`方法;
- 实现一个kv纯内存的存储, 每个key有多个version, 每个version对应一个paxos instance;
- 以及启动n个Acceptor的grpc服务函数
- `paxos_slides_case_test.go`: 按照 [可靠分布式系统-paxos的直观解释][] 给出的两个例子([slide-32][]和[slide-33][]), 调用paxos接口来模拟这2个场景中的paxos运行.
- `example_set_get_test.go`: 使用paxos提供的接口实现指定key和ver的写入和读取.
# Question
如果有任何问题, 欢迎提[issue] :DDD.
[issue]: https://github.com/openacid/paxoskv/issues/new/choose
[可靠分布式系统-paxos的直观解释]: https://blog.openacid.com/algo/paxos/
[200行代码实现基于paxos的kv存储]: https://blog.openacid.com/algo/paxoskv/
[slide-32]: https://blog.openacid.com/algo/paxos/#slide-32
[slide-33]: https://blog.openacid.com/algo/paxos/#slide-33