1个不稳定版本
使用旧的Rust 2015
0.2.0 | 2017年6月7日 |
---|
#729 in 数据库接口
62KB
1.5K SLoC
泵浦数据库
构建状态(Linux) | |
构建状态(Windows) | |
项目状态 | 可用,处于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