0.1.0-dev-2 2021年4月14日
0.1.0-dev-1 2021年3月31日
0.1.0-dev-0 2021年3月28日
0.1.0-dev.4 2021年6月23日
0.1.0-dev.3 2021年4月27日

#1#pliant-db


3 个 crate (2 个直接) 使用

MIT/Apache

175KB
4K SLoC

PliantDB

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

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

项目目标

本项目的高级目标是

  • ☑️ 能够使用 Rust 类型定义文档数据库的模式。
  • ☑️ 在你的 Rust 二进制文件中运行,简化基本部署。
  • ☑️ 以本地仅文件数据库的形式运行,不涉及任何网络。
  • ☑️🚧 以多数据库、网络服务器模式运行,默认启用 TLS
  • 轻松设置多个服务器之间的读取副本。
  • 轻松运行至少 3 个服务器的高可用性基于投票的集群
  • 公开发布/订阅事件系统
  • 公开作业队列和调度系统——类似于 SidekiqSQS

⚠️ 本项目的状态

你不应该在除实验之外的情况下尝试使用此软件。 该项目正在积极开发中(GitHub 提交活动),但截至编写此 README 时,该项目还处于早期阶段,不适合使用。

如果你对讨论此项目或可能想要贡献感兴趣,请在 Discord 上与我们聊天:Discord

示例

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

// From pliantdb/examples/view-examples.rs
#[derive(Debug, Serialize, Deserialize)]
struct Shape {
    pub sides: u32,
}

impl Collection for Shape {
    fn id() -> collection::Id {
        collection::Id::from("shapes")
    }

    fn define_views(schema: &mut Schema) {
        schema.define_view(ShapesByNumberOfSides);
    }
}

#[derive(Debug)]
struct ShapesByNumberOfSides;

impl View for ShapesByNumberOfSides {
    type Collection = Shape;

    type Key = u32;

    type Value = ();

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

    fn name(&self) -> Cow<'static, str> {
        Cow::from("by-sides")
    }

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

在定义了您的集合之后,您可以打开数据库并对其进行查询

let db =
    Storage::<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?;

// Query the Number of Sides View to see how many documents have 3 sides.
println!(
    "Number of triangles: {}",
    db.view::<ShapesByNumberOfSides>()
        .with_key(3)
        .query()
        .await?
        .len()
);

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

  • 部署高可用数据库很困难(而且通常很昂贵)。这不需要。
  • 我们是一群充满激情的 Rustaceans,正在努力实现支持全新软件 100% 基于 Rust 的部署生态系统的理想。
  • 特别是对于创始人 @ecton,这个设计的想法可以追溯到他在经营基于CouchDB的上一家公司的业余项目时的想法。从事这个项目满足了他长期以来的愿望。

备份

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

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

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

如果是从PliantDB迁移到其他解决方案或需要执行复杂的灾难恢复工作,这个导出格式应该很容易处理。它在这里进行了描述

开发PliantDB

预提交钩子

我们的持续集成过程要求某些命令在没有任何警告或错误的情况下成功。为了确保您提交的代码可以通过基本检查,请安装包含的 pre-commit 钩子

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

完成后,包括 cargo fmtcargo doccargo testgit commit 执行之前都将进行检查。

开源许可证

这个项目,就像 Khonsu Labs 的所有项目一样,都是开源的。这个存储库可以在 MIT 许可证Apache 许可证 2.0 下使用。

依赖项

~7–14MB
~163K SLoC