暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

GreptimeDB 2024-12-06
178

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

  • 数据库级别的 TTL

  • 表级别的 TTL

两者都可以通过 CREATE
SQL 语句[1]结合 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)都将自动创建一张表(可阅读文档[2]了解数据模型),并且这张表的默认 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(3NOT 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 为可观测场景下的海量指标数据设计的专用存储引擎,更多介绍请阅读这篇文章[3]。

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(3NOT 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 INDEXWITH (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(3NOT NULL,
  TIME INDEX (`ts`)
)

ENGINE=mito
WITH(
  ttl = '2years'
) |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

当前版本还不支持 Metric 物理表的 TTL 修改(Metric 逻辑表底层是共用物理表,所以逻辑表是无法单独修改的),我们将在下一个版本上线,敬请期待!感兴趣可以关注这个 issue[4]。

总结

GreptimeDB 为时序数据的有效期管理提供了最大的灵活性,可以为单个数据库指定一个全局的 TTL,也可以为每张表指定单独的 TTL。随着 GreptimeDB 的迭代,我们还将继续为 Prometheus 和日志场景下自动建表提供更方便的数据有效期管理。

彩蛋:如何在写入的时候为自动创建表指定 TTL

除了提前创建一个指定了 TTL 的数据库之外,通过 gRPC 自动建表场景下,你还可以通过 HTTP 头 x-greptime-hint-ttl
来指定,比如 x-greptime-hint-ttl :7d
可以指定写入的时候自动创建的表的 TTL 为 7 天。

我们以 Java Ingester[5] 为例:

CompletableFuture<Result<WriteOk, Err>> puts = 
    greptimeDB.writeObjects(
        metrics, 
        Context.withHint("ttl""7d")
    );

写入的时候,创建一个 Conext
指定 ttl
即可。

Reference

[1] https://docs.greptime.com/reference/sql/create/

[2] https://docs.greptime.com/v0.6/user-guide/write-data/prometheus/#prometheus-metrics-in-greptimedb

[3] https://docs.greptime.com/zh/contributor-guide/datanode/metric-engine/

[4] https://github.com/GreptimeTeam/greptimedb/issues/5042

[5] https://github.com/GreptimeTeam/greptimedb-ingester-java

关于 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/

往期精彩文章:

点击「阅读原文」,立即体验 GreptimeDB!

文章转载自GreptimeDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论