Skip to content

文件系统

由于 Lightning System 数据库系统面对的数据写入量大,数据连续性强等特点,数据存储模型需要具有较强的数据写入能力,存储系统采用了优化的 KT-LSM 树模型的数据写入框架。

LSMTree 结构主要设定多级数据存储区域,数据写入过程按顺序记录数据日志 WAL(Write Ahead Log),由于数据日志是连续性存在的,系统采用的是连续数据写。在日志写入完成后,对 WAL 内容与内存中的 C0 进行合并。当 C0 满足设计阈值时,C0 与 C1 数据进行合并整理操作,合并完成后的 C1 数据替换原有的 C1 数据结果。

系统设计有多级的数据存储区域,各级区域均设置有存储阈值。存储区域满足合并策略时,各级依次往下进行合并。由于各层级的数据存储区的存在,相当于建立了大小不一的数据缓冲区。在数据归并时,将归并区数据读出整理后,再以顺序写入。数据文件在合并动作中产生一次读写放大,但相对于大量的随机定位,大幅减少了存储碎片。使得后续数据读取效率更高,数据使用命中率更好。

LSM.png

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 来存放数据(见存储设计),减少空间占用。

storageModel.png

数据写入:

  1. 根据写入数据的时标信息,把数据直接划分到对应的归档目录。
  2. 根据 Key 信息进行 Hash 计算,计算出 Key 数据归属的数据存储区。
  3. 数据处理单元根据数据热度,确定是否建立 LSMTree 中的内存缓存。
  4. 若数据区写入热度不高,数据处理单元不建立 C0 内存缓存,直接使用 WAL 日志记录归档。
  5. 若数据写入热度高,数据记录 WAL 的基础上,同步写入内存 C0,根据数据区的合并策略(大小阈值和生命周期),执行 compaction 处理。
  6. 系统异步检查程序会根据数据各存储区文件状态,选择性执行异步的 compaction 处理流程。compaction 处理中对数据区内 Key 尽量归并在一起,对 Key 中数据时间按先后顺序排序。

写入事务模型

由于在文件系统中,仅 rename 和 delete 是文件系统原子性保证的。其他对文件的变更操作均需要 sync 磁盘才可保证数据安全。数据文件设计中,所有数据文件均设计文件有效位置,用于标记数据有效范围。所有数据均采用追加写入的方式进行。
在任务影响预评估结构中,任何对数据文件的变更过程中均使用任务文件记录变更影响。由于任务文件非常小,不对文件系统造成负载负担。

数据追加模型:

数据变更内容写临时数据文件。临时数据文件内容和格式与标准数据文件完全一致,方便后续做数据主体合并。
在事务过程中,根据数据写入内容大小,判定临时文件后续操作方式。若写入数据较小,临时数据文件与主体合并。临时数据文件大,直接变更文件名称。
数据文件的头信息中存储文件有效位置标尺,任务清单中记录数据有效位置,事务中修改有效标尺。完成后删除任务清单。

write.png

  1. 任意会话写入的数据均写入临时文件数据文件。
  2. 事务提交动作产生后,预先整理出所有后续产生变化的目标文件对象,对目标文件对象的变更前状态记录至任务执行文件中,且确保任务文件信息已完全正确写入存储。
  3. 数据合并过程中仅合并数据主体,不修改数据目标文件对象的有效标尺位置。
  4. 所有预计划动作全部完成后,统一修改目标文件有效标尺,才可以删除临时文件以及任务文件。
  5. 事务执行完成后,返回其事务执行结果。
  6. 程序使用过程中出现异常情况或崩溃,未处理完成的事务内容根据任务文件描述。

恢复流程

restore.png

处理流程:

  1. 系统启动时,检查是否包含事务执行过程中产生的任务文件。
  2. 读取任务文件中包含的文件清单和事务状态前序状态。
  3. 根据任务清单文件内容,将前序状态逐个恢复。
  4. 数据服务正式对外提供数据服务。

实时数据

系统在开启实时配置后,会针对每一个数据表建立实时数据管理模型。实时数据管理模型会自动记录每个 Key 的最大时间戳的数据条目。如果在相同时间戳情况下,记录最后入库的那条数据

实时数据特点

  1. 每个 Key 有且仅有一条记录存储于实时表模型中。
  2. 每个 Key 时间最新的数据将自动记录在实时表中。
  3. 实时表不支持数据删除、修改操作。若需要变更数据,需要修改原始记录。
  4. 数据表结构变更,实时表自动变更为最新的数据表版本。
  5. 如果 Key 被删除,系统实时数据管理将自动删除实时记录。
  6. 如果某个 Key 的最后时间戳数据被删除,将自动替换为其它最新时间戳的数据。

表命名方式

实时表使用模型为 tableName[数据表名]_rt的规则进行定义,用户不能创建,不能刪除。如果对应数据表修改数据结构,实时数据管理会自动升级内存数据集版本。

例如 :系统包含数据表,名称为:data,在开启实时模型的状态下,自动会将data表中每一个 Key 的最新时间结果自动记录在data_rt表中。

实时日志文件 binlog

扩展名为.binlog 的文件是在系统实时数据管理模块中,记录上一次快照记录完成后到后续期间的变化数据。binlog 中仅期间变化的 Key,Key 产生任意变化都记录在 binlog 中,但一个时间周期内每个 Key 有且记录一次。

实时快照文件 snapshot

扩展名为.snapshot 的文件是系统实时数据管理模块中的快照数据文件,记录在某个时刻中实时管理模块中的瞬态内存数据切片。

实时写入临时文件 event

扩展名为.event 的文件是系统实时数据写入时与写入事务同步的备份文件,记录当前写入事务所生成的实时数据。当事务提交或回滚时删除.event 文件,当事务恢复时恢复.event 文件内容并等待提交。

行列混合存储模型

由于 LDB 需要提供大量读写能力,系统基于行列混合的存储模型。进入数据库的时序数据先以行存储模型进行存储,然后再通过整理合并按照列模型进行存储。

io_mode.png

数据文件 aaf 文件

aaf 文件是系统的行式数据存储格式,主要用于快速的记录写入的数据行信息。可以理解为 LSM-Tree 模型中的 Log 文件。aaf 文件默认最大 256MB(若需要修改见配置说明), 其数据结构简要视图如下:
aaf.png

归档文件 archive 文件

archive 文件是系统的历史归档格式,主要以列式存储模式对数据进行归档。文件默认最大 2GB,其数据结构简要视图如下:
archive.png

归档数据索引文件 archive.index 文件

archive.index 文件是系统对 archive 文件的重要信息抽象,主要使用优化的存储结构和摘要信息存储 archive 文件中数据块信息,key 信息、数据块的存储地址、数据块统计切片等可大幅提升查询效率。

数据存储索引信息中,将数据块进行预聚合处理,将常见的数值信息、布尔值信息、时间信息进行预聚合处理。
预聚合信息包括:

  1. 数值类型:最大值、最小值、累计值等统计切片。
  2. 时间类型:开始时间、结束时间。*(未实现)*
  3. 布尔类型:数值为 true 个数,数值为 false 个数。

index.png

indexCache 文件

indexCache 是系统中对 archive.index 文件的关键数据抽象,系统 Cache 缓存模型中会对其进行较长时间内存缓存(缓存时间默认是24小时
Cache 缓存模型会主动维护 indexCache,更新策略会主动根据 archive.index 的最后变更时间进行判读,若文件 archive.index 文件变更,缓存系统会默认重载 archive.index 并生成新的 indexCache 文件。

indexCache.png

其他文件

*temp 是系统事务模型中的临时数据文件。如果系统事务正确提交,会自动移除。如果事务失败,客户端可重复 Commit 动作。若客户端在设置的时间内(选项为用户设置,默认未 7 天)未执行 Commit,系统将自动移除对应事务 ID 的临时文件。

  1. 系统后缀为 .aaftmp 的文件是 AAF 写入模式下的临时文件
  2. 系统后缀为 .temp 的文件是 archive 写入模式下的临时文件
  3. 系统后缀为 .temp.index 的文件是 archive 写入模式下的临时文件
  4. 系统后缀为 .tidyTemp 的文件是 整理数据时产生的临时文件
  5. 系统后缀为 .aaf2archiveTemp 的文件是 aaf 转换为 archive 的临时文件
  6. 其他 ...