赞
踩
目录
TSM文件格式如下
Header | Datablocks | Indexes | Footer |
5 bytes | N bytes | N bytes | 8 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 | |||
Index | Index | Index | ... |
Indexes 由一个或多个Index组成
每一个Index结构由8个部分构成
Index | ||||||||
Key len | Key | Type | Count | Min Time | Max Time | Offset | Data Size | ... |
2 bytes | N bytes | 1 byte | 2 bytes | 8 bytes | 8 bytes | 8 bytes | 4 bytes |
Key (N bytes): seriresKey+ 分隔符(#!~#) + field
Key len(2 bytes): Key 的长度
Type(1 byte): field value的类型,有5种
Type enum | |
0 | Float64 |
1 | Int64 |
2 | Bool |
3 | String |
4 | Uint64 |
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的大小
由一个或多个Blocks组成
Data Blocks | |||
Block | Block | Block | ... |
每个Block由由一个CRC32校验码和Data部分构成
Block | |
CRC32 4 bytes | Data |
CRC32用于校验Data是否被更改损坏。
data
data | ||
Block type | TimeStamps | Values |
1 byte | N bytes | N bytes |
blocktype(1byte): 同上文index中的type, 决定了values的编码类型
TimeStamps 也有3种编码方式,现已知RLE编码,其结构如下
Timestamp len | timestamps | ||||
varint | Encoding type | exponent | starting timestamp | run length value | counter |
higher 4bits | lower 4 bits | varint | varint | ||
x bytes | 1 byte | 8 bytes | x bytes | x 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 有五种编码类型 integer, float, unsigned, string, bool.
现已知float编码
values | |
compression type | field values |
gorilla paper encoding | |
1byte | xbytes |
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, 时间间隔不同的编码格式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。