数据模型
模型
GreptimeDB 的统一可观测数据模型以关系表为基础,并增加时间索引以及 Tag、Timestamp、Field 三类列语义。Metrics、logs、traces 和事件数据共用这套模型,同时保存在针对各自 workload 设计的不同表中。
每张表都有表名和唯一的时间索引。各类列的含义如下:
Tag列参与主键,用来组织相关的数据行。在 metrics 表中,Tag 通常对应标识时间序列的 labels。Tag 不是必选项,append-only 日志表和事件表可以没有主键列。Timestamp列通过TIME INDEX声明为时间索引,用来记录事件或采样时间。GreptimeDB 据此按时间组织数据,并优化时间范围查询。Field列保存测量值、日志内容、trace 属性或其他数据,可以使用数值、字符串、JSON、时间戳等 GreptimeDB 支持的数据类型。
对于有主键的表,持久化数据按 (primary key, timestamp) 排序。主键和时间戳相同的数据如何合并,由 merge mode决定。Append-only 表关闭去重;如果表没有主键,持久化数据按时间戳排序。GreptimeDB 将表数据存为不可变的 Parquet SST 文件,详见 SST 文件中的数据布局。
Schema 会影响写放大、压缩率、索引大小和查询裁剪效果。选择主键和索引前,请阅读表设计指南。
Metrics
下面的表用于保存主机资源指标:
CREATE TABLE IF NOT EXISTS system_metrics (
host STRING,
idc STRING,
cpu_util DOUBLE,
memory_util DOUBLE,
disk_util DOUBLE,
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY(host, idc),
TIME INDEX(ts)
);
host和idc是通过PRIMARY KEY声明的 Tag 列。ts是通过TIME INDEX声明的 Timestamp 列。cpu_util、memory_util、disk_util是 Field 列。- 使用默认的
last_rowmerge mode时,查询会为每组相同的host、idc、ts保留最后写入的一行。
Prometheus metrics 与 GreptimeDB 表的映射方式,参见 Prometheus 数据模型。
Logs
Web Server 访问日志通常适合使用 append-only 表:
CREATE TABLE access_logs (
access_time TIMESTAMP TIME INDEX,
remote_addr STRING,
http_status STRING,
http_method STRING,
http_refer STRING,
user_agent STRING,
request STRING
) WITH ('append_mode' = 'true');
access_time是 Timestamp 列。- 表没有 Tag 列或主键。
- 其余列都是 Field。
append_mode会关闭去重和删除,适合不可变的日志记录,不适合需要更新或删除数据行的 workload。- 表没有主键,持久化数据按
access_time排序。
列语义和表选项的语法参见建表和 CREATE TABLE 参考。
Traces
GreptimeDB 通过 OTLP/HTTP 接收 OpenTelemetry traces,并将 spans 映射到包含时间索引、trace 标识、span 标识、属性和耗时字段的表中。详见 OTLP Trace 数据模型。
Trace 写入、存储和 SQL 查询都是一等能力。GreptimeDB 还提供 Jaeger 兼容查询接口。
设计考虑
采用表模型有几个直接收益:
- schema 向存储和查询引擎提供类型与列语义;
- SQL 可以跨表过滤、聚合和关联数据;
- 一行可以包含多个 Field,避免单值模型把同一采样拆成多行;
- 每张表可以独立选择主键、merge mode、append-only 模式、索引、TTL 和存储后端;
- 支持的写入协议可以通过自动建表创建表和列;
- metrics、logs、traces 和宽事件采用共同的 Tag、Timestamp、Field 概念,但不要求写入同一张表。
GreptimeDB 使用 SQL 管理表 schema,详见表管理和自动生成表结构。
表还可以携带可选的表语义层,向机器消费者说明信号身份和写入元数据。Observability 2.0 与宽事件介绍了在这套模型中保留更多上下文的一种可选做法。