PumpkinDB
PumpkinDB是一个不可改变的有序键值数据库引擎,其特点是:
- ACID 事务
- 永久性存储
- 一种嵌入式编程语言(PumpkinScript)。
- 二进制键和值(允许使用任何编码:JSON、XML、Protobuf、Cap'n Proto等)。
- 独立和嵌入式方案
为什么是不可更改的?
简单地说,被替换的数据就是被删除的数据,因此,是一种不安全的数据管理方式。错误、误解、改变范围和需求等因素都可能影响数据(尤其是过去的数据)的意义和如何使用。
通过保证 key 的值一旦被设置就不可改变,PumpkinDB 迫使用户从时间的角度来考虑他们的数据。
这种方法对于实现事件源和类似类型的架构非常有利。
什么是 PumpkinDB?
PumpkinDB 本质上是一个数据库编程环境,主要是受 MUMPS 背后的核心思想启发。它没有采用 M,而是采用了一种受 Forth 启发的基于堆栈的语言--PumpkinScript。它没有分层键,而是有一个扁平的键名空间,并且一旦设置了值,就不允许覆盖。不变性的核心动机是,随着存储成本的下降,擦除数据实际上是一种战略错误。
虽然它的目的不是为了通用编程,但其主要目的是为了方便构建专门的特定应用和通用数据库,特别是注重不可变性,并尽可能接近存储地处理数据,尽可能少地招致通信惩罚。
应用程序通过网络接口发送小型 PumpkinScript 程序与 PumpkinDB 进行通信(当使用 PumpkinDB 作为嵌入式解决方案时,则通过 API 进行通信)。
PumpkinDB 为并发、存储、日志、索引和其他常见的构建模块提供了大量的基元。
为什么说它是一个数据库引擎?
PumpkinDB 背后的核心思想源于所谓的 懒惰事件来源(lazy event sourcing) 方法,它基于存储和索引事件,同时尽可能地延迟域绑定的时间。也就是说,这个数据库的意图是成为不同类型架构的构件,无论是经典的事件源(将其作为事件存储),还是懒惰的事件源(使用索引)或其他任何方式。也可以在一个数据库中针对不同的部分实现不同的方法。
与其设计自定义的协议与 PumpkinDB 对话,不如将通信协议变成一条通往脚本执行器的管道。这为我们提供了巨大的扩展和灵活性能力。
外部应用可以通过网络连接与 PumpkinDB 对话,而 PumpkinDB 的引擎本身是可嵌入的,可以直接使用。目前,它只适用于 Rust 应用,但有一天可能会扩展到所有能与 C 语言接口的语言。
客户端库
Language | Library | Status |
---|---|---|
Rust | pumpkindb_client | Early release (0.2.0) |
Java | pumpkindb-client | Pre-release |
试试吧
你可以 从 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" (The above example shows how one can query and navigate for values submitted at a different time, using low level primitives).
你可以通过创建 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 项目被分割成几个独立的组件(crate):
- pumpkinscript — PumpkinScript 解析器。允许将 PumpkinScript 文本转换成二进制形式。
- pumpkindb_engine — PumpkinDB 核心库。提供 PumpkinScript 调度器和一个标准的指令库。
- pumpkindb_mio_server — 基于异步 MIO 的 PumpkinDB 服务器库。用于构建自定义的 PumpkinProtocol 兼容的服务器。
- pumpkindb_client — PumpkinProtocol 客户端库。
- pumpkindb_server — Stock PumpkinDB服务器。建立在
pumpkindb_mio_server
之上。 - pumpkindb_term — 基于控制台的 PumpkinDB 服务器客户端。
- doctests — 用于运行指令测试的小工具。
贡献者
这个项目还处于非常早期的阶段,我们将永远欢迎贡献者。
我们的目标是鼓励对项目无阻力的贡献。为了实现这个目标,我们使用了 Unprotocols C4 流程。请阅读它,它会回答很多问题。我们的目标是尽快合并拉取请求,并定期发布新的稳定版本。
简而言之,这意味着
- 我们快速合并拉取请求(尝试!)。
- 我们对不同的想法持开放态度
- 我们更喜欢现在的代码,而不是以后的共识
要了解更多信息,请阅读我们的贡献指南。
我们还保留了一份 问题清单,我们认为这些问题对于新的贡献者来说是很好的开始。
支持者
通过每月捐款支持我们,帮助我们继续开展活动。[成为支持者]
贊助商
成为赞助商,并在 Github 上的 README 上获得你的标志和你的网站链接。[成为赞助商]
(The first version translated by vz on 2020.10.10)