Интеграция TimescaleDB и PipelineDB - PullRequest
0 голосов
/ 02 января 2019

(я собирался опубликовать это на DBA SE, но там нет тега шкалы времени.)

Я использую TimescaleDB для хранения потока в реальном времени со скоростью 500-1000 вставок в секунду, инеобходимо передать эти данные клиентскому приложению, как только оно поступит.

Я не обязательно хочу обрабатывать необработанные миллисекундные данные (я могу), но мне определенно нужен клиент для получения 1,510, 30-секундные (и т. Д.) Агрегации этих оперативных данных, поскольку каждый интервал времени / интервал готов.Итак, каждую секунду, каждые 5 секунд, каждые 10 секунд и т. Д. (Значения будут такими, как max, min и т. Д. Для каждого временного интервала).

Я собирался использовать триггеры Postgres для агрегированияданные и поместите их в новую таблицу в виде водопадного типа, и используйте функцию прослушивания / уведомления, чтобы сообщить клиенту, когда каждый раз блок «готов», но затем я наткнулся на PipelineDB.

Однако это не такМне ясно, как настроить эту архитектуру.Хочу ли я, чтобы PipelineDB получил исходный поток данных, а затем передал его в гипертаблицу Timescale?Хочу ли я, чтобы шкала времени передавала данные в конвейер?Я предполагаю, что Pipeline будет точкой контакта для клиента.

Какой будет самая производительная общая архитектура;и как бы я передавал данные между шкалой времени и конвейером?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Это, безусловно, возможно (с использованием реальных структур из тестовой установки):

  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;
создать функцию триггера, которая вставляет записи, например:
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;$$
;
создать непрерывное преобразование , например:
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
;
вставить в поток вместо таблицы:
INSERT INTO s_tracking
    (c_timestamp, c_session, c_request, c_client, c_gender, c_path)
...

..., что приведет к получению всех метрик, определенных для потока s_tracking, а также полных необработанных данных в (гипер-) таблица t_tracking.

Однако из-за обходного пути, использующего триггерную функцию на основе строк, за каждый задействованный INSERT будет наложен штраф.

Если вы можете житьс этим, выше, вероятно, ваш лучший шанс.

0 голосов
/ 03 января 2019

В настоящее время нет встроенной интеграции между PipelineDB и TimescaleDB, но, скорее всего, это произойдет в недалеком будущем.С точки зрения производительности, лучшим вариантом в настоящее время является простое раздвоение записей как в TimescaleDB, так и в PipelineDB.

...