Skip to content
On this page
技术
2024-12-5

GreptimeDB v0.10 新功能详解#1 — 灵活设置数据 TTL

上周发布的最新版本中,GreptimeDB 支持了灵活设置数据 TTL,本文说明了如何通过 Prometheus Remote Write 协议创建带 TTL 的数据库和表,并举例展示了 TTL 的创建、修改及其生效过程。

作为时序数据库,最基础的功能之一是设置数据的有效时间—— TTL(Time-to-Live)。相较于其他时序数据库, GreptimeDB 支持更为灵活的数据过期策略:

  • 数据库级别的 TTL

  • 表级别的 TTL

两者都可以通过 CREATE SQL 语句结合 WITH 指定 ttl 选项来设置,并且都可以分别修改,近期发布的最新版本 v0.10 支持了 TTL 的动态修改。

Prometheus Remote Write 为例

指定数据库 TTL

举例来说,通过 Prometheus Remote Write 协议写入 GreptimeDB,你可以创建一个单独的数据库,并指定它的数据有效时间:

sql
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 部分指定这个数据库即可:

yaml
remote_write:
- url: http://localhost:4000/v1/prometheus/write?db=prometheus

其中 URL 中的 db 参数指定写入的数据库,正确设置后,Prometheus 写入的每个指标(measurement)都将自动创建一张表(可阅读文档了解数据模型),并且这张表的默认 TTL 就是数据库 prometheus 的 TTL 时间,也就是 7 天。

我们可以通过 SQL 查看数据库和表的 TTL:

sql
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 表的创建语句:

sql
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 语句:

sql
ALTER DATABASE prometheus SET ttl='1month';

成功修改后,查看数据库和表都将生效:

sql
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:

sql
CREATE TABLE test (d double, ts TIMESTAMP TIME INDEX) WITH (ttl = '1year');

修改已经存在表的 TTL,也同样通过 ALTER 语句:

sql
ALTER TABLE test SET ttl='2years';

查看生效:

sql
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 为例:

java
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

官网:https://greptime.cn/

文档:https://docs.greptime.cn/

Twitter: https://twitter.com/Greptime

Slack: https://greptime.com/slack

LinkedIn: https://www.linkedin.com/company/greptime/

加入我们的社区

获取 Greptime 最新更新,并与其他用户讨论。