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

#3 in #pliant-db


pliantdb 中使用

MIT/Apache

125KB
3K 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)))
    }
}

在你定义了你的集合(s)之后,你可以打开一个数据库并对其进行查询

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 下使用。

依赖关系

~5.5–8.5MB
~175K SLoC