Appearance
文件系统
由于 Lightning System 数据库系统面对的数据写入量大,数据连续性强等特点,数据存储模型需要具有较强的数据写入能力,存储系统采用了优化的 KT-LSM 树模型的数据写入框架。
LSMTree 结构主要设定多级数据存储区域,数据写入过程按顺序记录数据日志 WAL(Write Ahead Log),由于数据日志是连续性存在的,系统采用的是连续数据写。在日志写入完成后,对 WAL 内容与内存中的 C0 进行合并。当 C0 满足设计阈值时,C0 与 C1 数据进行合并整理操作,合并完成后的 C1 数据替换原有的 C1 数据结果。
系统设计有多级的数据存储区域,各级区域均设置有存储阈值。存储区域满足合并策略时,各级依次往下进行合并。由于各层级的数据存储区的存在,相当于建立了大小不一的数据缓冲区。在数据归并时,将归并区数据读出整理后,再以顺序写入。数据文件在合并动作中产生一次读写放大,但相对于大量的随机定位,大幅减少了存储碎片。使得后续数据读取效率更高,数据使用命中率更好。
KT-LSM-Tree 是根据时间序列数据特性,针对数据内容中强业务相关项 Key 以及 Time 进行特定优化的 Log-Structured-Merge-Tree。根据接收数据的 Key+Time 将不同数据经算法计算后划分入不同的数据处理单元,每个数据处理单元是一个独立的 LSM-Tree 模型,内存缓存中根据 Key 为分区,以 Time 为序的跳表(SkipList)(由于数据可能存在时间乱序,数据需要有序化处理)。数据处理单元中,由于数据写入总量较大,不是所有数据纳入 LSM-Tree,系统将根据用户写入的数据频度情况,决定数据处理区域的热度,数据热度高的在 memory 产生 C0 缓存。数据热度低的不产生 C0 缓存。在写入动作完成后,根据 compaction 策略,触发异步的数据归并活动。
Compaction 策略是通过存储区大小阈值和生命周期为条件建立的。当数据存区满足设计的整理条件(存储区阈值和生命周期)时才进行触发 compaction 处理,这样设计可大幅减少数据频繁读写,减少磁盘读写放大。在 compaction 处理中,系统对数据存储区域的内容进行重新整理,整理数据将按数据同 Key 内容连续放置,数据块中数据按时间进行顺序重排。数据整理重排后,系统会重建存储索引。
在传统的 LSM 结构中,数据采用 WAL-->MemTable-->Immutable MemTable-->SSTable(Sorted String Table) 的操作步骤进行逐层操作。由于存储数据内容需要有序。多数时序数据库系统使用虚拟 Key 信息,在虚拟 Key 信息中把数据指标名(列名)、数据时标直接作为 Key 的一部分,这也导致了落盘数据的数据膨胀。
KT-LSM 模型中,数据按照写入流程切分结构,数据流入后根据数据内容进行关键信息(Key+Time)拆解。系统不创建虚拟 Key,每个业务 Key 拥有独立的 DataBlock 来存放数据(见存储设计),减少空间占用。
数据写入:
- 根据写入数据的时标信息,把数据直接划分到对应的归档目录。
- 根据 Key 信息进行 Hash 计算,计算出 Key 数据归属的数据存储区。
- 数据处理单元根据数据热度,确定是否建立 LSMTree 中的内存缓存。
- 若数据区写入热度不高,数据处理单元不建立 C0 内存缓存,直接使用 WAL 日志记录归档。
- 若数据写入热度高,数据记录 WAL 的基础上,同步写入内存 C0,根据数据区的合并策略(大小阈值和生命周期),执行 compaction 处理。
- 系统异步检查程序会根据数据各存储区文件状态,选择性执行异步的 compaction 处理流程。compaction 处理中对数据区内 Key 尽量归并在一起,对 Key 中数据时间按先后顺序排序。
写入事务模型
由于在文件系统中,仅 rename 和 delete 是文件系统原子性保证的。其他对文件的变更操作均需要 sync 磁盘才可保证数据安全。数据文件设计中,所有数据文件均设计文件有效位置,用于标记数据有效范围。所有数据均采用追加写入的方式进行。
在任务影响预评估结构中,任何对数据文件的变更过程中均使用任务文件记录变更影响。由于任务文件非常小,不对文件系统造成负载负担。
数据追加模型:
数据变更内容写临时数据文件。临时数据文件内容和格式与标准数据文件完全一致,方便后续做数据主体合并。
在事务过程中,根据数据写入内容大小,判定临时文件后续操作方式。若写入数据较小,临时数据文件与主体合并。临时数据文件大,直接变更文件名称。
数据文件的头信息中存储文件有效位置标尺,任务清单中记录数据有效位置,事务中修改有效标尺。完成后删除任务清单。
- 任意会话写入的数据均写入临时文件数据文件。
- 事务提交动作产生后,预先整理出所有后续产生变化的目标文件对象,对目标文件对象的变更前状态记录至任务执行文件中,且确保任务文件信息已完全正确写入存储。
- 数据合并过程中仅合并数据主体,不修改数据目标文件对象的有效标尺位置。
- 所有预计划动作全部完成后,统一修改目标文件有效标尺,才可以删除临时文件以及任务文件。
- 事务执行完成后,返回其事务执行结果。
- 程序使用过程中出现异常情况或崩溃,未处理完成的事务内容根据任务文件描述。
恢复流程
处理流程:
- 系统启动时,检查是否包含事务执行过程中产生的任务文件。
- 读取任务文件中包含的文件清单和事务状态前序状态。
- 根据任务清单文件内容,将前序状态逐个恢复。
- 数据服务正式对外提供数据服务。
实时数据
系统在开启实时配置后,会针对每一个数据表建立实时数据管理模型。实时数据管理模型会自动记录每个 Key 的最大时间戳的数据条目。如果在相同时间戳情况下,记录最后入库的那条数据。
实时数据特点
- 每个 Key 有且仅有一条记录存储于实时表模型中。
- 每个 Key 时间最新的数据将自动记录在实时表中。
- 实时表不支持数据删除、修改操作。若需要变更数据,需要修改原始记录。
- 数据表结构变更,实时表自动变更为最新的数据表版本。
- 如果 Key 被删除,系统实时数据管理将自动删除实时记录。
- 如果某个 Key 的最后时间戳数据被删除,将自动替换为其它最新时间戳的数据。
表命名方式
实时表使用模型为 tableName[数据表名]_rt
的规则进行定义,用户不能创建,不能刪除。如果对应数据表修改数据结构,实时数据管理会自动升级内存数据集版本。
例如 :系统包含数据表,名称为:data
,在开启实时模型的状态下,自动会将data
表中每一个 Key 的最新时间结果自动记录在data_rt
表中。
实时日志文件 binlog
扩展名为.binlog 的文件是在系统实时数据管理模块中,记录上一次快照记录完成后到后续期间的变化数据。binlog 中仅期间变化的 Key,Key 产生任意变化都记录在 binlog 中,但一个时间周期内每个 Key 有且记录一次。
实时快照文件 snapshot
扩展名为.snapshot 的文件是系统实时数据管理模块中的快照数据文件,记录在某个时刻中实时管理模块中的瞬态内存数据切片。
实时写入临时文件 event
扩展名为.event 的文件是系统实时数据写入时与写入事务同步的备份文件,记录当前写入事务所生成的实时数据。当事务提交或回滚时删除.event 文件,当事务恢复时恢复.event 文件内容并等待提交。
行列混合存储模型
由于 LDB 需要提供大量读写能力,系统基于行列混合的存储模型。进入数据库的时序数据先以行存储模型进行存储,然后再通过整理合并按照列模型进行存储。
数据文件 aaf 文件
aaf 文件是系统的行式数据存储格式,主要用于快速的记录写入的数据行信息。可以理解为 LSM-Tree 模型中的 Log 文件。aaf 文件默认最大 256MB
(若需要修改见配置说明), 其数据结构简要视图如下:
归档文件 archive 文件
archive 文件是系统的历史归档格式,主要以列式存储模式对数据进行归档。文件默认最大 2GB
,其数据结构简要视图如下:
归档数据索引文件 archive.index 文件
archive.index 文件是系统对 archive 文件的重要信息抽象,主要使用优化的存储结构和摘要信息存储 archive 文件中数据块信息,key 信息、数据块的存储地址、数据块统计切片等可大幅提升查询效率。
数据存储索引信息中,将数据块进行预聚合处理,将常见的数值信息、布尔值信息、时间信息进行预聚合处理。
预聚合信息包括:
- 数值类型:最大值、最小值、累计值等统计切片。
时间类型:开始时间、结束时间。*(未实现)*
- 布尔类型:数值为 true 个数,数值为 false 个数。
indexCache 文件
indexCache 是系统中对 archive.index 文件的关键数据抽象,系统 Cache 缓存模型中会对其进行较长时间内存缓存(缓存时间默认是24小时
)
Cache 缓存模型会主动维护 indexCache,更新策略会主动根据 archive.index 的最后变更时间进行判读,若文件 archive.index 文件变更,缓存系统会默认重载 archive.index 并生成新的 indexCache 文件。
其他文件
*temp 是系统事务模型中的临时数据文件。如果系统事务正确提交,会自动移除。如果事务失败,客户端可重复 Commit 动作。若客户端在设置的时间内(选项为用户设置,默认未 7 天)未执行 Commit,系统将自动移除对应事务 ID 的临时文件。
- 系统后缀为 .aaftmp 的文件是 AAF 写入模式下的临时文件
- 系统后缀为 .temp 的文件是 archive 写入模式下的临时文件
- 系统后缀为 .temp.index 的文件是 archive 写入模式下的临时文件
- 系统后缀为 .tidyTemp 的文件是 整理数据时产生的临时文件
- 系统后缀为 .aaf2archiveTemp 的文件是 aaf 转换为 archive 的临时文件
- 其他 ...