在一些情况下,由于数据类型、数据量和查询模式的不同,元数据和可观察性数据(如指标和日志)可能存储在不同的数据库中。然而,这种存储分离使得两种数据关联变得困难。
举个例子,假设你有大规模的计算节点或物联网设备,可能需要完成以下任务:
- 从存储在 Postgres 中的元数据中筛选出属于特定组织的节点;
- 找出这些节点在过去一周内收集的 Prometheus 指标的平均负载。
因为涉及到两种不同类型的数据库及查询语言,且它们之间没有直接的关联渠道,上述任务的执行就会变得复杂。
解决方案:Postgres 外部数据包装器
借助 Postgres 的外部数据包装器(FDW)扩展,可以将远程的 Postgres 或兼容 Postgres 的数据库连接到服务器,并直接对来自两个服务器的数据进行查询。
两周前,我们收到了一个用户的功能请求——希望将 GreptimeDB 作为提供外部表的程序连接到 Postgres。GreptimeDB 已经支持基于 pgwire 的 Postgres 协议,因此只需添加几条 SQL 语句支持,GreptimeDB 就可以作为远程服务器连接。此外,GreptimeDB 还可以配置为 Prometheus 和 Loki 的远程写入目的地,使它们的数据能够通过 SQL 直接查询。

配置 GreptimeDB 作为 Postgres 外部数据包装器
1. 启用 postgres_fdw
扩展
CREATE EXTENSION postgres_fdw;
2. 添加 GreptimeDB 作为远程服务器并配置用户凭证
CREATE SERVER greptimedb
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'greptimedb_host', dbname 'public', port '4003');
CREATE USER MAPPING FOR postgres
SERVER greptimedb
OPTIONS (user 'greptime', password '...');
3. 使用 \des
命令在 psql
中查看远程服务器
4. 定义外部表
为了使 Postgres 可以推送筛选和排序选项,用户需要定义一个外部表,并与 GreptimeDB 中的表结构匹配:
CREATE FOREIGN TABLE ft_grpc_latencies (
ts TIMESTAMP,
host VARCHAR,
method_name VARCHAR,
latency DOUBLE precision
)
SERVER greptimedb
OPTIONS (table_name 'grpc_latencies');
5. 在这个示例中
我们定义了 ft_grpc_latencies
外部表来映射 GreptimeDB 中的 grpc_latencie
s 表。请注意,用户需要将 GreptimeDB 的数据类型转换为 Postgres 的等效类型。在 GreptimeDB 0.11.2 版本中,我们引入了一个新的 SQL 语句 SHOW CREATE TABLE <table_name> FOR postgres_foreign_table
,用于自动生成这个映射语句。
查询 Postgres 和 GreptimeDB 中的数据
一旦外部表设置完成,用户就可以像查询其他 Postgres 表一样查询 GreptimeDB 中的数据:
1. 带筛选条件的基本查询:
SELECT * FROM ft_grpc_latencies
WHERE host = 'host1'
ORDER BY ts DESC
LIMIT 100;
2. 使用 GreptimeDB 和 Postgres 都支持的函数进行数据聚合
SELECT
date_trunc('MONTH', ts) AS t,
host,
AVG(latency),
COUNT(latency)
FROM ft_grpc_latencies
GROUP BY host, t;
3. 将 Postgres 数据与外部表进行联接
SELECT *
FROM ft_grpc_latencies f
JOIN local_host_table l
ON l.host = f.host
WHERE l.host IN ('host1', 'host2')
ORDER BY f.ts DESC
LIMIT 100;
使用 GreptimeDB 作为外部数据包装器的优缺点
优点
- 可以执行与存储在 Postgres 中的数据的联接查询;
- Postgres 可以推送筛选和排序操作以提高性能;
- 可以复用 Postgres 的用户管理、权限控制和基础设施。
缺点
- 只能执行 Postgres 支持的 SQL 查询;GreptimeDB 的高级特性,如范围查询和 TQL(时间查询语言),在查询外部表时无法使用;
- 获取数据时会增加多一跳带来的额外的延迟。
结论
将 GreptimeDB 作为 Postgres 外部数据包装器使用,实则是提供了一种强大的方式将时序数据和可观察性数据与现有的关系型数据库进行集成。然而,这种配置在查询功能上存在一些限制。这种设置非常适合希望从 Postgres 环境中查询存储在 GreptimeDB 中的 Prometheus 和日志数据的用户,同时受益于 Postgres 强大的查询优化和基础设施。
我们已经为该集成创建了一个易于使用的演示。欢迎访问我们的 Demo 仓库进行试用,对 GreptimeDB 和 Postgres 的集成有任何想法或建议,欢迎随时与我们分享。
关于 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