3个版本

使用旧的Rust 2015

0.1.2 2022年3月11日
0.1.1 2018年9月7日
0.1.0 2018年9月7日

#327解析器实现

Download history 1100/week @ 2024-03-13 903/week @ 2024-03-20 968/week @ 2024-03-27 1144/week @ 2024-04-03 1189/week @ 2024-04-10 1167/week @ 2024-04-17 1027/week @ 2024-04-24 1260/week @ 2024-05-01 1167/week @ 2024-05-08 1010/week @ 2024-05-15 1013/week @ 2024-05-22 1278/week @ 2024-05-29 2024/week @ 2024-06-05 1843/week @ 2024-06-12 1342/week @ 2024-06-19 1856/week @ 2024-06-26

7,260 每月下载量
用于 14 个crate (9 个直接使用)

BSD-2-Clause

8KB
198

GitHub license Crates.io docs

有关版本信息,请参阅变更日志

简介

Sonnerie是一个时间序列数据库。将字符串映射到时间戳和值的列表。在一个数据库中存储多个此类系列。在旋转媒体或固态存储上,几分钟内插入数千万个样本。

Sonnerie针对存储大量值的多系列数据进行了优化(插入数百万个项目需要几分钟,并且不会阻塞其他读取器或写入器),并且可以以10毫秒的精度一次读取一个系列。它也非常擅长转储字典序序列(这意味着:一切)。

Sonnerie可以非常高效地进行随机插入和更新,并且适用于大型数据库。由于紧凑的磁盘格式,稀疏数据(如只有少数时间戳的键)可以非常高效地存储。

Sonnerie主要用于磁盘存档、实时更新和实时访问单个系列。对于分析目的,可以将必要的数据加载到内存中并通过其他方式进行处理。

功能

  • 简单直接的读写协议
  • 易于设置:在命令行中插入数据。
  • 无查询语言
  • 事务性:事务要么完全提交,要么根本不提交。
  • 隔离:事务不会看到其他事务的更新,直到它被提交。注意“最后一条记录获胜”的语义 - 如果两个事务以相同的关键字和时间戳写入两个值,则最后完成的交易的记录将被保留。
  • 持久性:提交的数据可以抵抗意外关闭的损失。
  • 纳秒级分辨率的时间戳(64位),1970-2554
  • 没有奇怪的依赖项,没有虚拟机,一个单独的原生命令行工具二进制文件
  • 浮点数、整数和字符串值,每个样本多列
  • 使用Rayon进行范围并发读取 - 在现代硬件上,每核心每10亿条记录可在30秒内执行“map-reduce”风格查询。

Sonnerie在类Unix系统上运行,并在Linux上进行开发。

快速入门

安装

“Sonnerie”是用Rust语言实现的,Rust是一种运行速度极快的系统编程语言。因此,从源代码安装需要您安装Rust编译器,操作非常简单: curl https://sh.rustup.rs -sSf | sh

然后可以通过Cargo安装Sonnerie: cargo install sonnerie

Sonnerie由一个可执行文件组成,名为sonnerie(位于~/.cargo/bin/sonnerie

创建数据库

通过创建一个目录和一个名为"main"的空文件来创建数据库

mkdir database
touch database/main

插入数据

echo -e "\
fibonacci 2020-01-01T00:00:00 1
fibonacci 2020-01-02T00:00:00 1
fibonacci 2020-01-03T00:00:00 2
fibonacci 2020-01-04T00:00:00 3
fibonacci 2020-01-05T00:00:00 5
fibonacci 2020-01-06T00:00:00 8" \
| sonnerie -d database/ add --format u --timestamp-format=%FT%T

如果"添加"命令成功,则事务将被提交到磁盘。

使用sonnerie add添加的项必须按照它们的键进行字典排序,然后按时间顺序排序。在sonnerie-serve中不存在此要求。

读取数据

sonnerie -d database/ read %

%是一个通配符,就像SQL中的"LIKE"一样,根据键进行过滤。基于前缀的搜索非常高效

sonnerie -d database/ read fib%

Sonnerie输出匹配的值

fibonacci 2020-01-01 00:00:00     1
fibonacci 2020-01-02 00:00:00     1
fibonacci 2020-01-03 00:00:00     2
fibonacci 2020-01-04 00:00:00     3
fibonacci 2020-01-05 00:00:00     5
fibonacci 2020-01-06 00:00:00     8

删除记录

sonnerie -d database/ delete --after-time=2020-01-04

立即删除指定时间及以后的所有值,也提供了--before-time和类似的按键范围过滤功能。

数据立即从数据库中删除。稍后进行压缩将清除它并恢复磁盘空间。

用法

行格式

每个系列都有一个format。格式指定为一组单个字符代码,每个值一个。

字符代码如下

  • f - 32位浮点数(f32)
  • F - 64位浮点数(f64)
  • u - 32位无符号整数(u32)
  • U - 64位无符号整数(u64)
  • i - 32位有符号整数(i32)
  • I - 64位有符号整数(i64)
  • s - UTF-8编码的字符串类型。当输出字符串时,它们以"转义斜杠"形式编码,因此所有空白和反斜杠之前都有一个反斜杠。

在上面的"fibonacci"示例中,我们使用的是"u"格式。

允许多列行;对于表示纬度和经度的两个浮点值

oceanic-airlines 2018-01-01T00:00:00 ff 37.686751 -122.602227
oceanic-airlines 2018-01-01T00:00:01 ff 37.686810 -122.603713
oceanic-airlines 2018-01-01T00:00:02 ff 37.686873 -122.605997
oceanic-airlines 2018-01-01T00:00:03 ff 37.687022 -122.609997
oceanic-airlines 2018-01-01T00:00:04 ff 37.687364 -122.610945
oceanic-airlines 2018-01-01T00:00:05 ff 37.687503 -122.615211

Sonnerie允许异构格式。

单个键可以更改其格式,例如

keyname 2020-01-01T00:00:00 u 42
keyname 2020-01-02T00:00:00 f 3.1415
keyname 2020-01-03T00:00:00 s Now\ a\ string

虽然键可以更改其格式,但它具有更大的存储开销,因此最好不允许键在类型之间振荡。

这在新版本0.6中允许,旧版本有一个"不安全"模式,允许绕过测试以获得性能。

无需服务器

所有操作都可以通过运行sonnerie -/path/to/data/来完成。此外,文件(在移除其".tmp"后缀后)将永远不会改变,尽管文件有时可能被替换。这意味着您可以通过硬链接所有文件来复制数据库(ln)。

数据库必须进行压缩

定期(可能是每天)压缩数据库。这会将多个事务文件滚动成一个大的单一事务文件。这对性能很重要。当大约有100个事务文件时,性能会大幅下降。因此,以防止这种情况的速率压缩数据库。

有两大类压缩方式,分别是主要压缩和次要压缩。主要压缩会替换整个数据库,这需要读取和重写整个数据库。次要压缩会用一个新的事务文件替换所有事务文件。这要快得多,因为它只需要读取和重写事务文件的内容,而不需要重写main文件。

主要压缩是通过以下方式完成的

sonnerie -d /path/to/data/ compact --major

而次要压缩

sonnerie -d /path/to/data/ compact

压缩不会阻塞读取器或写入器,但任何时刻只能发生一次,因此放置了一个锁来防止多个并发压缩。

压缩是原子的,因此您可以在任何时候取消它(使用^C)。

您可以在压缩的同时进行筛选

如果数据库中的一些数据需要修改,您可以使用带有--gegnum选项的compact。Gegnum在冰岛语中意为“通过”。

此命令删除以bad-objects开头的记录

compact --major --gegnum 'grep -v ^bad-objects'

进行常规压缩,但同时也计数记录

compact --major --gegnum 'pv -l'

--gegnum在其命令内部运行/bin/sh,因此管道可以工作。筛选出坏对象并修改其他对象的名称

compact --major --gegnum 'grep -v ^bad-objects | sed "s/^old-name/new-name/"'

--gegnum命令的输出必须是有序的。

您还可以通过将命令管道传输到| tee /dev/stderr来预览其输出。

注意,行以“key\ttimestamp\tformat\tvalue”的格式出现

您也可以通过“读取 | 筛选 | 添加”将数据添加到不同的数据库中,但gegnum允许您修改现有数据库,这对于需要在线维护且同时更新的数据库很有用。

sonnerie-serve

提供了一个服务器,您可以通过HTTP方便地读取和写入数据库。

运行sonnerie-serve -d /path/to/database/ -l 0.0.00:5555然后您可以进行PUTGET请求

  • 读取命名的系列

    curlhttps://127.0.0.1:5555/fibonacci

(响应是整个序列,格式类似于sonnerie read

  • 通过通配符读取系列

    curlhttps://127.0.0.1:5555/fib%

(响应是每个系列,按字母顺序排列,格式类似于sonnerie read

  • 输出可读的时间戳

    curlhttps://127.0.0.1:5555/fib%?human

(时间戳以ISO-8601格式而不是纳秒表示)

  • 添加更多数据

    curl -XPUT https://127.0.0.1:5555/ --data-binary 'fibonacci 1578384000000000000 u 13'

200 OK表示事务已提交)

sonnerie add不同,sonnerie-serve允许无序输入。

请注意,由于sonnerie mmap其文件,sonnerie-serve将显示其虚拟内存使用量巨大(在top中的VIRT),但实际内存利用率将是合理的。

您可以通过命令行继续读取和修改您的sonnerie数据库,甚至可以通过另一个同时运行的sonnerie-serve

另一种方法是使用“sshfs”远程挂载数据库。这种方法性能很高,因为只有压缩数据通过网络,服务器不需要进行任何解压缩。避免使用nfs,因为压缩会导致文件被删除,然后客户端会收到I/O错误,因为NFS无法跟踪服务器上已关闭的文件。

贡献

无论大小,我们都欢迎提交错误报告和pull请求。Sonnerie的开发是以人为本的,我们遵守Rust的行为准则

如果您使用Sonnerie,请提供反馈!

Sonnerie在生产中使用

Sonnerie被Headline使用,数据库大于100GiB,行数超过数十亿。

性能

在大数据库中随机键的平均查找延迟约为15ms(在SSD上),在繁忙的旋转媒体设备上则要慢得多。顺序访问(即按字典顺序读取整个数据库)大约是2k keys/sec和3M records/sec,这非常依赖于数据本身。

版权

Sonnerie是由Charles Samuels在Headline实现的。


lib.rs:

有效地通过空白字符拆分行,同时处理类似于Rust字符串格式的反斜杠转义序列。

例如,如果您有一个类似以下字符串:

  One\ two three\ four

在空白处的天真拆分会产生四个输出

  • One\
  • two
  • three\
  • four

此包将产生两个字符串

  • One two
  • three four

此包还处理如"\n"之类的特殊转义序列,它表示换行。具体来说,转义序列有

  • \a
  • \b
  • \t
  • \n
  • \v
  • \f
  • \r
  • \\

如果找到反斜杠字符,但紧随其后的字符不是特殊字符,则忽略反斜杠,并直接包含后续字符。

无运行时依赖项