Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. 主要思想:
    1. 内存中Map <Metric, Map <Label Key, Order> > table结构维护label之间的顺序
    2. Prometheus中时序根据label顺序对应到IoTDB
  2. 实例
    1. 添加时序
      1.  Prometheus时序: 

        (1)country{state=A,city=B,town=C}

        (2)country{tem=D}

        (3))country{state=A,city=B,town=C,tem=D}  

      2. 假设存储组数量为5,则("country").hashCode() % 5为2,对应的存储组为sg2,测点为country
      3.  (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
        tem3

        (3)对应的记录label顺序的table为

        metric_name 
        label_key 
        order 
        country
        state
        0
        country
        city
        1
        country
        town
        2
        country
        tem3


      4. (1)对应IoTDB时序为root.sg2.country .A.B.C.country 

        (2)对应IoTDB时序为root对应IoTDB时序为root.sg2.country.ph.ph.ph.D.country 

        (3)对应IoTDB时序为root.sg2.country.A.B.C.D.country 

      5. 为了重启时候对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
        tem3


    2. 查询数据
      1. 查询数据:查询country中city=B的数据,city的order为1,country中order的最大值为3

        1. 对应到IoTDB中的查询为

          select country from root.sg0. * .Bselect country from root.sg0.*.B.*select country from root.sg0.*.B.*.*
  3. 设计
    1. 允许用户设置IoTDB中SG的数量,例如,`SG_NUMBER`=5。可以是`iotdb-engine.properties`中的参数.然后得到5个sg,比如“sg0,sg1,…,sg4”。

    2. metric

      1. 认为是IoTDB中的一个measurement

      2. 可以通过hash决定metric会对应到哪个存储组,eg Metric.hashcode() % SG_NUMBE‘

    3. 在内存中维护一个table去保存对应的映射,在内存中的结构为:Map <Metric, Map <Label Key, Order> > table(改进:考虑到内存开销,可以只将表的一部分作为缓存保存在内存中)------- 解决问题:怎样映射label key和它对应的order

    4. 在IoTDB中存储metric,label以及其对应的顺序,通过三条时序(以便在IoTDB重启的时候恢复内存中的table)

      1. 'root.system_p.label_info.metric_name'

      2. root.system_p.label_info.label_name'

      3. 'root.system_p.label_info.label_order`
    5. 添加metric时维护map ------------ 解决问题:在不知道所有label的情况下维护map

      1. 首先判断table.get(metric_name)为空,则向时序'root.LABEL_INFO.metric_name'中添加数据点,时间戳可以是系统当前的时间或者是0,1,2,3,value是metric name,同时在table中添加对应的metric

      2. 其次根据metric_name,label_key判断table.get(metric_name).get(label_key)为空,则向时序'root.system_p.label_info.label_name'中添加数据点,时间戳可以是系统当前的时间或者是0,1,2,3,value是label_key

        同时也要向时序'root.system_p.label_info.label_order`中添加数据点,时间戳和对应的'root.system_p.label_info.label_name'中添加的数据点的时间戳相同,但是value是对应的metric中的最大的order+1

        table.get(metric_name)中添加对应的label_key和lable_order.

    6. 生成IoTDB对应的时序

      1. string paths[]数组记录时序节点,int  largest记录metric中label的order的最大值
      2. 已有的label,paths[label_order]=label_value
      3. 新的label,paths[largest+1]=label_value
      4. 遍历paths数组,null的位置填充ph,得到时序root+sg_name+metric + paths.sub(0, paths.size()-1).metric

3.4 参考文档

  1. https://docs.google.com/document/d/1UYOUd0YomS6NUitG9Ko0gqzYapn6eqhFuy_5F3NKVxg/edit#heading=h.mdfygy3ywxxh
  2. https://docs.google.com/document/d/1DZL1L0GccLvHbMJyop62cbaSvu1tkJ6Pp1Fp6FsR09U/edit#heading=h.58lkrsg45cf2
  3. https://issues.apache.org/jira/projects/IOTDB/issues/IOTDB-519?filter=allopenissues&orderby=cf%5B12310310%5D+ASC%2C+priority+DESC%2C+updated+DESC
  4. https://prometheus.io/docs/prometheus/latest/storage/
  5. https://songjiayang.gitbooks.io/prometheus/content/exporter/text.html
  6. https://www.taosdata.com/cn/documentation/insert/#Prometheus%E7%9B%B4%E6%8E%A5%E5%86%99%E5%85%A5