InfluxDB学习笔记
InfluxDB学习笔记
InfluxDB时序数据库
时序数据库模型
temperature相当于关系型数据库的表名
后面是保持key-value的属性
空格分开后面是真正的值与时间戳(最高精度到纳秒)
它是一种支持多值模型的数据库
- 时间点(point)
- 时间线 = measurement + tag set组合(不包含filed set)
- 时间线数量(cardinality)
- [measurement + tag set + field key]组合的数量
- 计算 : Tag-Value取值的乘积*measurement数量
- 实际场景,Tag Value取值的依赖性!
数据保留策略(Retention policies)
- 什么是保留策略
- 数据保留时间(最短为1小时)
- 分片(shard)时长
- 定义在database空间下
- 数据清理以分片为单位
- 分片中的所有数据过期才会删除
- autogen默认保留策略
- 无限制保留
- 七天(1 week)一个分片
- 系统默认分片时长取决于数据保留时间
- 保留时时间 < 2天 : 1小时
- 保留时间2天到6个月 : 1天
- 保留时间7个月以上 : 7天
笔记:数据与分片的时间策略是不同的
保留策略的管理
- 创建
CREATE RETENTION POLICY <retention_policy_name> on
<database_name> DURATION <date_duration>REPLICARION<n> [SHARD DURATION <shard_duration>] [DEFAULT]
注解:retention_policy_name指定一个名字存在哪个database_name库上,duration存多长时间,DEFAULT是指定策略为默认库的策略,REPLICARION是它的企业版所具有的,开源版无需指定。
- 更改
ALTER RETENTION POLICY <retention_policy_name> on
<database_name> DURATION <date_duration>REPLICARION<n> [SHARD DURATION <shard_duration>] [DEFAULT] - 删除(物理删除所有数据!)
DROP RETENTION POLICY <retention_policy_name> on
<database_name>
保留策略的选择
- 数据保留多久
- 数据成本 $$$
- 过期数据处理
- 丢弃
- 降采样(down-sampling)
- 分片时长的选择
- 长分片
- 短时段查询处理的数据量会放大
- 整体性能可能较好:数据冗余少,压缩率更高等
- 短分片
- 灵活、易管理,删除分片,增量备份
- 更多的分片,索引和元数据的存储和管理
- 长分片
- 来自InfluxData的建议
- 分片时长:最长典型查询时间范围的两倍
- 单个分片的数据量不要过少(>10万),也不要过多
- 分片中单个时间线的数据量 > 1k
- backfilling(填充历史数据):选择长分片
Schema设计
- tagk/tagv简短
- tag还是field?
- tag有索引而field没有
- tag是字符串,field支持int、float等数据类型
- field类型在不同分片上可以不同(尽量避免)
- 数值类型使用i后缀为整型,默认float
- 选择使用tag如果
- 经常查询的元数据
- 需要 GroupBy
- 选择使用field如果
- 用于函数计算
- 非字符串
- 避免使用InfluxDB的关键字作为tag/field/measurement
- 避免时间线膨胀(影响内存使用的最重要因素)
- 不要在measurement名称中嵌数据:使用tag
cpu.server-6.us.west value=4 144234982000000000(错误示例)
cpu,host=server-6,region=us.west value=4 144234982000000000 - tag拆分
cpu,server=localhost.us-east value=3 144234982000000000
cpu,server=localhost,region=us-east value=3 144234982000000000
InfluxQL查询语句
语法:
select_stmt = “SELECT” fields from_clause [into_clause] [where_clause] [group_by_clause] [order_by_clause] [limit_clause] [offset_clause] [slimit_clause] [soffset_clause] [timezone_clause]
- SELECT_clause FROM (SELECT_statement) […]
- FROM measurement
- INTO user-specified measurement
- WHERE filters
fields
tags
and/or timestamps - GROUP BY groups query result by
user-specified set of tags
time interval - ORDER by time DESC(默认升序)
查询优化
- 查询指定时间范围,利用数据分片减少数据访问量
- 使用WHERE条件限制时间线
- 尽量避免SELECT *
- 使用子查询,突破InfluxQL语法的限制
- 函数嵌套,仅部分函数支持嵌套,COUNT(DISTINCT())
- 二次过滤
- 查询阿里云文档TSDB for InfluxDB文档