前言
对于传统关系型数据库,增删改查应该是必备且常用的功能,而influxdb
常用的只有insert
和select
,没有提供update
语法,虽然有delete
可以删除数据(delete
语法和mysql
相似),但是需求不大。
因为存储的数据都是跟时间有关的测量数值,多用于图表展示,不太需要人为的去删除,而有时统计的数据是秒级,甚至毫秒级、纳秒级的,势必造成数据量巨大。如果一直长久存储会占用机器大量资源,而且有些数据越旧越失去它的时效性,越没有参考价值,所以保留策略retention policy
就是可以让数据存储一段时间后自动清除。
查看数据库 RETENTION POLICY
retention policy
是数据库级别的属性,一个 database 可以有多个保留策略retention policy
,但是只能有一个默认retention policy
。
<code class="prism language-bash has-numbering">show retention policies <span class="token comment"># 当没有切换使用哪个数据库时,</span> <span class="token comment"># 可 on 指定查看哪个数据库的<a href="https://www.lushuiwan.com/tag/%e4%bf%9d%e7%95%99%e7%ad%96%e7%95%a5" title="查看更多关于保留策略的文章" target="_blank">保留策略</a></span> show retention policies on databaseName </code>
一个数据库新建都会分配一个默认的保留策略:
name
,保留策略的名称。duration
,数据保留的持续时长,最小为1h
(retention policy duration must be at least 1h0m0s
)。如果设置为 0,数据永久保存(官方默认 RP),否则过期清理。shardGroupDuration
,数据存储在shardGroup
的时间跨度。shardGroup
是influxdb
的一个逻辑存储结构,其下包含多个shard
。replicaN
,全称 replication,副本个数,指数据有多少个独立的备份存在,一般设置 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
基本语法:
<code class="prism language-sql has-numbering"><span class="token keyword">CREATE</span> <a href="https://www.lushuiwan.com/tag/retention" title="查看更多关于 RETENTION 的文章" target="_blank">RETENTION</a> <a href="https://www.lushuiwan.com/tag/policy" title="查看更多关于 POLICY 的文章" target="_blank">POLICY</a> <span class="token operator"><</span>retention_policy_name<span class="token operator">></span> <span class="token keyword">ON</span> <span class="token operator"><</span>database_name<span class="token operator">></span> DURATION <span class="token operator"><</span>duration<span class="token operator">></span> <span class="token keyword">REPLICATION</span> <span class="token operator"><</span>n<span class="token operator">></span> <span class="token punctuation">[</span>SHARD DURATION <span class="token operator"><</span>duration<span class="token operator">></span><span class="token punctuation">]</span> <span class="token punctuation">[</span><span class="token keyword">DEFAULT</span><span class="token punctuation">]</span> </code>
- 1
retention_policy_name
: 策略名。database_name
: 数据库名(db 必须存在)。duration
: 数据保留时长。REPLICATION
: 定义每个point
保存的副本数,默认为 1。SHARD DURATION
:设置shardGroupDuration
时长,表示每个shard group
时间跨度时长。可不填,默认根据 RP 的 duration 计算。default
: true 为设置该 RP 为默认 RP。
示例:
<code class="prism language-bash has-numbering"><span class="token comment"># 为 monitor 库创建一个数据保留时长 30 天的 rp,同时设置 shard duration 为 1d,副本为 1,并设置为默认 rp</span> create retention policy rp_30_days on monitor duration 30d replication 1 shard duration 1d default <span class="token comment"># 为 monitor 库创建一个数据保留时长一个星期的 rp,副本为 1</span> create retention policy rp_one_week on monitor duration 1w replication 1 </code>
- 1
- 2
- 3
- 4
修改 RETENTION POLICY
基本语法:
<code class="prism language-sql has-numbering"><span class="token keyword">ALTER</span> <a href="https://www.lushuiwan.com/tag/retention" title="查看更多关于 RETENTION 的文章" target="_blank">RETENTION</a> <a href="https://www.lushuiwan.com/tag/policy" title="查看更多关于 POLICY 的文章" target="_blank">POLICY</a> <span class="token operator"><</span>retention_policy_name<span class="token operator">></span> <span class="token keyword">ON</span> <span class="token operator"><</span>database_name<span class="token operator">></span> DURATION <span class="token operator"><</span>duration<span class="token operator">></span> <span class="token keyword">REPLICATION</span> <span class="token operator"><</span>n<span class="token operator">></span> <span class="token punctuation">[</span>SHARD DURATION <span class="token operator"><</span>duration<span class="token operator">></span><span class="token punctuation">]</span> <span class="token punctuation">[</span><span class="token keyword">DEFAULT</span><span class="token punctuation">]</span> </code>
- 1
ALTER 可修改的部分有 duration、replication、shard duration、default,修改时无需每个属性都写上,可修改哪个写哪个。
示例:
<code class="prism language-bash has-numbering"><span class="token comment"># 修改 rp_1_week 保留数据时长为 15days </span> alter retention policy rp_1_week on monitor duration 15d replication 1 default <span class="token comment"># 设置 rp_30_days 为默认 rp</span> alter retention policy rp_30_days on monitor default </code>
- 1
- 2
- 3
- 4
设置某个RP
为默认RP
时,旧默认RP
会自动改为非默认RP
。
retention policy
不能修改 RP 名称,如果自主命名的 RP 名称和修改后的duration
不匹配,还不如把旧 RP 删除,新建一个 RP。
删除 RETENTION POLICY
基本语法:
<code class="prism language-sql has-numbering"><span class="token keyword">DROP</span> <a href="https://www.lushuiwan.com/tag/retention" title="查看更多关于 RETENTION 的文章" target="_blank">RETENTION</a> <a href="https://www.lushuiwan.com/tag/policy" title="查看更多关于 POLICY 的文章" target="_blank">POLICY</a> <span class="token operator"><</span>retention_policy_name<span class="token operator">></span> <span class="token keyword">ON</span> <span class="token operator"><</span>database_name<span class="token operator">></span> </code>
- 1
示例:
<code class="prism language-bash has-numbering"><span class="token comment"># 删除名为 rp_1_week 的 rp</span> drop retention policy rp_1_week on monitor </code>
- 1
- 2
注:duration
和shard duration
取值,1h
(1 小时)、1d
(1 天)、1w
(1 周)。
写数据指定 RETENTION POLICY
当一个数据库有多个retention policy
,写数据时,如不想默认RP
,可指定其他RP
。如,monitor 库有两个RP
,一个是默认RP
保留数据 30 天,一个保留数据 3 天,现写入数据指定 RP 为 3 天那个。
<code class="prism language-bash has-numbering"><span class="token comment"># 在没有 use 哪个 db 的时候需要指定 db,选择 monitor 数据库,指定 rp 为 rp_3_days 写入数据到 service_qps</span> insert into monitor.rp_3_days service_qps,svrName<span class="token operator">=</span>TaskSvr,hostName<span class="token operator">=</span>dev4 qps<span class="token operator">=</span>12.9 <span class="token comment"># 切换选择 monitor</span> use monitor <span class="token comment"># 并指定 rp 为 rp_3_days 写入数据到 service_qps</span> insert into rp_3_days service_qps,svrName<span class="token operator">=</span>TaskSvr,hostName<span class="token operator">=</span>dev4 qps<span class="token operator">=</span>12.9 </code>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
写数据指定数据库或者 RP 时,需要使用insert into
。默认 db 和默认 RP 写数据使用insert
。
查数据指定 RETENTION POLICY
既然写数据时指定了非默认 RP,查数据时也必须指定 RP。
<code class="prism language-bash has-numbering"><span class="token comment"># 默认指定默认 RP</span> <span class="token keyword">select</span> * from service_qps <span class="token comment"># 指定 RP 查询</span> <span class="token keyword">select</span> * from rp_3_days.service_qps </code>
- 1
- 2
- 3
- 4
指定 RP 查询需要注意:因为 select 语法是select * from RP.MEASUREMENT
,所以千万不要使用如下语句写数据:
<code class="prism language-bash has-numbering"><span class="token comment"># 完全错误的写法</span> insert rp_3_days.service_qps,svrName<span class="token operator">=</span>TaskSvr,hostName<span class="token operator">=</span>dev4 qps<span class="token operator">=</span>12.9 </code>
- 1
- 2
使用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: 如若文章中有错误理解,欢迎批评指正,同时非常期待你的评论、点赞和收藏。我是徐同学,愿与你共同进步!
参考: