Skip to content

主要特性

数据类型

Lightning System 数据库中数据类型支持:

  • 常见数据类型

    bool、int8、int16、int32、int64、float、double、stirng、binary、datatime

  • 高级数据类型支持

  • Fix Array: : bool/int8/int16/int32/int64/float32/float64/datatime Array 的优化存储结构。

  • Var Array: String Array, Binary Array。

数据类型

#类型Bytes说明取值范围
1VtBool/bool/boolean1布尔型
2VtInt8/tinyint11 字节整型[-128, 127]
3VtInt16/smallint22 字节整型[-2^15, 2^15-1]
4VtInt32/int/integer44 字节整型[-2^31, 2^31-1]
5VtInt64/bigint88 字节整型[-2^63, 2^63-1]
6VtFloat32/float4单精度浮点数[-3.40282e+38, 3.40282e+38], 有效数字位 7 位
7VtFloat64/double8双精度浮点数[-1.79769e+308, 1.79769e+308],有效数字位 16 位
8VtDateTime/DateTime8时间,支持纳秒[1970-01-01T00:00:00Z, 2262-04-11T23:47:16854775807Z]
9VtString/char/varcharn字符串
10VtBinary/binaryn字节串
11VtBoolArray/BoolArrayn布尔数组
12VtInt8Array/Int8Arrayn1 字节整型数组
13VtInt16Array/Int16Arrayn2 字节整型数组
14VtInt32Array/Int32Arrayn4 字节整型数组
15VtInt64Array/Int64Arrayn8 字节整型数组
16VtFloat32Array/Float32Array/FloatArrayn单精度浮点数数组
17VtFloat64Array/Float64Array/DoubleArrayn双精度浮点数数组
18VtDateTimeArray/DateTimeArrayn时间数组
19VtStringArray/StringArrayn字符串数组
20VtBinaryArray/BinaryArrayn字节串数组

数据描述模型

系统使用 T L V(Type + Len + Value)的模型进行数据结构定义。在保证模型的高空间利用率,低资源占用和高读写性能的同时,提供自解释能力和扩展性。

通过统一的抽象定义(任何数据内容都带有数据类型、长度、数据内容),TLV 形式可以较好的描述二进制数据,数据内容的解释可采用统一标准进行实现。由于数据内容中包含了数据的完整信息,数据在各操作系统、各语言环境下都可以完成对应的语言环境和平台环境的代码实现,满足异构环境的适配。

TLV 结构模型为 Tag (1 Byte) + Length ( Tag + Value) + Value (Binary)

tlv.png
高级类型

tlv2.png

版本演进模型

系统数据存储结构中,对其存储的数据内容均定义了数据版本(见数据存储模型 VV)。数据版本字段使用 int32,最大支持变更 21474883647 次。数据库表结构中,所有字段都包含字段索引,索引只进不退,版本演进过程均完整记录。演进示意图如下

versioning.png

系统提供了版本适配器进行数据结构的应用转换。当前查询、写入动作均以最新版本为基础验证和填充结构即 V4。缺失字段填充规则一律采用默认值填充方式,无默认值情况设置为 Null。
V1-V4 结构转换示意:剔除 index 3,填充缺失字段 index4、index5。
V2-V4 结构转换示意:剔除 index 3,填充缺失字段 index5。
V3-V4 结构转换示意:剔除 index 3,填充缺失字段 index5。

数据版本管理器将各分支版本的数据结构转换,统一格式为最新版本进行计算和对外数据使用。
若使用字段要复用之前被删除字段,则需要调用特殊API重建字段 (API 待开放)

事务模型

在数据库系统中,事务是不可或缺的一部分。摒弃了传统数据库写入低效的 Binlog 和 Redolog 和 NoSQL 数据库系统的异步的 Sync 方式(失电丢数)。Lightning 采用数据追加机制,在任意任务执行前进行影响预评估,建立 undolog,通过 log 清单 + 异常崩溃修复机制 + 多阶段提交方式,来确保数据可靠落盘入库。做到既保障安全的同时,同时实现快速写入。

transaction.png

SQL 标准

系统以 SQL92 标准为基础,提供经过特定优化的查询子集,完成业务场景构建。秉承与传统数据库(参考 MYSQL)使用方式完全一致概念,建立了流式数据查询模型,其数据操作标准如下:

时间规范

  • "2006-01-02", // RFC 3339
  • "2006-01-02 15:04", // RFC 3339 with minutes
  • "2006-01-02 15:04:05", // RFC 3339 with seconds
  • "2006-01-02 15:04:05-07:00", // RFC 3339 with seconds and timezone
  • "2006-01-02T15Z0700", // ISO8601 with hour
  • "2006-01-02T15:04Z0700", // ISO8601 with minutes
  • "2006-01-02T15:04:05Z0700", // ISO8601 with seconds
  • "2006-01-02T15:04:05.999999999Z0700", // ISO8601 with nanoseconds

常用的表达式

  • 修饰符:+ - / * & | ^ ** % >> <<
  • 比较器:> >= < <= == != =~ !~
  • 逻辑操作:|| or && and
  • 数字常量,作为 64 位浮点(12345.678)
  • 字符串常量(引号:“foobar”)
  • 日期常量(单引号,使用 rfc339、iso8601、ruby date 或 unix date 的任何排列)
  • 布尔常量:true false
  • 控制计算顺序()
  • 数组(用括号分隔的任何内容:(1,2,'foo'))
  • 前缀:!-~

聚合函数

  • Max:获取数据列的最大值,针对数值类数据生效。
  • Min:获取数据列的最小值,针对数值类数据生效。
  • Avg:获取数据列的数学平均值,针对数值类数据生效。
  • Sum:获取数据列的数学累计值,针对数值类数据生效。
  • Count:获取数据列的总数,针对任意数据列生效。
  • First: 获取数据列中时间最早的数据条目,针对任意非时间列生效。
  • Last: 获取数据列中时间最晚的数据条目,针对任意非时间列生效。

排序功能

任意系统允许类型进行正逆向排序。采用 TOPK 模型,系统最大排序缓冲区为500 万条,极限返回提供500 万记录的排序结果。排序结果与总数据量无关。排序缓冲区总量可根据业务情况进行配置。

流式查询模型

stream_query.jpg

调用者传入 SQL 字符串参数,通过 SQL 解析器 解析为 AST 语法树,然后根据内置表的信息进行 SQL 优化(比如列裁剪,谓词下推,常量折叠等)。

如果 SQL 语句 没有命中执行计划缓存,那么就需要构建执行计划并缓存,再使用执行计划进行 查询执行

在执行过程中,如果 SQL 语句 中有对时间的过滤,则先将物理文件按时间过滤。再读取磁盘文件内容,将文件内容进行向量化,转为程序可识别的数据结构。

然后进行行过滤,表达式计算,最后将结果流式输出。

插件系统

系统支持自定义跨语言插件,通过配置的方式加载自定义插件,详细配置方式见用户配置:https://doc.magustek.com/Lightning时序数据库/配置说明/用户配置.md

使用自定义插件时,支持使用 Golang 插件方式编译的 .so 插件,也支持 rust 等其他语言编译的 .wasm 插件以及 tinygo 编译的 wasi 插件。

在配置时,需注明插件的类型 (goPlugin, wasm, wasi),路径,函数名称,参数个数及返回值类型,用于做 SQL 预校验。

编译 goPlugin:

go build -buildmode=plugin -o plugin_name.so plugin.go

goPlugin 仅支持 Linux 环境

编译 wasm:

rustc -o plugin_name.wasm plugin.rs

wasm 方式支持 Windows, Linux, darwin 环境

编译 wasi:

tinygo build --target wasi plugin.go

由于 WebAssembly 仍处于实验性阶段,现不支持 string, slice 等等,所以如果要使用 string, slice 作为参数或者返回值,必须采用传 (ptr, size) 的方式。

任务追踪

系统开发调试模式下提供了任务跟踪模型,可视图化的方式跟踪任务执行各资源损耗收集,帮助二次数据库开发者快速优化。

通过调试管理控制台可选择系统的 4 种调试服务

  1. cpu-profile:开启状态下,会记录系统在执行查询语句过程中的服务器 CPU 资源消耗情况
  2. heap-profile:开启状态下,会记录系统在执行查询语句过程中的服务器内存资源消耗情况
  3. goroutine: 可获取当前系统的 goroutine stacks,可按 goroutine ID/State/运行时长排序,便于分析系统情况。

系统开启后收集完成的数据记录会自动保存,打开访问连接后即可查询对应的分析视图。

cpu-profile.png heap-profile.png goroutine-profile.png