文章目录
- 前言
- 查看数据库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










