时间序列数据库 Influxdb 入门
以下内容基于influxdb 1.3
influxdb 有一套自己的查询语法,和sql很像,1
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
1 | insert cpu1,host=1,test=11 value=3,a=1 1500986114 |
基本概念
- measurement: 类似于SQL中的表
- field: 包含field-key/field-value, 类似于sql的字段/值,用来存储真正的数据项。在influxdb中,field是不被索引的,查询使用filed进行过滤会遍历全部数据来查询,效率不高。
- tag: 包含 tag-key/tag-value,和field相反,tag在influxdb中是被索引的。
- fields-set: 由多个field-key=field-value组成的field集合
- tag-set: 由多个tag-key=tag-value组成的tag集合
- point: 由一个timestamp所产生的数据的集合。可以看作是sql数据库的一个doc。
- Continuous Query(cq): 持续查询机制,一个influxdb会自动的周期性执行的查询语句。这个机制可将查询计算的结果,存入新的 measurement。
若原始数据是每秒写入,但是查询前一天的数据使用者并不关心每秒这么小的维度,使用这种机制将维度小的数据汇总成维度大一点的数据,
而在使用时不需要查询所有相关原始数据进行计算。 - Retention Policy(rp): 保留策略,时间序列数据的一大特征就是结构简单且数据量大,influxdb提供了一种机制用于历史数据的处理,按照指定的逻辑自动清理过期数据。
- series:由measurement, tag-set, rp 都相同的数据组成的一组数据。
RP 机制
创建RP: CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [DEFAULT]
修改RP: ALTER RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> SHARD DURATION <duration> DEFAULT
删除RP: DROP RETENTION POLICY <retention_policy_name> ON <database_name>
CQ 机制
创建cq:1
CREATE CONTINUOUS QUERY <cq_name> ON <database_name>
RESAMPLE EVERY interval FOR interval
BEGIN
SELECT <function[s]> INTO <destination_measurement> FROM <measurement> [WHERE <stuff>] GROUP BY time(<interval>)[,<tag_key[s]>]
END
这里有几点需要注意,destination_measurement可设置为其他db的measurement。cq不能修改,只能删除重建。
EVERY FOR TIME 的几种情况
- every(30m) time(1h):每30分钟resample一次以1h为间隔的数据。如8:30时计算8:00-9:00的数据,9:00时在计算一次8:00-9:00的数据
- for(1h) time(30m):每一个小时resample一次以30m为间隔的时间。如8:00计算7:00-8:00,以30m间隔的数据,得到2条结果,8:30时计算7:30-8:30的数据,以30m间隔的数据,得到2条结果。
- every(1h) for(90m) time(30m):每小时计算一次,以30m为间隔,倒推90m的数据,所以会获取3条结果
联合使用 CQ RP 机制很好的解决了时间序列数据,数据量大,容易迅速对数据库存储造成压力的问题。很多监控数据在使用时,随着时间的变化,对很久之前的数据的精度要求不高,只需要有一些数据能够将趋势反应出来,在这种场景下,CQ RP机制就很合适。另外,数据在使用时,时常会有一些复杂需求需要对大量的数据进行复杂的计算,通过CQ机制将这部分数据预处理,得出结果之后存储,使用时直接查询获取,不需要复杂计算,大大提高数据的可用性。