1个不稳定版本

使用旧的Rust 2015

0.2.0 2017年6月7日

2476数据库接口

MPL-2.0 许可证

205KB
5K SLoC

PumpkinDB

Gitter chat Code Triagers OpenCollective OpenCollective

构建状态(Linux) Build Status
构建状态(Windows) Windows Build status
项目状态 可用,处于alpha和beta之间
生产就绪 取决于您的风险承受能力

PumpkinDB是一个不可变有序键值数据库引擎,具有以下特点

  • ACID事务
  • 持久存储
  • 嵌入式编程语言(PumpkinScript)
  • 二进制键和值(允许使用任何编码:JSON、XML、Protobuf、Cap'n Proto等)
  • 独立和嵌入式场景

为什么是不可变的?

简单来说,被替换的数据就是被删除的数据,因此,这是一种不安全的数据管理方式。错误、误解、范围和需求的变化以及其他因素可能会影响数据的含义以及如何使用数据。

通过保证键值一旦设置就不可变,PumpkinDB强迫用户从时间角度思考他们的数据。

这种做法对于实现事件源和类似类型的架构非常有用。

什么是PumpkinDB?

PumpkinDB本质上是一个数据库编程环境,主要受到MUMPS核心思想的启发。它没有M,而是有一个受到Forth启发的堆栈式语言,PumpkinScript。它没有分层键,而是有一个扁平的键命名空间,并且一旦设置值就不允许覆盖。不可变的核心动机是随着存储成本的下降,删除数据实际上是一种战略错误。

虽然不是为了通用编程而设计,但其主要目标是方便构建特定应用和通用数据库,特别关注不可变性和尽可能接近存储处理数据,以最小的通信代价。

应用程序通过在网络接口(或使用PumpkinDB作为嵌入式解决方案时的API)上发送小的PumpkinScript程序来与PumpkinDB通信。

PumpkinDB提供了一组广泛的并发、存储、日志记录、索引和其他常见构建块的原始语。

为什么它是一个数据库引擎?

PumpkinDB 的核心理念源自所谓的惰性事件溯源方法,该方法基于存储和索引事件,尽可能推迟领域绑定。换句话说,这个数据库的目的是成为不同类型架构的构建块,无论是经典事件溯源(将其用作事件存储),惰性事件溯源(使用索引)还是其他任何东西。还可以在单个数据库中为领域不同部分实现不同的方法。

与其为与 PumpkinDB 通信设计自定义协议,通信协议已变成一个脚本执行器的管道。这为我们提供了巨大的扩展和灵活性能力。

虽然外部应用程序可以通过网络连接与 PumpkinDB 通信,但 PumpkinDB 的引擎本身是可嵌入的,可以直接使用。目前,它仅适用于 Rust 应用程序,但将来可能会扩展到所有可以与 C 接口的编程语言。

客户端库

语言 状态
Rust pumpkindb_client 早期发布(0.2.0
Java pumpkindb-client 预发布

试用

您可以从 GitHub 下载 PumpkinDB 发布版本

Docker

您可以通过使用 Docker 镜像尝试最新的 PumpkinDB HEAD 修订版

$ docker pull pumpkindb/pumpkindb

或者,您也可以自己构建镜像

$ docker build . -t pumpkindb/pumpkindb

运行服务器

$ docker run -p 9981:9981 -ti pumpkindb/pumpkindb
2017-04-12T02:52:47.440873517+00:00 WARN pumpkindb - No logging configuration specified, switching to console logging
2017-04-12T02:52:47.440983318+00:00 INFO pumpkindb - Starting up
2017-04-12T02:52:47.441122740+00:00 INFO pumpkindb_engine::storage - Available disk space is approx. 56Gb, setting database map size to it
2017-04-12T02:52:47.441460231+00:00 INFO pumpkindb - Starting 4 schedulers
2017-04-12T02:52:47.442375937+00:00 INFO pumpkindb - Listening on 0.0.0.0:9981

最后,使用 pumpkindb-term 连接到它

$ docker run -ti pumpkindb/pumpkindb pumpkindb-term 172.17.0.1:9981 # replace IP with the docker host IP

从源代码构建

您也可以克隆仓库并自行构建。您需要使用 Rust Nightly 来完成此操作。获取它的最简单方法是使用 rustup

$ rustup install nightly
$ rustup override set nightly # in PumpkinDB directory

之后,您可以通过这种方式运行 PumpkinDB 服务器

$ cargo build --all
$ ./target/debug/pumpkindb
2017-04-03T10:43:49.667667-07:00 WARN pumpkindb - No logging configuration specified, switching to console logging
2017-04-03T10:43:49.668660-07:00 INFO pumpkindb - Starting up
2017-04-03T10:43:49.674139-07:00 INFO pumpkindb_engine::storage - Available disk space is approx. 7Gb, setting database map size to it
2017-04-03T10:43:49.675759-07:00 INFO pumpkindb - Starting 8 schedulers
2017-04-03T10:43:49.676113-07:00 INFO pumpkindb - Listening on 0.0.0.0:9981

您可以使用 pumpkindb-term 连接到它

$ ./target/debug/pumpkindb-term
Connected to PumpkinDB at 0.0.0.0:9981
To send an expression, end it with `.`
Type \h for help.
PumpkinDB> ["Name" HLC CONCAT "Jopn Doe" ASSOC COMMIT] WRITE.

PumpkinDB> ["Name" HLC CONCAT "John Doe" ASSOC COMMIT] WRITE.

PumpkinDB> [CURSOR DUP "Name" CURSOR/SEEKLAST DROP CURSOR/VAL] READ (Get last value).
"John Doe"
PumpkinDB> [CURSOR DUP "Name" CURSOR/SEEKLAST DROP DUP CURSOR/PREV DROP CURSOR/VAL] READ (Get previous value).
"Jopn Doe"

(上面的示例展示了如何使用低级原语查询和导航不同时间提交的值)。

您可以通过创建 pumpkindb.toml 来更改服务器的一些参数

[storage]
path = "path/to/db"
# By default, mapsize will equal to the size of
# available space on the disk, except on Windows,
# where default would be 1Gb.
# `mapsize` is a theoretical limit the database can
# grow to. However, on Windows, this also means that
# the database file will take that space.
# This parameter allows to specify the mapsize
# in megabytes.
# mapsize = 2048

[server]
port = 9981

组件

PumpkinDB 项目分为几个独立的组件(crates)

  • pumpkinscript —— PumpkinScript 解析器。允许将文本 PumpkinScript 转换为二进制形式。
  • pumpkindb_engine —— 核心PumpkinDB库。提供PumpkinScript调度程序和指令标准库。
  • pumpkindb_mio_server —— 基于 MIO 的异步 PumpkinDB 服务器库。适用于构建兼容 PumpkinProtocol 的自定义服务器。
  • pumpkindb_client —— PumpkinProtocol 客户端库。
  • pumpkindb_server —— 标准 PumpkinDB 服务器。基于 pumpkindb_mio_server 构建。
  • pumpkindb_term —— 基于控制台的 PumpkinDB 服务器客户端。
  • doctests —— 一个小的实用程序,用于运行指令 doctests。

贡献

该项目处于初期阶段,我们始终欢迎贡献者。

我们的目标是鼓励无摩擦的贡献。为了实现这一目标,我们使用 Unprotocols C4 流程。请阅读它,它将回答许多问题。我们的目标是尽快合并拉取请求并定期发布新的稳定版本。

简而言之,这意味着

  • 我们快速合并拉取请求(try!)
  • 我们欢迎各种想法
  • 我们更喜欢现在有代码而不是以后的共识

了解更多信息,请阅读我们的贡献指南

我们还维护了一份问题列表,我们认为这些问题对于新贡献者来说是良好的起点。

支持者

通过每月捐赠支持我们,帮助我们继续我们的活动。[成为支持者]

赞助商

成为赞助商,让您的logo出现在我们的GitHub README上,并附有链接到您的网站。[成为赞助商]

依赖项

~14MB
~255K SLoC