...
- 主要思想:
- 内存中Map <Metric, Map <Label Key, Order> > table结构维护label之间的顺序
- Prometheus中时序根据label顺序对应到IoTDB
- 实例
- 添加时序
- Prometheus时序:
(1)country{state=A,city=B,town=C}
(2)country{tem=D}
(3))country{state=A,city=B,town=C,tem=D}
- 假设存储组数量为5,则("country").hashCode() % 5为2,对应的存储组为sg2,测点为country
(1)对应的记录label顺序的table为
metric_name
label_key
order
country
state
0 country
city
1 country
town
2 (2)对应的记录label顺序的table为
metric_name
label_key
order
country
state
0 country
city
1 country
town
2 country
tem 3 (3)对应的记录label顺序的table为
metric_name
label_key
order
country
state
0 country
city
1 country
town
2 country
tem 3 (1)对应IoTDB时序为root.sg2.A.B.C.country
(2)对应IoTDB时序为root.sg2.ph.ph.ph.D.country
(3)对应IoTDB时序为root.sg2.A.B.C.D.country
为了重启时候对table的恢复,在IoTDB中记录数据
root.LABEL_INFO.metric_name
root.LABEL_INFO.label_name
root.LABEL_INFO.label_order
country
state
0
country
city
1 country
town
2 country
tem 3
- Prometheus时序:
- 查询数据
查询数据:查询country中city=B的数据,city的order为1,country中order的最大值为3
对应到IoTDB中的查询为
select country from root.sg0.*.B
select country from root.sg0.*.B.*
select country from root.sg0.*.B.*.*
- 添加时序
- 设计
允许用户设置IoTDB中SG的数量,例如,`SG_NUMBER`=5。可以是`iotdb-engine.properties`中的参数.然后得到5个sg,比如“sg0,sg1,…,sg4”。
metric
认为是IoTDB中的一个measurement
可以通过hash决定metric会对应到哪个存储组,eg Metric.hashcode() % SG_NUMBE‘
在内存中维护一个table去保存对应的映射,在内存中的结构为:Map <Metric, Map <Label Key, Order> > table(改进:考虑到内存开销,可以只将表的一部分作为缓存保存在内存中)------- 解决问题:怎样映射label key和它对应的order
在IoTDB中存储metric,label以及其对应的顺序,通过三条时序(以便在IoTDB重启的时候恢复内存中的table)
'root.LABEL_INFO.metric_name'
'root.LABEL_INFO.label_name'
- 'root.LABEL_INFO.label_order`
添加metric时维护map ------------ 解决问题:在不知道所有label的情况下维护map
首先判断table.get(metric_name)为空,则向时序'root.LABEL_INFO.metric_name'中添加数据点,时间戳可以是系统当前的时间或者是0,1,2,3,value是metric name,同时在table中添加对应的metric
其次根据metric_name,label_key判断table.get(metric_name).get(label_key)为空,则向时序'root.LABEL_INFO.label_name'中添加数据点,时间戳可以是系统当前的时间或者是0,1,2,3,value是label_key
同时也要向时序'root.LABEL_INFO.label_order`中添加数据点,时间戳和对应的'root.LABEL_INFO.label_name'中添加的数据点的时间戳相同,但是value是对应的metric中的最大的order+1
table.get(metric_name)中添加对应的label_key和lable_order.
生成IoTDB对应的时序
- string paths[]数组记录时序节点,int largest记录metric中label的order的最大值
- 已有的label,paths[label_order]=label_value
- 新的label,paths[largest+1]=label_value
- 遍历paths数组,null的位置填充ph,得到时序root+sg_name+paths.sub(0, paths.size()-1).metric
...