3

(我打算在 DBA SE 上发布这个,但没有时间刻度标签。)

我正在使用 TimescaleDB 存储每秒大约 500-1000 次插入的实时流,并且需要在数据一进来就将其传递给客户端应用程序。

我不一定要处理原始毫秒数据(我可能),但我肯定需要客户端接收此实时数据的 1、5、10、30 秒(等)聚合,因为每个时间桶/槽是准备好。因此,每秒、每 5 秒、每 10 秒等(值将是每个时间段的最大值、最小值等)。

我打算使用 Postgres 的触发器来聚合数据并以瀑布类型的方式将其放入新表中,并使用监听/通知来告诉客户端每个时间块何时“准备好”,但后来我遇到了 PipelineDB。

但是,我不清楚如何设置该架构。我是否希望 PipelineDB 获取初始数据流,然后将其传递给 Timescale 超表?我是否希望 Timescale 将数据传递给 Pipeline?我认为 Pipeline 将成为客户的联络点。

性能最高的通用架构是什么?以及如何在 Timescale 和 Pipeline 之间传递数据?

4

2 回答 2

2

这当然是可能的(使用测试设置中的实际结构):

  1. 创建一个流,例如:
CREATE FOREIGN TABLE s_tracking (
    c_timestamp TIMESTAMPTZ,
    c_session BIGINT,
    c_request BIGINT,
    c_client VARCHAR,
    c_gender VARCHAR,
    c_path VARCHAR
) SERVER pipelinedb;
  1. 创建一个插入条目的触发器函数,例如:
CREATE FUNCTION func_tracking_insert_pipe() RETURNS trigger
    LANGUAGE plpgsql AS
$$BEGIN
    INSERT INTO
        t_tracking (c_timestamp, c_session, c_request, c_client, c_gender, c_path)
    VALUES
        (NEW.c_timestamp, NEW.c_session, NEW.c_request, NEW.c_client, NEW.c_gender, NEW.c_path)
    ;
    RETURN NEW;
END;$$
;
  1. 创建一个连续的变换,例如:
CREATE VIEW v_t_forward_raw_data
    WITH (action=transform, outputfunc=func_tracking_insert_pipe)
    AS
        SELECT c_timestamp, c_session, c_request, c_client, c_gender, c_path FROM s_tracking
;
  1. 插入流而不是表:
INSERT INTO s_tracking
    (c_timestamp, c_session, c_request, c_client, c_gender, c_path)
...

...这将导致生成为流定义的所有指标s_tracking以及完整的原始数据到 (hyper-)table 中t_tracking

INSERT但是,由于使用基于行的触发器函数的变通方法,每个参与的人都会受到惩罚。

如果你能忍受,上面可能是你最好的机会。

于 2019-04-29T07:27:14.193 回答
2

目前 PipelineDB 和 TimescaleDB 之间没有本地集成,但在不远的将来可能会集成。性能方面,目前最好的选择是简单地将写入分叉到 TimescaleDB 和 PipelineDB。

于 2019-01-03T19:10:31.303 回答