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日

#5 in #pliant-db


4 crate 中使用

MIT/Apache

84KB
2K 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开发

提交前钩子

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

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

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

开源许可证

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

依赖项

~1–14MB
~194K SLoC