1 个不稳定版本

使用旧的Rust 2015

0.2.0 2017年6月7日

#2449数据库接口

22 每月下载量
用于 pumpkindb_mio_server

MPL-2.0 许可证

240KB
6K SLoC

泵浦数据库

Gitter chat Code Triagers OpenCollective OpenCollective

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

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

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

为什么是不可变的?

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

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

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

什么是泵浦数据库?

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

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

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

泵浦数据库提供了一系列用于并发、存储、日志记录、索引和其他常见构建块的原语。

为什么它是数据库引擎?

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 — 基于 console 的 PumpkinDB 服务器客户端。
  • doctests — 一个小的实用程序,用于运行指令 doctests。

贡献

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

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

简而言之,这意味着

  • 我们快速合并拉取请求(try!)
  • 我们欢迎各种想法
  • 我们更喜欢先有代码,然后再有共识

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

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

赞助者

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

赞助商

成为赞助商,让您的标志出现在我们的Github README上,并提供链接到您的网站。[成为赞助商]

依赖关系

~13MB
~241K SLoC