4. 星务数据组织结构与索引
星务计算机面对的数据具有明显的“多源、周期、突发、长周期留存”特征:遥测帧按固定周期到达,遥测参数以不同采样率更新,事件与告警随机产生,平台日志与载荷辅助数据则可能成批写入。若把这些数据直接按到达顺序堆进 Flash,很快就会出现检索慢、擦写不均、掉电易损等问题。因此,星务数据管理需要在存储介质之上建立一套组织结构与索引体系,把“物理可写”变成“可查、可维护、可恢复”。
一、数据块管理:把连续空间切成可寻址单元
数据块是星务存储管理的最小分配单位,通常由若干连续页组成。以常见的 SPI NOR Flash 为例,假设页大小为 256 字节,扇区为 4 KB(16 页),块为 64 KB(16 扇区)。数据块管理要维护三类信息:块编号、块状态(空闲/使用中/待回收/坏块)、块内写指针。块编号给出物理定位,状态决定能否写入,写指针记录当前追加位置。
块管理的关键约束来自 Flash 的“先擦后写”特性:同一扇区不能反复覆盖写,必须先擦除整扇区。因此数据块管理不能只做线性分配,还要配合磨损均衡与垃圾回收。一个实用的做法是把块划分为“数据区”和“索引区”:数据区按追加方式写入,索引区记录该块内有效数据的偏移、长度和逻辑标识。当某块有效数据比例低于阈值(例如 40%)时,触发回收:把有效数据搬到新块,再擦除旧块。
二、页与扇区映射:逻辑地址到物理地址的翻译层
页与扇区映射解决的是“上层按逻辑页号访问,底层按物理扇区擦写”的矛盾。星务软件通常定义逻辑页号 LPN,由数据类别、文件号、页内偏移组成;映射表把 LPN 转换为物理地址(块号、扇区号、页内偏移)。映射粒度可以是页级,也可以是扇区级。页级映射灵活但表项多,扇区级映射节省空间但回收时搬运量大。
对于星务这种资源受限环境,常采用“块内顺序、块间索引”的混合映射:块内页按顺序连续存放,块索引表只记录每块的逻辑起始页和有效页数。这样映射表规模小,查找时先定位块,再在块内顺序扫描。若块内数据量不大,扫描开销可以接受;若需要更快检索,可在内存中缓存热点块的页级映射。
三、日志结构存储:把随机写变成顺序追加
日志结构存储(Log-Structured Storage)的核心思想是:所有写入都追加到日志尾部,不原地更新。每条记录包含头部(记录类型、长度、时间戳、校验)和负载。写入时先写日志,再更新内存索引;掉电后通过扫描日志尾部重建索引。这种方式把随机写转化为顺序写,显著降低擦写次数,也便于掉电恢复。
在星务场景中,日志结构适合存放事件、告警和状态变更记录。例如一条事件记录可设计为:magic(2B) + type(1B) + len(1B) + timestamp(4B) + payload(N) + crc16(2B)。恢复时从上次检查点开始顺序扫描,遇到 magic 和 CRC 正确则重放,遇到非法记录则停止并截断。检查点(checkpoint)定期写入,记录当前有效日志尾位置和索引根,避免每次上电都全盘扫描。
四、环形缓冲区:周期数据与最近历史的低成本容器
环形缓冲区用于存放“只关心最近一段”的数据,如最近 10 分钟遥测、最近 100 条告警。它用固定大小的存储区加读指针、写指针实现:写指针追上读指针时覆盖最旧数据。环形缓冲区不追求全量留存,而追求恒定空间和恒定写入开销。设计时要明确三个参数:容量(能存多少条/多少字节)、覆盖策略(覆盖最旧还是拒绝新数据)、以及掉电后是否保留。若掉电保留,需要把读写指针也持久化,并在上电时校验指针合法性。
五、时间索引与事件索引设计
时间索引解决“按时间段检索”的问题。星务数据通常带时间戳,时间索引可以按分钟或秒建立稀疏索引:每 N 条记录记录一次“时间戳—块号—页偏移”的映射。查询时先二分查找时间索引,定位到大致块,再在块内顺序扫描。索引项不宜过密,否则占用空间;也不宜过疏,否则扫描量大。以 1 分钟一条索引、每条索引 12 字节计算,一天 1440 条索引约 17 KB,对星务存储是可接受的。
事件索引解决“按事件类型或事件 ID 检索”的问题。事件索引通常维护事件类型到记录链表的映射,例如“电源告警”指向最近 50 条相关记录的位置。由于事件是突发的,事件索引更适合用哈希表加溢出链,或按事件类型分区的环形缓冲区。设计时要考虑索引更新与数据写入的原子性:先写数据记录,再更新索引;若掉电导致索引未更新,恢复时可通过扫描日志重建。
六、综合设计示例与判断依据
假设某星务计算机使用 16 MB NOR Flash,页 256 B,扇区 4 KB,块 64 KB。规划如下:前 1 MB 存放引导与文件系统元数据;中间 12 MB 作为数据区,划分为 192 个 64 KB 块;最后 3 MB 作为索引与检查点区。数据区中,遥测周期数据写入环形缓冲区(占 4 MB),事件与日志写入日志结构区(占 8 MB)。时间索引每 60 秒一条,事件索引按类型维护 16 个桶。
判断设计是否合理,可以观察几个指标:写入放大是否可控(日志结构区回收时搬运量不超过块容量的 60%);掉电恢复时间是否满足要求(扫描日志尾不超过 2 秒);索引查询是否能在 3 次介质访问内定位到目标记录;坏块出现时是否有备用块替换。若这些指标不满足,应优先调整块大小、索引密度或环形缓冲区容量,而不是简单增加存储空间。