postgresql - TimescaleDB 对比 InfluxDB 到 PLC 日志记录
问题描述
我对登录数据库完全是 100% 的新手,这就是为什么这里可能会有一些愚蠢的问题,我希望没关系。我想将 Beckhoff plc 控制器中的数据记录到与我的 PLC 位于同一 IPC 上的 DB 中。Beckhoff plc 具有到 InfluxDB 和 TimescaleDB 所基于的 PostgreSQL 的直接链接功能,因此连接可以正常工作。我们希望将数据记录到时间,以便我们可以回去查看某些事情发生的时间,并根据时间向数据库提出问题。我一直在与不同的人交谈,他们中的大多数人都建议使用 TimescaleDB,所以很高兴听到他们之间的好处以及你们会推荐我选择什么。
我们将记录的数据量非常小。我们将有一个数据结构,它将包含 10 个 INT 寄存器,即 20 个字节。我们将在快速机器上每 1 秒记录一次数据库,有时每 20 分钟只记录一次,但这部分我将在我的 plc 中控制。
因此,将数据放入我相信的数据库中会非常简单,但是我对我想做的事情和可能的事情有一些想法。
是否可以向数据库提出问题,给我最近 60 分钟或 24 小时的金额、最大值、最小值、平均值等,然后数据库可以根据我在我的数据库中给出的时间范围返回这些值向它提问?
我记录的由 plc 控制的分辨率只需要保持 7 天,然后我想“下游/压缩”数据。这两个数据库都有可能吗?其中一个有什么好处吗?也许其中一个更容易?
每次我的 plc 将数据放入其中时,这两个数据库之一是否有可能不写入 HD / 磁盘?还是每次都会自动写入磁盘?我确实读过一个叫做 WAL 的东西,那是什么,或者在它写入更多数据而不是经常写入磁盘之前不会使用 RAM 来存储数据?
设置这两个数据库有什么大的区别吗?
我有更多的问题,但这些是我在系统中需要的主要功能。
非常感谢
解决方案
是否可以向数据库提出问题,给我最近 60 分钟或 24 小时的数量、最大值、最小值、平均值等,然后数据库可以根据我在我的数据库中给出的时间范围返回这些值向它提问?
是的!您可以使用查询来实现它。考虑以下表结构:
CREATE TABLE conditions (
time TIMESTAMPTZ NOT NULL,
device INTEGER NOT NULL,
temperature FLOAT NOT NULL
);
SELECT * FROM create_hypertable('conditions', 'time');
ALTER TABLE conditions SET (timescaledb.compress, timescaledb.compress_orderby='time');
我记录的由 plc 控制的分辨率只需要保持 7 天那么高,之后我想“下游/压缩”数据。这两个数据库都有可能吗?其中一个有什么好处吗?也许其中一个更容易?
您可以创建连续聚合,这是一种快速实现恢复数据的方法。
CREATE MATERIALIZED VIEW conditions_hourly(time, device, low, high, average )
WITH (timescaledb.continuous) AS
SELECT time_bucket('1 hour', time) as time,
device,
min(temperature) as low,
max(temperature) as high,
AVG(temperature) as average
FROM conditions
GROUP BY 1,2;
然后您可以添加仅保留最后 7 天的保留策略。
SELECT add_retention_policy('conditions', INTERVAL '7 day');
并添加一个连续聚合策略,让您的视图每小时更新一次:
SELECT add_continuous_aggregate_policy('conditions_hourly',
start_offset => INTERVAL '1 day',
end_offset => INTERVAL '1 hour',
schedule_interval => INTERVAL '1 hour');
每次我的 plc 将数据放入其中时,这两个数据库之一是否有可能不写入 HD / 磁盘?还是每次都会自动写入磁盘?我确实读过一个叫做 WAL 的东西,那是什么,或者在它写入更多数据而不是经常写入磁盘之前不会使用 RAM 来存储数据?
在 Postgresql 中,您可以使用异步提交:https ://www.postgresql.org/docs/current/wal-async-commit.html
推荐阅读
- data-visualization - 如何从非网络文件中分类网络文件?
- python - python中最基本的线性代数方程
- vbscript - StringBuilder 的 appendFormat_5 无法解析位置参数
- swift - 我在 Swift 中进行选择排序时遇到问题
- c# - 按钮在datagridview c#中不断加倍
- swift - 如何在 Swift 中添加按钮以关闭模式
- typescript - 类的类型(不是实例)是什么?
- flutter - 部分忽略指针,而不是整个小部件
- javascript - Exceljs+nodejs 提供 excel 流
- java - 通过比较其参数之一获取对象