...
文件整体采用定长记录的组织方式,即一个定长的Header+定长Node序列。Header中存储文件的描述性信息,Node中存储MNode的序列化信息。
Header中目前的字段信息如下表所示。
字段名 | 类型 | 大小 | 描述 |
---|---|---|---|
header length | byte | 1 byte | 文件头的长度,1byte 可保证 256 个字节的存储,已足够当前 header 的信息存储,当前的header使用64 byte |
node length | short | 2 byte | 一个节点记录的长度,2 byte长度可保证65536个字节的存储; 目前代码中多使用512B或1024B,实验表明类似sg1、sg2、d1、d2这种的简单命名,1KB的Node大小可支撑100个子节点 |
root position | long | 8 byte | 根节点的地址 |
reserved | 保留字段 |
3.2. 文件记录Node设计
MNode对象的序列化信息在MTree文件中,以定长Node记录链表的形式进行存储。Node记录中的信息包含两个部分,Node Header与 data body, 其中Node Header包含bitmap、pre position、extension position三个字段。Node记录有如下几种类型:
Root Node,根节点。
Internal Node,中间节点记录形式,主要存储name、parent、children等结构信息。
StorageGroup Node,在中间节点的基础上额外存储一个dataTTL字段。
Entity Node,实体节点,在中间节点基础上额外存储aliasChildren、template、LastCacheMap等信息。
StorageGroupEntity Node,实体节点与存储组节点的结合形式,为二者信息取并集。
Measurement Node,在中间节点的基础上额外存储alias、tagOffset、schema以及lastCache信息。
Extension Node,每个Node记录内依次存储字段信息,如果一个Node记录空间不够,则开额外的Extension Node进行使用,即MNode对象的序列化信息被组织成链表进行存储。
Internal Node的格式如下:
字段 | 描述 | ||||
长度 | 内容 | ||||
Header | bitmap | 1 byte | 1-3位用于标识类别 | ||
Pre position | 8 byte | 若Node不是Extension Node,则表示父节点地址,Extension Node的此位表示链表前置Node的地址 | |||
Next position | 8 byte | 链表中下一个Extension Node的地址 | |||
Body | Name | var | MNode节点名,String的存储一律采用length+content的形式,其中length采用varInt类型,content采用byte[] | ||
templateName | var | 模板名 | |||
isUsingTemplate | 1 byte | 是否使用模板 | |||
children | size | var int | child数量 | ||
name | position | var | 子节点map,存储采用键值对序列的形式,其中name采用string格式,表示子节点名,position采用long,表示子节点地址,最后一个end tag 即1 byte的 00000000 表示map结束 | ||
...... | |||||
name | position |
StorageGroup Node的格式如下:
字段 | 描述 | ||||
长度 | 内容 | ||||
Header | bitmap | 1 byte | 1-3位用于标识类别 | ||
Pre position | 8 byte | 若Node不是Extension Node,则表示父节点地址,Extension Node的此位表示链表前置Node的地址 | |||
Next position | 8 byte | 链表中下一个Extension Node的地址 | |||
Body | Name | var | MNode节点名,String的存储一律采用length+content的形式,其中length采用varInt类型,content采用byte[] | ||
dataTTL | 8 byte | 存储组中的数据生存时间 | |||
templateName | var | 模板名 | |||
isUsingTemplate | 1 byte | 是否使用模板 | |||
children | size | var int | child数量 | ||
name | position | var | 子节点map,存储采用键值对序列的形式,其中name采用string格式,表示子节点名,position采用long,表示子节点地址,最后一个end tag 即1 byte的 00000000 表示map结束 | ||
...... | |||||
name | position |
EntityMNode
字段 | 描述 | ||||
长度 | 内容 | ||||
Header | bitmap | 1 byte | 1-3位用于标识类别 | ||
Pre position | 8 byte | 若Node不是Extension Node,则表示父节点地址,Extension Node的此位表示链表前置Node的地址 | |||
Next position | 8 byte | 链表中下一个Extension Node的地址 | |||
Body | Name | var | MNode节点名,String的存储一律采用length+content的形式,其中length采用varInt类型,content采用byte[] | ||
templateName | var | 模板名 | |||
isUsingTemplate | 1 byte | 是否使用模板 | |||
children | size | var int | child数量 | ||
name | position | var | 子节点map,存储采用键值对序列的形式,其中name采用string格式,表示子节点名,position采用long,表示子节点地址,最后一个end tag 即1 byte的 00000000 表示map结束 | ||
...... | |||||
name | position | ||||
aliasChildren | size | var int | child数量 | ||
name | position | var | 子节点别名map,存储方式与children相同 | ||
...... | |||||
name | position |
StorageGroupEntityMNode
字段 | 描述 | ||||
长度 | 内容 | ||||
Header | bitmap | 1 byte | 1-3位用于标识类别 | ||
Pre position | 8 byte | 若Node不是Extension Node,则表示父节点地址,Extension Node的此位表示链表前置Node的地址 | |||
Next position | 8 byte | 链表中下一个Extension Node的地址 | |||
Body | Name | var | MNode节点名,String的存储一律采用length+content的形式,其中length采用varInt类型,content采用byte[] | ||
dataTTL | 8 byte | 存储组中的数据生存时间 | |||
templateName | var | 模板名 | |||
isUsingTemplate | 1 byte | 是否使用模板 | |||
children | size | var int | child数量 | ||
name | position | var | 子节点map,存储采用键值对序列的形式,其中name采用string格式,表示子节点名,position采用long,表示子节点地址,最后一个end tag 即1 byte的 00000000 表示map结束 | ||
...... | |||||
name | position | ||||
aliasChildren | size | var int | child数量 | ||
name | position | var | 子节点别名map,存储方式与children相同 | ||
...... | |||||
name | position |
Measurement Node的格式如下:
字段 | 描述 | |||||
长度 | 内容 | |||||
Header | bitmap | 1 byte | 1-3位用于标识类别 | |||
Pre position | 8 byte | 若Node不是Extension Node,则表示父节点地址,Extension Node的此位表示链表前置Node的地址 | ||||
Next position | 8 byte | 链表中下一个Extension Node的地址 | ||||
Body | Name | var | MNode节点名,String的存储一律采用length+content的形式,其中length采用varInt类型,content采用byte[] | |||
alias | var | Measurement MNode节点别名 | ||||
tagOffset | 8 byte | 标签/属性信息在TagFile中的位置 | ||||
schema | type | 1 byte | 数据类型 | |||
encoding | 1 byte | 编码方式 | ||||
compressor | 1 byte | 压缩方式 | ||||
props | key | value | var | 压缩参数 | ||
key | value | |||||
...... | ||||||
End tag |
4. 文件读写功能设计
目前的文件读写功能的实现主要分三个层次
...