0.1.0-dev.4 2021年6月23日

#6#pliant-db

MIT/Apache

5KB
63 代码行数

PliantDb

PliantDb is considered experimental and unsupported crate version Live Build Status HTML Coverage Report for main branch Documentation for main branch

PliantDb 力求成为一个基于 Rust 编写、符合 ACID 的文档数据库,灵感来自 CouchDB。虽然它受到了 CouchDB 的启发,但这个项目不会旨在与现有的 CouchDB 服务器兼容,它将实现自己的复制、集群和分片策略。

项目目标

本项目的高级目标包括

  • ☑️ 能够使用 Rust 类型构建文档数据库的模式。
  • ☑️ 在您的 Rust 二进制文件中运行,简化基本部署。
  • ☑️ 作为仅限本地的基于文件的数据库运行,不涉及网络。
  • ☑️ 作为使用 QUIC 且默认启用 TLS 的网络服务器运行
  • 轻松在多台服务器之间设置读副本。
  • 轻松运行至少 3 台服务器的高可用性基于法定人数的集群
  • ☑️ 提供发布/订阅事件系统
  • 提供作业队列和调度系统 -- 类似于 SidekiqSQS

⚠️ 本项目的状态

您不应尝试在除实验之外的地方使用此软件。 此项目正在积极开发中(GitHub 提交活动),但撰写此 README 文件时,该项目的状态还太早,不能使用。

如果您对此项目感兴趣并希望贡献,请加入我们的 Discord 进行讨论: Discord

示例

请查看 ./pliantdb/examples 以获取示例。为了了解其工作原理,这是一个简单的模式

#[derive(Debug, Serialize, Deserialize)]
struct Shape {
    pub sides: u32,
}

impl Collection for Shape {
    fn collection_name() -> Result<CollectionName, InvalidNameError> {
        CollectionName::new("khonsulabs", "shapes")
    }

    fn define_views(schema: &mut Schematic) -> Result<(), Error> {
        schema.define_view(ShapesByNumberOfSides)
    }
}

#[derive(Debug)]
struct ShapesByNumberOfSides;

impl View for ShapesByNumberOfSides {
    type Collection = Shape;

    type Key = u32;

    type Value = usize;

    fn version(&self) -> u64 {
        1
    }

    fn name(&self) -> Result<Name, InvalidNameError> {
        Name::new("by-number-of-sides")
    }

    fn map(&self, document: &Document<'_>) -> MapResult<Self::Key, Self::Value> {
        let shape = document.contents::<Shape>()?;
        Ok(Some(document.emit_key_and_value(shape.sides, 1)))
    }

    fn reduce(
        &self,
        mappings: &[MappedValue<Self::Key, Self::Value>],
        _rereduce: bool,
    ) -> Result<Self::Value, view::Error> {
        Ok(mappings.iter().map(|m| m.value).sum())
    }
}

在定义了您的集合(s)之后,您可以打开数据库并插入文档

    let db =
        Database::<Shape>::open_local("view-examples.pliantdb", &Configuration::default()).await?;

    // Insert a new document into the Shape collection.
    db.collection::<Shape>().push(&Shape::new(3)).await?;

并使用 Map-Reduce 视图查询数据

let triangles = db
    .view::<ShapesByNumberOfSides>()
    .with_key(3)
    .query()
    .await?;
println!("Number of triangles: {}", triangles.len());

为什么还要编写另一个数据库?

  • 部署高可用性数据库很困难(并且往往很昂贵)。这不必如此。
  • 我们是充满激情的 Rustaceans,并致力于支持一个 100% 基于 Rust 的新软件部署生态系统。
  • 特别是对于创始人 @ecton,这个设计的想法源于他在运营上一个基于 CouchDB 构建的业务时的乐趣项目。从事这个项目实现了他长久以来的愿望。
let triangles = db
    .view::<ShapesByNumberOfSides>()
    .with_key(3)
    .query()
    .await?;
println!("Number of triangles: {}", triangles.len());

功能标志

pliantdb 库默认不启用功能标志。这是因为大多数 Rust 可执行文件只需要功能子集。如果您想启用所有功能,可以使用 full 功能。

[dependencies]
pliantdb = { version = "*", default-features = false, features = "full" }
  • full:启用 local-fullserver-fullclient-full
  • cli:启用 pliantdb 可执行文件。

仅本地数据库

[dependencies]
pliantdb = { version = "*", default-features = false, features = "local-full" }
  • local-full:启用 locallocal-clilocal-keyvaluelocal-pubsub
  • local:启用 local 模块,该模块重新导出库 pliantdb-local
  • local-cli:启用将数据库管理命令嵌入到您自己的命令行界面中的 StructOpt 结构。
  • local-pubsub:为 pliantdb-local 启用 PubSub
  • local-keyvalue:为 pliantdb-local 启用键值存储。

PliantDb 服务器

[dependencies]
pliantdb = { version = "*", default-features = false, features = "server-full" }
  • server-full:启用 serverserver-websocketsserver-keyvalueserver-pubsub
  • server:启用 server 模块,该模块重新导出库 pliantdb-server
  • server-websockets:为 pliantdb-server 启用 WebSocket 支持。
  • server-pubsub:为 pliantdb-server 启用 PubSub
  • server-keyvalue:为 pliantdb-server 启用键值存储。

访问 PliantDb 服务器的客户端

[dependencies]
pliantdb = { version = "*", default-features = false, features = "client-full" }
  • client-full:启用 clientclient-trusted-dnsclient-websocketsclient-keyvalueclient-pubsub
  • client:启用 client 模块,该模块重新导出库 pliantdb-client
  • client-trusted-dns:启用使用 trust-dns 进行 DNS 解析。如果不启用,所有 DNS 解析都将使用操作系统的默认名称解析器。
  • client-websockets:为 pliantdb-client 启用 WebSocket 支持。
  • client-pubsub:为 pliantdb-client 启用 PubSub
  • client-keyvalue:为 pliantdb-client 启用键值存储。

备份

直接访问的数据库导出和恢复

如果您有一个本地的 PliantDb 数据库,您可以使用 local-backup 命令来保存和加载备份

pliantdb local-backup <database-path> save
pliantdb local-backup <destination-database-path> load <backup-path>

如果是从 PliantDb 转移到另一个解决方案或需要执行复杂的灾难恢复工作,则此导出格式易于使用。它在这里进行了描述:

开发 PliantDb

预提交钩子

我们的 CI 流程要求某些命令在无警告或错误的情况下成功执行。为了确保您提交的代码通过基本检查,请安装包含的 pre-commit 钩子。

./git-pre-commit-hook.sh install

完成后,包括 cargo fmtcargo doccargo test 的工具都会在执行 git commit 命令之前进行检查。

开源许可

本项目,如Khonsu Labs的所有项目一样,都是开源的。此仓库可在 MIT 许可证Apache 许可证 2.0 下使用。

依赖项

~1.5MB
~36K SLoC