作为时序数据库,最基础的功能之一是设置数据的有效时间—— TTL(Time-to-Live)。相较于其他时序数据库, GreptimeDB 支持更为灵活的数据过期策略:
数据库级别的 TTL
表级别的 TTL
两者都可以通过 CREATE
SQL 语句结合 WITH
指定 ttl
选项来设置,并且都可以分别修改,近期发布的最新版本 v0.10 支持了 TTL 的动态修改。
Prometheus Remote Write 为例
指定数据库 TTL
举例来说,通过 Prometheus Remote Write 协议写入 GreptimeDB,你可以创建一个单独的数据库,并指定它的数据有效时间:
CREATE DATABASE prometheus WITH (ttl='7d');
这里创建了一个名为 prometheus
的数据库,并且设置它的数据有效时间为 7 天。
数据库是 GreptimeDB 租户隔离的基本单元。
TTL 是一个时间范围字符串,支持的后缀包括:
nsec
,ns
– 纳秒usec
,us
– 微秒msec
,ms
– 毫秒seconds
,second
,sec
,s
– 秒minutes
,minute
,min
,m
– 分钟hours
,hour
,hr
,h
– 小时days
,day
,d
– 天weeks
,week
,w
– 周months
,month
,M
– 月years
,year
,y
– 年
用户还可以组合,例如 "1hour 12min 5s"
表示 1 小时 12 分钟 5 秒。
接下来,在 prometheus.yml
里面的 remote write 部分指定这个数据库即可:
remote_write:
- url: http://localhost:4000/v1/prometheus/write?db=prometheus
其中 URL 中的 db
参数指定写入的数据库,正确设置后,Prometheus 写入的每个指标(measurement)都将自动创建一张表(可阅读文档了解数据模型),并且这张表的默认 TTL 就是数据库 prometheus
的 TTL 时间,也就是 7 天。
我们可以通过 SQL 查看数据库和表的 TTL:
mysql> SHOW CREATE DATABASE prometheus;
+------------+------------------------------------------------------------------+
| Database | Create Database |
+------------+------------------------------------------------------------------+
| prometheus | CREATE DATABASE IF NOT EXISTS prometheus
WITH(
ttl = '7days'
) |
+------------+------------------------------------------------------------------+
1 row in set (0.01 sec)
我们查看经典的 up
表的创建语句:
mysql> use prometheus;
Database changed
mysql> SHOW CREATE TABLE up;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| up | CREATE TABLE IF NOT EXISTS `up` (
`greptime_timestamp` TIMESTAMP(3) NOT NULL,
`greptime_value` DOUBLE NULL,
`instance` STRING NULL,
`job` STRING NULL,
TIME INDEX (`greptime_timestamp`),
PRIMARY KEY (`instance`, `job`)
)
ENGINE=metric
WITH(
on_physical_table = 'greptime_physical_table',
ttl = '7days'
) |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
可以看到这是一张 Metric 逻辑表,并且 TTL 为 7days
,跟数据库一样。Metric 引擎是 GreptimeDB 为可观测场景下的海量指标数据设计的专用存储引擎,更多介绍请阅读这篇文章。
TTL 是一个最低有效时间,也就是数据的真正过期失效通常会大于等于这个时间。
修改数据库 TTL
如果你想修改数据库的 TTL,你可以通过 ALTER
语句:
ALTER DATABASE prometheus SET ttl='1month';
成功修改后,查看数据库和表都将生效:
mysql> SHOW FULL DATABASES LIKE 'prometheus';
+------------+--------------+
| Database | Options |
+------------+--------------+
| prometheus | ttl='1month' |
+------------+--------------+
mysql> SHOW CREATE TABLE 'up';
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| up | CREATE TABLE IF NOT EXISTS `up` (
`greptime_timestamp` TIMESTAMP(3) NOT NULL,
`greptime_value` DOUBLE NULL,
`instance` STRING NULL,
`job` STRING NULL,
TIME INDEX (`greptime_timestamp`),
PRIMARY KEY (`instance`, `job`)
)
ENGINE=metric
WITH(
on_physical_table = 'greptime_physical_table',
ttl = '1month'
) |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
对于创建的表,如果没有明确指定 ttl
,都将默认使用数据库级别的 ttl
,并且只要数据库改变 ttl
后,所有它内部的表在没有指定 ttl
情况下都将随之而变。
指定和修改表的 TTL
创建表的时候,类似创建数据库那样,可以设置表级别的 ttl
:
CREATE TABLE test (d double, ts TIMESTAMP TIME INDEX) WITH (ttl = '1year');
修改已经存在表的 TTL,也同样通过 ALTER
语句:
ALTER TABLE test SET ttl='2years';
查看生效:
mysql> SHOW CREATE TABLE test;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------+
| test | CREATE TABLE IF NOT EXISTS `test` (
`d` DOUBLE NULL,
`ts` TIMESTAMP(3) NOT NULL,
TIME INDEX (`ts`)
)
ENGINE=mito
WITH(
ttl = '2years'
) |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
当前版本还不支持 Metric 物理表的 TTL 修改(Metric 逻辑表底层是共用物理表,所以逻辑表是无法单独修改的),我们将在下一个版本上线,敬请期待!感兴趣可以关注这个 issue。
总结
GreptimeDB 为时序数据的有效期管理提供了最大的灵活性,可以为单个数据库指定一个全局的 TTL,也可以为每张表指定单独的 TTL。随着 GreptimeDB 的迭代,我们还将继续为 Prometheus 和日志场景下自动建表提供更大的数据有效期管理。
彩蛋:如何在写入的时候为自动创建表指定 TTL
除了提前创建一个指定了 TTL 的数据库之外,通过 gRPC 自动建表场景下,你还可以通过 HTTP 头 x-greptime-hint-ttl
来指定,比如 x-greptime-hint-ttl :7d
可以指定写入的时候自动创建的表的 TTL 为 7 天。
我们以 Java Ingester 为例:
CompletableFuture<Result<WriteOk, Err>> puts =
greptimeDB.writeObjects(
metrics,
Context.withHint("ttl", "7d")
);
写入的时候,创建一个 Context
指定 ttl
即可。
关于 Greptime
Greptime 格睿科技专注于为可观测、物联网及车联网等领域提供实时、高效的数据存储和分析服务,帮助客户挖掘数据的深层价值。目前基于云原生的时序数据库 GreptimeDB 已经衍生出多款适合不同用户的解决方案,更多信息或 demo 展示请联系下方小助手(微信号:greptime)。
欢迎对开源感兴趣的朋友们参与贡献和讨论,从带有 good first issue 标签的 issue 开始你的开源之旅吧~期待在开源社群里遇见你!添加小助手微信即可加入“技术交流群”与志同道合的朋友们面对面交流哦~
Star us on GitHub Now: https://github.com/GreptimeTeam/greptimedb
Twitter: https://twitter.com/Greptime
Slack: https://greptime.com/slack