TSM文件格式及实例解析(一)

目录

 

格式概述

Header

Indexes

DataBlocks

TimeStamps

Data values

实例分析

数据产生

数据分析

小结:


格式概述

TSM文件格式如下

HeaderDatablocksIndexesFooter
5 bytesN bytesN bytes8 bytes


Header 如图所示,TSM文件由Header, Datablocks, Indexes, Footer四个部分构成。

Header
Magic Number 
4 bytes
Version
1 byte

Magic Number(4 bytes):表示何种存储引擎,TSM引擎代号就是 0x16d116d1

Version (1 bytes): 表示存储引擎版本号,目前TSM1,版本号为1

Footer
Indexes offset
8 bytes

Footer这8个bytes标明了Indexes部分的起始位置的offset. 这样就能够直接找到Indexes

Indexes

Indexes
IndexIndexIndex...

Indexes 由一个或多个Index组成

每一个Index结构由8个部分构成

Index
Key lenKeyTypeCountMin TimeMax TimeOffsetData Size...
2 bytesN bytes1 byte2 bytes8 bytes8 bytes8 bytes4 bytes

Key (N bytes): seriresKey+ 分隔符(#!~#) + field

Key len(2 bytes): Key 的长度

Type(1 byte): field value的类型,有5种 

Type enum
0Float64
1Int64
2Bool
3String
4Uint64

Count(2 bytes): 后面 data block索引的个数

一个data block索引包含以下4个元素,固定28 bytes

Min Time (8 bytes): block最大时间戳

Max Time(8 bytes): block最小时间戳

Offset(8 bytes): block所在位置(偏移量)

Data size(4 bytes): 该block的大小

 

DataBlocks

由一个或多个Blocks组成

Data Blocks
BlockBlockBlock...

每个Block由由一个CRC32校验码和Data部分构成

Block
CRC32
4 bytes

Data
N bytes

CRC32用于校验Data是否被更改损坏。

data

data
Block typeTimeStampsValues
1 byteN bytesN bytes

blocktype(1byte):  同上文index中的type, 决定了values的编码类型

TimeStamps

TimeStamps 也有3种编码方式,现已知RLE编码,其结构如下

Timestamp lentimestamps
varintEncoding typeexponentstarting timestamprun length valuecounter
higher 4bitslower 4 bitsvarintvarint
x bytes1 byte8 bytesx bytesx bytes

Timestamp len(x bytes): varint编码,表示整个TimeStamp数据库长度

Encoding type(4 bits): timestamp压缩类型,0 Uncompressed; 1 PackedSimple; 2, RLE; 这里是RLE 2。

Exponent(4bis): 这个指数是算 时间offset用的。

Starting timestamp(8 bytes):  64位时间完整表示起始时间。

run length value(x bytes):  这是一个系数,时间offset = run lenght value * 10^ exponent

Counter(x bytes): timestamp的数量,同时也是data values的数量

Data values

Data values 有五种编码类型 integer, float, unsigned, string, bool.

现已知float编码

values
compression typefield values
gorilla paper encoding
1bytexbytes

field values将 多个数字压缩在一组8个字节里,每8个字节一组。values的数量与timestamp的counter一致。
compression type(1 byte)  0x10 对于float只有一种编码模式gorilla paper encoding

第一组8个bytes为一个数,经过IEEE754 64位浮点数解码可得第一个value

第二组8个bytes及以后,按照gorilla paper多个数压缩进一组 8bytes, 以第一个value为基准。

 

实例分析

数据产生

一组测试数据,车辆实时里程。field只有mileage, 且时间戳等差1000ns.

insert cars,brand=bmw,model=x5 mileage=2300 1535354189281013006
insert cars,brand=bmw,model=x5 mileage=2400 1535354189281014006
insert cars,brand=bmw,model=x5 mileage=2500 1535354189281015006
insert cars,brand=bmw,model=x5 mileage=2600 1535354189281016006
insert cars,brand=bmw,model=x5 mileage=2700 1535354189281017006
insert cars,brand=bmw,model=x5 mileage=2800 1535354189281018006
insert cars,brand=bmw,model=x5 mileage=2900 1535354189281019006

> select * from cars
name: cars
time                brand mileage model
----                ----- ------- -----
1535354189281013006 bmw   2300    x5
1535354189281014006 bmw   2400    x5
1535354189281015006 bmw   2500    x5
1535354189281016006 bmw   2600    x5
1535354189281017006 bmw   2700    x5
1535354189281018006 bmw   2800    x5
1535354189281019006 bmw   2900    x5

TSM数据

最后一个0x0a 是vim编辑器浏览hex导致的,源文件是没有的这个byte的。请忽略该byte。

数据分析

这里time起始值为 0x 154E AC80 2080 AD0E, 即为1535354189281013006

time offset = run length value 1 * 10 ^ exponent 3 = 1000

counter为7,以 starttime为基, 后面6个timestamp 依次加1000。 timestamp 与value再一一对应。

上图红框剩余部分为key和field

第一个数,0x40A1F800000000,  IEEE 754解码后为2300。

小结:

这个例子是一个serieskey,  timestamp间隔相同, 单个field,且都是 数字的特例。

后面将继续研究多field,不同类型field, 多个serieskey, 时间间隔不同的编码格式。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值