1个不稳定版本

使用旧的Rust 2015

0.2.0 2017年6月7日

#729 in 数据库接口

MPL-2.0 许可证

62KB
1.5K 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核心思想的启发。它使用受Forth启发的基于堆栈的语言PumpkinScript,而不是M。它使用平面键命名空间而不是分层键,并且一旦设置值就不允许覆盖。不可变的核心动机是,随着存储成本的下降,删除数据实际上是战略错误。

虽然它不是针对通用编程设计的,但其主要目标是方便构建专用应用程序特定的和通用数据库,特别关注不可变性和尽可能接近存储处理数据,以产生尽可能小的通信惩罚。

应用程序通过在网络接口(或使用泵浦数据库作为嵌入式解决方案时的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上,并获得链接到你的网站。[成为赞助商]

依赖项

~2.5MB
~43K SLoC