6 个版本 (重大更新)

0.7.1 2023年6月22日
0.6.0 2023年2月26日
0.4.0 2023年1月6日
0.3.0 2022年12月25日
0.1.0 2022年12月6日

#295异步

每月 45 次下载

MIT 许可证

415KB
8K SLoC

lnx 数据蛋糕

Rust 中构建最终一致分布式数据系统的简单工具

"一致性在哪里?" - CF

功能 ✨

  • 简单 配置,一个集群可以用一个特质进行设置并准备好使用。
  • 在修改状态时可以调整一致性级别。
  • 数据中心感知的复制优先级。
  • Storage 特质实现预构建的测试套件,以确保正确功能。

软件包

数据蛋糕提供了一些实用程序库以及一些预制的数据存储处理程序

  • datacake-crdt - 基于混合逻辑时钟(HLC)的 CRDT 实现,以 HLCTimestamp 的形式提供。
  • datacake-node - 基于chitchat构建的集群成员系统和管理RPC。
  • datacake-eventual-consistency - 基于 datacake-crdt,一个用于构建最终一致、复制系统的电池式框架,您只需要实现一个基本的存储特质。
  • datacake-sqlite - 基于SQLite构建的预构建和测试的数据蛋糕 Storage 特质实现。
  • datacake-lmdb - 基于LMDB构建的预构建和测试的数据蛋糕 Storage 特质实现。
  • datacake-rpc - 一个快速、零拷贝的RPC框架,具有熟悉的actor-like 感觉。

示例

查看我们在 示例文件夹 中的预构建应用程序。

您还可以查看一些更重的集成测试 这里

单节点集群

这里是一个在本地网络运行的基本集群示例,它使用几乎所有的包,包括

  • datacake-node 用于核心节点成员资格。
  • datacake-crdt 用于 HLCTimestamp 和 CRDT 实现
  • datacake-eventually-consistency 用于最终一致性的状态复制。
  • datacake-rpc 包括所有集群 RPC 的管理。
use std::net::SocketAddr;
use datacake::node::{Consistency, ConnectionConfig, DCAwareSelector, DatacakeNodeBuilder};
use datacake::eventual_consistency::test_utils::MemStore;
use datacake::eventual_consistency::EventuallyConsistentStoreExtension;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
    let connection_cfg = ConnectionConfig::new(addr, addr, Vec::<String>::new());
    let node = DatacakeNodeBuilder::<DCAwareSelector>::new(1, connection_cfg)
        .connect()
        .await
        .expect("Connect node.");

    let store = node
        .add_extension(EventuallyConsistentStoreExtension::new(MemStore::default()))
        .await
        .expect("Create store.");
    
    let handle = store.handle();

    handle
        .put(
            "my-keyspace",
            1,
            b"Hello, world! From keyspace 1.".to_vec(),
            Consistency::All,
        )
        .await
        .expect("Put doc.");
    
    Ok(())
}

为什么 Datacake 存在?

Datacake 是我尝试将高可用性引入 lnx 的结果,与 Erlang 或 Go 等语言不同,Rust 目前在分布式系统方面有一个相对年轻的生态系统。这使得在没有从头开始实现很多事情以及在开始之前没有对领域进行大量研究的情况下,很难在 Rust 中构建一个复制系统。

目前,Rust 中可用的主要算法是 Raft,这是一种通过共识进行复制的算法,总体上是一个非常好的算法,并且是一个非常容易理解的算法。然而,我目前并不满意当前的实现足够稳定或得到维护以选择它。(对于 lnx 的特定用例,无首领的最终一致性更受欢迎。)

因此,我构建了 Datacake,旨在构建一个可靠、经过良好测试的最终一致系统,类似于 Cassandra 或更具体地说 ScyllaDB 的行为,但在几个核心方面有所不同

  • Datacake 不需要外部源或读取修复来清除墓碑。
  • 底层 CRDT 是 Datacake 的真正动力,它们完全保存在内存中。
  • 分区和分片目前不支持。

值得注意的是,Datacake 本身没有从头开始实现共识和成员算法,而是使用由 Quickwit 开发的 chitchat,这是一个 scuttlebutt 算法的实现。

灵感和参考

贡献

贡献总是受欢迎的,尽管如果你想要扩展或大量修改主集群系统,请为扩展一个想法打开一个问题,因为有些事情并不像看起来那么简单。

我可以贡献些什么?

🧪 测试!🧪 测试!🧪 测试!开个玩笑,测试可能是系统最重要的部分,以任何可能的方式扩展这些测试,无论大小,都是巨大的帮助 :)

未来想法

  • 多 Raft 框架?
  • CASPaxos???
  • 更多存储实现?

依赖关系

~8–24MB
~343K SLoC