华为云gaussdb(for influx)揭秘第七期:最佳实践之数据建模-星辰平台

发表于 2022/04/25 16:32:18 2022/04/25
【摘要】 华为云gaussdb(for influx)数据建模的最佳方法
华为云gaussdb(for influx)时序数据库面向工业物联网海量时序数据场景提供数据安全、高性能、低存储成本、免运维等能力,受到越来越多企业的关注;同时,即开即用、使用简单、类sql查询语句、无需设计schema、适合业务快速迭代等特点,也越来越得到开发者的认可。

但是随着业务规模不断增加,也会遇到诸如时间线暴涨、查询时延高、tag和field同名导致查询数据时有时无等问题,其根本原因是,在使用过程中没有良好的数据模型设计。本期将从gaussdb(for influx)数据模型谈起,分享gaussdb(for influx)数据建模的最佳方法,避免一些使用过程中的常见问题。

01 数据模型与关键概念

  • database

与mysql中database概念相同。

创建命令:create database “mydb”。

用户权限、数据保留策略都以database为粒度设置。比如赋予用户对“mydb”数据库只读权限:grant read on mydb to username。

  • measurement

与mysql中table概念类似。所不同的是,gaussdb(for influx)属于schemaless,measurement不需要提前创建,也不需要设计表中的字段和类型。写入数据时自动创建measurement,字段可以任意新增和减少,但要求相同字段的数据类型必须一致。

  • retention policy(rp)

数据保留策略,是关系型数据库中不存在的概念,专为时序场景设计,意为指定数据在数据库中的最长保存时间,过期数据会自动被清理。

  • tag

数据源标识,只支持string类型

  • field

采集指标,支持string,float,int,bool类型

  • line protocol(数据模型)

如图所示,写数据到gaussdb(for influx),单条数据由measurement、tag_key、tag_value、field_key、field_value、timestamp 6部分组成。可以1个或多个,可以1个或多个,每条数据必须要携带时间戳。 
  • point(点)

point通常包含measurement tags field timestamp 4个部分。例如,如下数据包含2个point。

point1:

point2:

即,一条数据包含多少field key,则可以简单认为存在多少point。在gaussdb(for influx)中,可以一条数据包含一个point,也可以包含多个point。

  • series(时间线)

在gaussdb(for influx)里,我们将一个指标 一组tag组合称为一条时间线。在一条时间线下面,连续时间点的采样数据则为时序数据。比如有数据:

monitorinfo,area=”葡萄花”,device=”钻机a”,pressure=1.8,1650443961100400200
monitorinfo,area=”葡萄花”,device=”钻机b”,pressure=1.6,1650443961100400200
monitorinfo,area=”榆树林”,device=”钻机b”,pressure=1.7,1650443961100400200
monitorinfo,area=”榆树林”,device=”钻机a”,pressure=1.5,1650443961100400200

表示4条时间线,分别是:

葡萄花油田的钻机a上的压力传感器(pressure)

葡萄花油田的钻机b上的压力传感器(pressure)

榆树林油田的钻机b上的压力传感器(pressure)

榆树林油田的钻机a上的压力传感器(pressure)

02 数据建模之最佳实践

通常,数据建模是为了让查询更简单、更高效。对于大多数使用情形,我们建议使用以下设计准则:

1、合理设计tag 和field

  • tag只支持字符串类型,数值和布尔类型数据应该被设计为field;

  • 将常用查询条件和分组条件设计为tag;

    因为tag会创建索引,而field则没有索引。比如在业务中,经常会查询某一台机器的平均cpu利用率:

select mean(cpu)
from monitor
where host=“192.168.1.1” and time > now() – 1h

或者查询风电场每台风力发电机每小时的平均发电量:

select mean(elect)
from monitor
where farm_id=“737f738a-bd63” and time > now() – 24h
group by time(1h),device_id

则应该将上述查询语句中的 host、farm_id、device_id 设置为tag,前提是字符串类型才能被设为tag。

  • time属于内置关键字,不能作为tag_key和field_key;
  • 使用influxql函数(max、min、count等)的字段,作为field存储。
2、 遵守tag_key 和field_key的命名约定
  • 不使用保留关键字作为tag和field的key(名称);
  • tag和field不使用相同名称,否则会出现不可预料的问题;
  • tag和field名称尽量简短清晰,可以节约index内存空间,同时会让查询更加高效;
  • 避免一个tag中包含多层意思,比如machine = “192.168.2.1-ubuntu”,包含ip地址和操作系统名称,建议拆分为两个tag:host和os;
  • 建议将变化小的数据设置为tag,比如进程名称可以设为tag,而进程号则建议设置为field。

3、避免超过节点规格所能承受的时间线数量

gaussdb(for influx)规格与时间线数量对应关系如下:

时间线过度超过限制,会引起性能急剧下降,可能会影响业务运行,需要考虑对节点扩容。

4、避免一张表中存在过多tag或者 field
建议一张表存放同一类业务数据,比如物流车辆监测数据。过多业务数据放置到同一张表,会造成tag和field数量激增,直接影响查询效率。field太多时,每个field的计算都会单独计算,当执行模糊查询时可能会导致查询超时。

5、避免同一个retention policy存储多用户数据
不同业务数据的过期时间不尽相同,应根据业务具体需求分别存储在不同的rp中,否则过期数据不能及时删除,依然占据存储空间,增加了数据存储成本,影响了查询效率。

6、避免同一个database存储多用户数据
由于当前gaussdb(for influx)的权限控制粒度是db级别,同一个database保存多用户数据,容易导致数据被其他用户访问和修改。建议不同用户使用单独database,并且只对单一用户授予访问权限。

03 总结

在制造、能源、农业、电力等工业物联网行业中,大部分数字化信息系统是构建在mysql等关系型数据库基础上。但随着企业业务和规模的进一步扩大,数据量迅速增长,mysql等关系型数据库面临并发数、存储成本、查询性能、扩展性、维护等诸多问题,正逐渐被时序数据库所替代。

gaussdb(for influx)摒弃关系型数据库范式化繁复的设计规则,支持schemaless设计,业务能按照简单、高效的方式建模。面对业务变化快、接入设备多样化严重的工业物联网场景,gaussdb(for influx)数据建模表现更加灵活,无需更改业务即可兼容不同设备,更适用于工业物联网场景。

04 结束

本文作者:华为云数据库创新lab & 华为云时空数据库团队
欢迎加入星辰平台!
云数据库创新lab(成都、北京)简历投递邮箱:[email protected]
华为云时空数据库团队(西安、深圳)简历投递邮箱:[email protected]
【星辰平台的版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。