0.1.0-dev.4 |
|
---|
#6 在 #pliant-db 中
5KB
63 代码行数
PliantDb
PliantDb 力求成为一个基于 Rust 编写、符合 ACID 的文档数据库,灵感来自 CouchDB。虽然它受到了 CouchDB 的启发,但这个项目不会旨在与现有的 CouchDB 服务器兼容,它将实现自己的复制、集群和分片策略。
项目目标
本项目的高级目标包括
- ☑️ 能够使用 Rust 类型构建文档数据库的模式。
- ☑️ 在您的 Rust 二进制文件中运行,简化基本部署。
- ☑️ 作为仅限本地的基于文件的数据库运行,不涉及网络。
- ☑️ 作为使用 QUIC 且默认启用 TLS 的网络服务器运行
- 轻松在多台服务器之间设置读副本。
- 轻松运行至少 3 台服务器的高可用性基于法定人数的集群
- ☑️ 提供发布/订阅事件系统
- 提供作业队列和调度系统 -- 类似于 Sidekiq 或 SQS
⚠️ 本项目的状态
您不应尝试在除实验之外的地方使用此软件。 此项目正在积极开发中(),但撰写此 README 文件时,该项目的状态还太早,不能使用。
如果您对此项目感兴趣并希望贡献,请加入我们的 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-full
、server-full
和client-full
。cli
:启用pliantdb
可执行文件。
仅本地数据库
[dependencies]
pliantdb = { version = "*", default-features = false, features = "local-full" }
local-full
:启用local
、local-cli
、local-keyvalue
和local-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
:启用server
、server-websockets
、server-keyvalue
和server-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
:启用client
、client-trusted-dns
、client-websockets
、client-keyvalue
和client-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 fmt
,cargo doc
和 cargo test
的工具都会在执行 git commit
命令之前进行检查。
开源许可
本项目,如Khonsu Labs的所有项目一样,都是开源的。此仓库可在 MIT 许可证 或 Apache 许可证 2.0 下使用。
依赖项
~1.5MB
~36K SLoC