文章目录
- 前言
- 查看数据库retention policy
- retention policy管理
- 创建retention policy
- 修改retention policy
- 删除retention policy
- 写数据指定retention policy
- 查数据指定retention policy
- series=measurement +tags set+retention policy
- 总结
前言
对于传统关系型数据库,增删改查应该是必备且常用的功能,而influxdb
常用的只有insert
和select
,没有提供update
语法,虽然有delete
可以删除数据(delete
语法和mysql
相似),但是需求不大。
因为存储的数据都是跟时间有关的测量数值,多用于图表展示,不太需要人为的去删除,而有时统计的数据是秒级,甚至毫秒级、纳秒级的,势必造成数据量巨大。如果一直长久存储会占用机器大量资源,而且有些数据越旧越失去它的时效性,越没有参考价值,所以保留策略retention policy
就是可以让数据存储一段时间后自动清除。
查看数据库retention policy
retention policy
是数据库级别的属性,也是数据结构的一部分。一个database可以有多个保留策略retention policy
,但是只能有一个默认retention policy
。
show retention policies
# 当没有切换使用哪个数据库时,
# 可 on 指定查看哪个数据库的保留策略
show retention policies on databaseName
一个数据库新建都会分配一个默认的保留策略:
-
name
,保留策略的名称。 -
duration
,数据保留的持续时长,最小为1h
(retention policy duration must be at least 1h0m0s
)。如果设置为0,数据永久保存(官方默认RP),否则过期清理。 -
shardGroupDuration
,数据存储在shardGroup
的时间跨度。shardGroup
是influxdb
的一个逻辑存储结构,其下包含多个shard
。 -
replicaN
,全称replication,复制因子,它决定在集群中存储多少个数据副本。inflxudb集群中跨N个数据节点复制数据,其中N就是复制因子。复制因子对单个节点实例不起作用,所以单机版直接设置为1即可。 -
default
,true为默认保留策略。
shardGroupDuration
是根据retention policy
的duration
计算得来,不过也可以在创建retention policy
指定。如下是retention policy's duration
和shardGroupDuration
的计算关系:
retention policy’s duration | shardGroupDuration |
< 2 days | 1 h |
>= 2 days and <= 6 months | 1 day |
> 6 months | 7 days |
retention policy管理
创建retention policy
基本语法:
CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [DEFAULT]
-
retention_policy_name
: 策略名。 -
database_name
: 数据库名(db必须存在)。 -
duration
: 数据保留时长。 -
REPLICATION
: 复制因子,单机版设置为1即可。 -
SHARD DURATION
:设置shardGroupDuration
时长,表示每个shard group
时间跨度时长。可不填,默认根据RP的duration计算。 -
default
: true为设置该RP为默认RP。
示例:
# 为monitor库创建一个数据保留时长30天的rp,同时设置shard duration为1d,副本为1,并设置为默认rp
create retention policy rp_30_days on monitor duration 30d replication 1 shard duration 1d default
# 为monitor库创建一个数据保留时长一个星期的rp,副本为1
create retention policy rp_one_week on monitor duration 1w replication 1
修改retention policy
基本语法:
ALTER RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration>] [DEFAULT]
ALTER可修改的部分有duration、replication、shard duration、default,修改时无需每个属性都写上,可修改哪个写哪个。
示例:
# 修改rp_1_week 保留数据时长为15days
alter retention policy rp_1_week on monitor duration 15d replication 1 default
# 设置rp_30_days为默认rp
alter retention policy rp_30_days on monitor default
设置某个RP
为默认RP
时,旧默认RP
会自动改为非默认RP
。
retention policy
不能修改RP名称,如果自主命名的RP名称和修改后的duration
不匹配,还不如把旧RP删除,新建一个RP。
删除retention policy
基本语法:
DROP RETENTION POLICY <retention_policy_name> ON <database_name>
示例:
# 删除名为rp_1_week的rp
drop retention policy rp_1_week on monitor
注:duration
和shard duration
取值,1h
(1小时)、1d
(1天)、1w
(1周)。
写数据指定retention policy
当一个数据库有多个retention policy
,写数据时,如不想默认RP
,可指定其他RP
。如,monitor库有两个RP
,一个是默认RP
保留数据30天,一个保留数据3天,现写入数据指定RP为3天那个。
# 在没有use 哪个db的时候需要指定db,选择monitor数据库,指定rp为rp_3_days写入数据到service_qps
insert into monitor.rp_3_days service_qps,svrName=TaskSvr,hostName=dev4 qps=12.9
# 切换选择monitor
use monitor
# 并指定rp为rp_3_days写入数据到service_qps
insert into rp_3_days service_qps,svrName=TaskSvr,hostName=dev4 qps=12.9
写数据指定数据库或者RP时,需要使用insert into
。默认db和默认RP写数据使用insert
。
查数据指定retention policy
既然写数据时指定了非默认RP,查数据时也必须指定RP。
# 默认指定默认RP
select * from service_qps
# 指定RP查询
select * from rp_3_days.service_qps
指定RP查询需要注意:因为select语法是select * from RP.MEASUREMENT
,所以千万不要使用如下语句写数据:
# 完全错误的写法
insert rp_3_days.service_qps,svrName=TaskSvr,hostName=dev4 qps=12.9
使用insert
写数据时,以为指定了RP
,实则是写数据到名为rp_3_days.service_qps
的measurement
中,当想查measurement
名为rp_3_days.service_qps
数据时会和RP为rp_3_days
,measurement
为service_qps
产生语法冲突。
series=measurement +tags set+retention policy
series
是measurement
+tags set
+ retention policy
组成的数据集合。同个 database
中,retention policy
、measurement
、tags set
完全相同的数据同属于一个 series
,同个series
的数据在物理上会按照时间顺序排列存储在一起。series
的key
为measurement
+ 所有 tags
组成的字符串。
show series
无法区分查看到不同RP
,相同measurement
和tag set
的series
。经测试 show series from
后无法区分RP,即使加了RP也没用(RP.MEASUREMENT
)。
所以并没有办法显而易见知道一个measurement
到底指定了哪些retention policy
。
总结
- 虽然有删除语法
delete
,但是平时不太需要人工手动删数据,而是设置合适的retention policy
,过期自动清理数据。 - 写数据指定RP需要使用
insert into
语法,即insert into RP MEASUREMENT,tag1=xxx field1=12.0
。 -
select * from xxx
默认查询的是默认RP
的数据,需指定RP
,即select * from RP.MEASUREMENT
。 -
series
是measurement
+tags set
+ retention policy
组成的数据集合,其key为measurement
+ 所有 tags
的组成的字符串,show series
无法得知measurement
指定RP
的情况。
PS: 如若文章中有错误理解,欢迎批评指正,同时非常期待你的评论、点赞和收藏。我是徐同学,愿与你共同进步!
参考:
- retention policy 保存策略
- https://docs.influxdata.com/influxdb/v1.7/concepts/glossary/#series