14次发布

0.1.13 2024年7月20日
0.1.12 2024年7月12日
0.1.9 2024年6月23日
0.1.2 2024年5月28日

#432数据库接口

Download history 320/week @ 2024-05-25 587/week @ 2024-06-01 94/week @ 2024-06-08 171/week @ 2024-06-15 187/week @ 2024-06-22 10/week @ 2024-06-29 290/week @ 2024-07-06 60/week @ 2024-07-13 98/week @ 2024-07-20 3/week @ 2024-07-27

102 每月下载量

MIT 协议

245KB
4K SLoC

RLDB Amazon Dynamo论文的Rust实现

Codecov

简介

RLDB(Rusty Learning Dynamo Database)是一个教育项目,它提供了一个Rust实现的Amazon dynamo论文。此项目旨在帮助开发人员和学生学习分布式键值数据存储背后的原理。

特性

特性 描述 状态 资源
内存存储引擎 一个简单的内存存储引擎 $${\textsf{\color{green}已实现}}$$ 《设计数据密集型应用》- 第3章
LSM树 基于LSM树的存储引擎 $${\textsf{\color{yellow}待定}}$$ 《设计数据密集型应用》- 第3章
日志结构哈希表 类似于bitcask存储引擎 $${\textsf{\color{yellow}待定}}$$ Bitcask介绍论文
TCP服务器 为传入请求提供的tokio支持的TCP服务器 $${\textsf{\color{green}已实现}}$$ tokio
PUT/GET/DEL客户端API PUT GET 和 DELETE的TCP API $${\textsf{\color{greenyellow}进行中}}$$ N/A
一致性哈希的分区方案 功能性的一致性哈希实现 $${\textsf{\color{green}已实现}}$$ 《设计数据密集型应用》- 第6章David Karger的一致性哈希
无首领的分区复制 使用无首领复制方法复制分区数据 $${\textsf{\color{green}已实现}}$$ 《设计数据密集型应用》- 第5章
法定多数 基于法定多数的读写,以提供可调的一致性保证 $${\textsf{\color{green}已实现}}$$ 《设计数据密集型应用》- 第5章
节点发现和故障检测 基于Gossip的机制用于发现集群节点和检测故障 $${\textsf{\color{green}已实现}}$$ 动态论文
重新分片/平衡 在集群状态变化后,在节点之间移动数据 $${\textsf{\color{yellow}待定}}$$ 《设计数据密集型应用》- 第6章
数据版本 版本和冲突检测/解决(通过版本向量) $${\textsf{\color{green}已实现}}$$ 向量时钟维基Lamport时钟论文(不容易解析)
通过读取修复进行协调 在缺失副本的情况下,GET可以触发修复 $${\textsf{\color{yellow}待定}}$$ 动态论文
主动反熵 使用默克尔树检测缺失副本并触发协调 $${\textsf{\color{yellow}待定}}$$ 动态论文

运行服务器

  1. 在多个终端中使用配置文件启动节点
cargo run --bin rldb-server -- --config-path conf/node_1.json
cargo run --bin rldb-server -- --config-path conf/node_2.json
cargo run --bin rldb-server -- --config-path conf/node_3.json
  1. 将新节点添加到集群中

在这个示例中,我们假设端口3001上的节点是初始集群节点,并将其他节点添加到它。

cargo run --bin rldb-client join-cluster -p 3002 --known-cluster-node 127.0.0.1:3001
cargo run --bin rldb-client join-cluster -p 3003 --known-cluster-node 127.0.0.1:3001

PUT

cargo run --bin rldb-client put -p 3001 -k foo -v bar

{"message":"Ok"}% 

GET

cargo run --bin rldb-client get -p 3001 -k foo

{"values":[{"value":"bar","crc32c":179770161}],"context":"00000001527bd0d79bdb065196e93b951879b64300000000000000000000000000000001"}

处理冲突

GET请求遇到冲突的示例

cargo run --bin rldb-client get -p 3001 -k foo2

{"values":[{"value":"bar2","crc32c":1093081014},{"value":"bar1","crc32c":1383588930},{"value":"bar3","crc32c":3008140469}],"context":"00000003296f248aff807cf05f4bcd0d05a45cc500000000000000000000000000000001527bd0d79bdb065196e93b951879b64300000000000000000000000000000001e975274170197c04e92166baff4d20c900000000000000000000000000000001"}

响应中的context键允许后续PUT解决给定的冲突。例如

cargo run --bin rldb-client put -p 3002 -k foo2 -v conflicts_resolved -c 00000003296f248aff807cf05f4bcd0d05a45cc500000000000000000000000000000001527bd0d79bdb065196e93b951879b64300000000000000000000000000000001e975274170197c04e92166baff4d20c900000000000000000000000000000001

{"message":"Ok"}% 

cargo run --bin rldb-client get -p 3001 -k foo2 
{"values":[{"value":"conflicts_resolved","crc32c":3289643150}],"context":"00000003296f248aff807cf05f4bcd0d05a45cc500000000000000000000000000000001527bd0d79bdb065196e93b951879b64300000000000000000000000000000002e975274170197c04e92166baff4d20c900000000000000000000000000000001"}%

使用jaeger提取跟踪信息

可以使用集成的jaeger docker镜像本地导出rldb跟踪。达到这一目标的步骤是

  1. 启动jaeger容器
$ ./local_jaeger.sh
  1. 使用jaeger标志启动节点
cargo run --bin rldb-server -- --config-path conf/node_1.json --tracing-jaeger
  1. 在以下地址使用jaeger UI: https://127.0.0.1:16686

文档

请参阅rldb文档

许可

本项目采用MIT许可。有关详细信息,请参阅许可

致谢

本项目受原始Dynamo论文的启发,但也受到许多其他作者和资源的影响,如

以及其他许多。当本项目中的模块基于特定资源时,它们将作为模块文档的一部分包含

依赖项

~17-32MB
~490K SLoC