Timescale Cloud:性能、规模、企业级

自托管产品

MST

能源供应商明白,当电力不足以完成日常活动时,客户会失去耐心。首要任务是保持照明。如果您正在向可再生能源过渡,了解何时需要生产能源,以便选择合适的能源,是很有帮助的。

实时分析是指在数据生成时即时收集、分析和解释数据的过程。这种方法使您能够跟踪和监控活动,根据 Timescale Cloud 服务中存储的数据的实时洞察做出决策,并保持照明。

Grafana 是一款流行的数据可视化工具,使您能够创建可自定义的仪表盘,并有效监控您的系统和应用程序。

Grafana real-time analytics

本页面将向您展示如何将 Grafana 与 Timescale Cloud 服务集成,并根据为大小和速度在列式存储中优化的数据可视化进行洞察。

要按照本页的步骤操作,您需要:

时间序列数据表示系统、过程或行为随时间的变化方式。超表(Hypertables)使 TimescaleDB 能够高效地处理时间序列数据。超表是按时间自动分区时间序列数据的 PostgreSQL 表。每个超表由称为块(chunks)的子表组成。每个块都被分配一个时间范围,并且只包含该范围内的数据。当您运行查询时,TimescaleDB 会识别正确的块并在其上运行查询,而不是遍历整个表。

Hypercore 是 Timescale 混合行式-列式存储引擎,由超表使用。传统数据库在快速插入(行式存储)和高效分析(列式存储)之间强制进行权衡。Hypercore 消除了这种权衡,允许实时分析而无需牺牲事务处理能力。

Hypercore 动态地将数据存储为生命周期中最有效的格式

  • 行式存储用于最近数据:最近的块(可能更多)始终存储在行式存储中,确保快速插入、更新和低延迟的单记录查询。此外,行式存储用作列式存储的直写(writethrough),用于插入和更新。
  • 列式存储用于分析性能:块会自动压缩成列式存储,优化存储效率并加速分析查询。

与传统列式数据库不同,Hypercore 允许在任何阶段插入或修改数据,使其成为高摄取事务性工作负载和实时分析的灵活解决方案——都在一个数据库中实现。

因为 TimescaleDB 是 100% PostgreSQL,所以您可以将所有标准的 PostgreSQL 表、索引、存储过程和其他对象与您的超表一起使用。这使得创建和使用超表类似于标准 PostgreSQL。

  1. 将时间序列数据导入超表

    1. 解压到 <本地文件夹>

      此测试数据集包含能源消耗数据。

      要直接从当前基于 PostgreSQL 的数据库导入高达 100GB 的数据,请使用原生的 PostgreSQL 工具进行停机迁移。要无缝导入 100GB-10TB+ 的数据,请使用 Timescale 提供的实时迁移工具。要从非 PostgreSQL 数据源添加数据,请参阅导入和摄取数据

    2. 在终端中,导航到 <本地文件夹> 并使用您的连接详情更新以下字符串以连接到您的服务。

      psql -d "postgres://<username>:<password>@<host>:<port>/<database-name>?sslmode=require"
    3. 为您的时间序列数据创建优化的超表

      1. 使用 CREATE TABLE 命令,为您的时间序列数据创建一个默认启用 Hypercore超表。为了在列式存储中高效查询数据,请记住根据您最常用于过滤数据的列进行 segmentby 设置。

        在您的 SQL 客户端中,运行以下命令:

        CREATE TABLE "metrics"(
        created timestamp with time zone default now() not null,
        type_id integer not null,
        value double precision not null
        ) WITH (
        tsdb.hypertable,
        tsdb.partition_column='created',
        tsdb.segmentby = 'type_id',
        tsdb.orderby = 'created DESC'
        );

        如果您自托管 TimescaleDB v2.19.3 及更早版本,请先创建 PostgreSQL 关系表,然后使用 create_hypertable 将其转换为超表。然后通过调用 ALTER TABLE 启用 hypercore。

    4. 将数据集上传到您的服务

      \COPY metrics FROM metrics.csv CSV;
  2. 快速查看您的数据

    您查询超表的方式与查询关系型 PostgreSQL 表完全相同。使用以下 SQL 编辑器之一运行查询并查看您上传的数据:

    • 数据模式:在 Timescale Console 中编写查询、可视化数据并分享结果,适用于您的所有 Timescale Cloud 服务。
    • SQL 编辑器:在 Timescale Console 中更快、更准确地编写、修复和组织 SQL,用于 Timescale Cloud 服务。
    • psql:从终端轻松地在您的 Timescale Cloud 服务或自托管 TimescaleDB 部署上运行查询。
    SELECT time_bucket('1 day', created, 'Europe/Berlin') AS "time",
    round((last(value, created) - first(value, created)) * 100.) / 100. AS value
    FROM metrics
    WHERE type_id = 5
    GROUP BY 1;

    对于如此大量的数据,此针对行式存储中数据的查询大约需要 3.6 秒。您会看到类似以下内容:

    时间
    2023-05-29 22:00:00+0023.1
    2023-05-28 22:00:00+0019.5
    2023-05-30 22:00:00+0025
    2023-05-31 22:00:00+008.1

当 Timescale Cloud 将一个块转换为列式存储时,TimescaleDB 会自动为您的数据创建一个不同的模式。当您写入和读取列式存储时,TimescaleDB 会创建并使用自定义索引来合并 segmentbyorderby 参数。

为了将分析查询的速度提高 10 倍,并将存储成本降低高达 90%,请将数据转换为列式存储。

  1. 连接到您的 Timescale Cloud 服务

    Timescale Console 中打开一个 SQL 编辑器。控制台中的编辑器会显示查询速度。您也可以使用 psql 连接到您的服务。

  2. 添加策略以在特定时间间隔将块转换为列式存储

    例如,数据添加到表后 60 天

    CALL add_columnstore_policy('metrics', INTERVAL '8 days');

    请参阅 add_columnstore_policy

  3. 列式存储中数据的更快分析查询

    现在再次运行分析查询

    SELECT time_bucket('1 day', created, 'Europe/Berlin') AS "time",
    round((last(value, created) - first(value, created)) * 100.) / 100. AS value
    FROM metrics
    WHERE type_id = 5
    GROUP BY 1;

    对于如此大量的数据,此针对列式存储中数据的分析查询大约需要 250 毫秒。

为了强调这一点,通过将冷却数据转换为列式存储,您的分析查询速度提高了 10 倍,存储空间减少了高达 90%。

聚合是结合数据以从中获取洞察力的一种方式。平均值、总和和计数都是简单聚合的例子。然而,当数据量很大时,聚合会很快拖慢速度。连续聚合是一种超表,随着新数据的添加或旧数据的修改,它会在后台自动刷新。数据集的变化会被跟踪,并且连续聚合背后的超表会在后台自动更新。

默认情况下,查询连续聚合会为您提供实时数据。来自实体化视图的预聚合数据与尚未聚合的最新数据相结合。这使您在每次查询时都能获得最新结果。

您在高性能存储中未压缩的数据上创建连续聚合。它们继续在列式存储中的数据分层存储中不常访问的数据上工作。您甚至可以在连续聚合之上创建连续聚合

  1. 日常监测能源消耗

    1. 为能源消耗创建连续聚合 kwh_day_by_day

      CREATE MATERIALIZED VIEW kwh_day_by_day(time, value)
      with (timescaledb.continuous) as
      SELECT time_bucket('1 day', created, 'Europe/Berlin') AS "time",
      round((last(value, created) - first(value, created)) * 100.) / 100. AS value
      FROM metrics
      WHERE type_id = 5
      GROUP BY 1;
    2. 添加刷新策略以保持 kwh_day_by_day 最新

      SELECT add_continuous_aggregate_policy('kwh_day_by_day',
      start_offset => NULL,
      end_offset => INTERVAL '1 hour',
      schedule_interval => INTERVAL '1 hour');
  2. 按小时监测能源消耗

    1. 为能源消耗创建连续聚合 kwh_hour_by_hour

      CREATE MATERIALIZED VIEW kwh_hour_by_hour(time, value)
      with (timescaledb.continuous) as
      SELECT time_bucket('01:00:00', metrics.created, 'Europe/Berlin') AS "time",
      round((last(value, created) - first(value, created)) * 100.) / 100. AS value
      FROM metrics
      WHERE type_id = 5
      GROUP BY 1;
    2. 添加刷新策略以保持连续聚合最新

      SELECT add_continuous_aggregate_policy('kwh_hour_by_hour',
      start_offset => NULL,
      end_offset => INTERVAL '1 hour',
      schedule_interval => INTERVAL '1 hour');
  3. 分析您的数据

    现在您已经创建了连续聚合,最好使用它们对您的数据进行分析。例如,要查看过去一年中工作日平均能源消耗的变化,请运行以下查询:

    WITH per_day AS (
    SELECT
    time,
    value
    FROM kwh_day_by_day
    WHERE "time" at time zone 'Europe/Berlin' > date_trunc('month', time) - interval '1 year'
    ORDER BY 1
    ), daily AS (
    SELECT
    to_char(time, 'Dy') as day,
    value
    FROM per_day
    ), percentile AS (
    SELECT
    day,
    approx_percentile(0.50, percentile_agg(value)) as value
    FROM daily
    GROUP BY 1
    ORDER BY 1
    )
    SELECT
    d.day,
    d.ordinal,
    pd.value
    FROM unnest(array['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']) WITH ORDINALITY AS d(day, ordinal)
    LEFT JOIN percentile pd ON lower(pd.day) = lower(d.day);

    您会看到类似以下内容:

    序数
    周一223.08078714975423
    周日119.511430831944395
    周二325.003118897837307
    周三48.09300571759772

要可视化查询结果,请启用 Grafana 读取您服务中的数据。

  1. 登录 Grafana

    在您的浏览器中,登录以下任一地址:

    • 自托管 Grafana:在 http://localhost:3000/。默认凭据是 adminadmin
    • Grafana Cloud:使用您创建账户时设置的 URL 和凭据。
  2. 将您的服务添加为数据源

    1. 打开 Connections > Data sources,然后点击 Add new data source

    2. 从列表中选择 PostgreSQL

    3. 配置连接

      • 主机 URL数据库名称用户名密码

        使用您的连接详情进行配置。主机 URL 格式为 <主机>:<端口>

      • TLS/SSL 模式:选择 require

      • PostgreSQL 选项:启用 TimescaleDB

      • 其他所有字段保留默认设置。

    4. 点击 保存并测试

      Grafana 检查您的详细信息是否设置正确。

Grafana 仪表盘表示系统性能的视图,每个仪表盘由一个或多个面板组成,这些面板表示与该系统相关的特定指标信息。

为了可视化监控能源消耗量随时间的变化:

  1. 创建仪表盘

    1. 仪表盘 页面上,点击 新建 并选择 新建仪表盘

    2. 点击 添加可视化,然后选择连接到您的 Timescale Cloud 服务的数据源和 条形图 可视化。

      Grafana create dashboard

    3. 查询 部分,选择 代码,然后根据您的连续聚合运行以下查询:

      WITH per_hour AS (
      SELECT
      time,
      value
      FROM kwh_hour_by_hour
      WHERE "time" at time zone 'Europe/Berlin' > date_trunc('month', time) - interval '1 year'
      ORDER BY 1
      ), hourly AS (
      SELECT
      extract(HOUR FROM time) * interval '1 hour' as hour,
      value
      FROM per_hour
      )
      SELECT
      hour,
      approx_percentile(0.50, percentile_agg(value)) as median,
      max(value) as maximum
      FROM hourly
      GROUP BY 1
      ORDER BY 1;

      此查询按小时对特定时区家庭的能源消耗结果进行平均并按时间排序。由于您使用了连续聚合,这些数据始终是实时准确的。

      Grafana real-time analytics

      您会发现能源消耗在傍晚和早餐时间最高。您还知道傍晚时分风力会减弱。这些数据证明您需要在高峰时段提供补充电源,或计划在白天储存能源以备高峰时段使用。

  2. 点击 保存仪表盘

您已将 Grafana 与 Timescale Cloud 服务集成,并基于数据可视化获得了洞察。

关键词

此页面上发现问题?报告问题 或 编辑此页面 在 GitHub。