0.1.0-dev-2 2021年4月14日
0.1.0-dev.4 2021年6月23日
0.1.0-dev.3 2021年4月27日

#4 in #pliant-db


2 个crate中使用

MIT/Apache

230KB
5.5K 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 下提供。

依赖项

~6–15MB
~173K SLoC