当前位置: 首页 > article >正文

TimescaleDB实战:5分钟搞定物联网传感器数据存储与查询(附Grafana配置)

TimescaleDB实战5分钟构建物联网传感器数据存储与可视化系统物联网设备的爆炸式增长带来了海量传感器数据的存储和分析挑战。传统关系型数据库在面对高频写入的时间序列数据时往往力不从心而NoSQL方案又牺牲了SQL的灵活性和事务支持。TimescaleDB作为PostgreSQL的时序数据库扩展完美解决了这一痛点。本文将带您从零开始用5分钟搭建一个完整的传感器数据存储与可视化系统。1. 环境准备Docker一键部署我们采用Docker Compose快速搭建开发环境避免繁琐的安装配置过程。以下docker-compose.yml文件定义了TimescaleDB和Grafana服务version: 3.8 services: timescaledb: image: timescale/timescaledb:latest-pg15 ports: - 5432:5432 environment: - POSTGRES_PASSWORDsecret volumes: - tsdb_data:/var/lib/postgresql/data healthcheck: test: [CMD-SHELL, pg_isready -U postgres] interval: 5s timeout: 5s retries: 5 grafana: image: grafana/grafana:latest ports: - 3000:3000 volumes: - grafana_data:/var/lib/grafana depends_on: timescaledb: condition: service_healthy volumes: tsdb_data: grafana_data:启动服务只需一行命令docker-compose up -d提示确保系统已安装Docker Engine 20.10和Docker Compose v2.0。Windows/macOS用户建议使用Docker Desktop。2. 数据模型设计与超表创建连接TimescaleDB并创建传感器数据模型-- 创建传感器元数据表 CREATE TABLE sensors ( sensor_id SERIAL PRIMARY KEY, location TEXT NOT NULL, model TEXT, installation_date TIMESTAMPTZ DEFAULT NOW() ); -- 创建传感器读数表并转换为超表 CREATE TABLE sensor_readings ( time TIMESTAMPTZ NOT NULL, sensor_id INTEGER REFERENCES sensors(sensor_id), temperature DOUBLE PRECISION, humidity DOUBLE PRECISION, battery_level DOUBLE PRECISION ); SELECT create_hypertable(sensor_readings, time);关键配置参数说明参数推荐值作用chunk_time_interval7天每个数据块的时间范围compression启用自动压缩旧数据retention_policy90天自动清理旧数据优化查询性能的索引策略CREATE INDEX idx_sensor_time ON sensor_readings (sensor_id, time DESC); CREATE INDEX idx_location_time ON sensor_readings ( (SELECT location FROM sensors WHERE sensor_id sensor_readings.sensor_id), time DESC );3. 数据接入模拟与实时写入模拟数据生成使用以下Python脚本生成模拟传感器数据需安装psycopg2和randomimport psycopg2 import random from datetime import datetime, timedelta conn psycopg2.connect( hostlocalhost, databasepostgres, userpostgres, passwordsecret ) # 插入5个模拟传感器 with conn.cursor() as cur: for i in range(1, 6): cur.execute( INSERT INTO sensors (location, model) VALUES (%s, %s) ON CONFLICT DO NOTHING, (f位置_{i}, DHT22) ) conn.commit() # 生成24小时数据每分钟一条 with conn.cursor() as cur: for _ in range(24*60): time datetime.now() - timedelta(minutesrandom.randint(0, 1440)) for sensor_id in range(1, 6): cur.execute( INSERT INTO sensor_readings (time, sensor_id, temperature, humidity, battery_level) VALUES (%s, %s, %s, %s, %s), ( time, sensor_id, round(random.uniform(10, 35), 1), round(random.uniform(30, 80), 1), round(random.uniform(2.7, 3.3), 2) ) ) conn.commit()实时数据接入对于生产环境建议使用以下模式批量写入每10秒或每100条数据批量提交一次异步处理使用Kafka或RabbitMQ缓冲数据连接池使用PgBouncer管理数据库连接示例批量写入代码from psycopg2.extras import execute_batch data [(datetime.now(), i, *generate_reading()) for i in range(1,6)] execute_batch( cur, INSERT INTO sensor_readings VALUES (%s,%s,%s,%s,%s), data, page_size100 )4. 高效查询与聚合分析TimescaleDB提供了强大的时间序列分析函数基础查询示例-- 最新10条数据 SELECT * FROM sensor_readings ORDER BY time DESC LIMIT 10; -- 特定传感器过去1小时数据 SELECT * FROM sensor_readings WHERE sensor_id 3 AND time NOW() - INTERVAL 1 hour;高级时间聚合-- 每15分钟统计各传感器平均值 SELECT time_bucket(15 minutes, time) AS bucket, sensor_id, AVG(temperature) AS avg_temp, AVG(humidity) AS avg_humidity FROM sensor_readings WHERE time NOW() - INTERVAL 24 hours GROUP BY bucket, sensor_id ORDER BY bucket DESC;连续聚合视图对于频繁查询的聚合结果创建物化视图自动更新CREATE MATERIALIZED VIEW hourly_metrics WITH (timescaledb.continuous) AS SELECT time_bucket(1 hour, time) AS hour, sensor_id, AVG(temperature) AS avg_temp, MAX(temperature) AS max_temp, MIN(temperature) AS min_temp FROM sensor_readings GROUP BY hour, sensor_id;5. Grafana可视化配置访问http://localhost:3000默认账号admin/admin添加TimescaleDB数据源Type: PostgreSQLHost: timescaledb:5432Database: postgresUser: postgresPassword: secretSSL Mode: disable创建仪表盘添加以下面板实时温度监控面板SELECT $__time(time), temperature as value, Sensor || sensor_id as metric FROM sensor_readings WHERE time $__timeFrom() AND time $__timeTo() AND sensor_id IN ($sensor) ORDER BY time24小时温度分布热图SELECT $__time(time_bucket(5 minutes, time)), sensor_id, AVG(temperature) FROM sensor_readings WHERE time $__timeFrom() AND time $__timeTo() GROUP BY 1, 2 ORDER BY 1, 2传感器状态汇总SELECT Sensor || s.sensor_id as sensor, s.location, last(r.temperature, r.time) as current_temp, last(r.humidity, r.time) as current_humidity, last(r.battery_level, r.time) as battery FROM sensors s JOIN sensor_readings r ON s.sensor_id r.sensor_id GROUP BY s.sensor_id, s.location最终效果应包含时间序列折线图展示实时数据状态表格显示当前传感器状态热力图呈现数据分布告警规则设置如温度超过阈值性能优化实战技巧分块策略调优-- 调整分块大小为1天默认1周 SELECT set_chunk_time_interval(sensor_readings, INTERVAL 1 day);压缩配置ALTER TABLE sensor_readings SET ( timescaledb.compress, timescaledb.compress_segmentby sensor_id ); SELECT add_compression_policy(sensor_readings, INTERVAL 7 days);数据保留策略SELECT add_retention_policy(sensor_readings, INTERVAL 90 days);查询计划分析EXPLAIN ANALYZE SELECT * FROM sensor_readings WHERE sensor_id 2 AND time NOW() - INTERVAL 1 week;典型性能指标参考指标单节点性能写入速度50,000-100,000点/秒压缩率5-10倍取决于数据类型时间范围查询毫秒级响应1亿数据点生产环境部署建议对于关键业务系统建议采用以下架构高可用方案主从复制 自动故障转移使用Patroni或PG AutoFailover管理集群监控体系Prometheus Grafana监控数据库指标关键指标写入延迟、查询延迟、块数量、压缩率备份策略# 使用pg_dump进行逻辑备份 pg_dump -h localhost -U postgres -Fc postgres backup.dump # 使用WAL归档进行持续备份水平扩展使用TimescaleDB的多节点功能按时间范围或传感器ID分片数据典型问题排查指南问题1写入速度突然下降检查是否有长时间运行的事务监控磁盘IOPS是否达到上限确认是否触发了自动压缩过程问题2查询响应变慢使用EXPLAIN ANALYZE分析查询计划检查是否缺少必要的索引确认时间条件是否有效利用分块裁剪问题3磁盘空间不足检查压缩策略是否正常执行确认保留策略是否生效考虑添加更多磁盘或启用分层存储-- 查看数据库大小 SELECT pg_size_pretty(pg_database_size(postgres)); -- 查看超表空间使用 SELECT hypertable_name, pg_size_pretty(hypertable_size) FROM timescaledb_information.hypertables;

相关文章:

TimescaleDB实战:5分钟搞定物联网传感器数据存储与查询(附Grafana配置)

TimescaleDB实战:5分钟构建物联网传感器数据存储与可视化系统 物联网设备的爆炸式增长带来了海量传感器数据的存储和分析挑战。传统关系型数据库在面对高频写入的时间序列数据时往往力不从心,而NoSQL方案又牺牲了SQL的灵活性和事务支持。TimescaleDB作为…...

深入解析YOLO中mode.predict()的关键参数与应用场景

1. 理解YOLO的mode.predict()方法 YOLO(You Only Look Once)作为目标检测领域的标杆算法,其mode.predict()方法是实际应用中最常接触的核心接口。这个方法封装了从数据输入到结果输出的完整推理流程,相当于整个检测系统的"总…...

从电路仿真到面包板:手把手验证三端LC振荡器的相位平衡条件(附Multisim文件)

从电路仿真到面包板:手把手验证三端LC振荡器的相位平衡条件 在电子电路设计中,LC振荡器作为基础却至关重要的电路模块,其稳定性和可靠性直接影响整个系统的性能。而相位平衡条件,这个看似简单的"两同(电抗性质&am…...

AMD新平台装CentOS7.9总报Kernel Panic?别折腾了,试试Rocky Linux 9.2吧

AMD新平台安装CentOS7.9遭遇Kernel Panic?Rocky Linux 9.2的完美替代方案 最近几年,AMD的Zen3架构处理器凭借出色的性能和能效比,赢得了大量开发者和技术爱好者的青睐。然而,当这些用户尝试在Ryzen 5000系列平台上安装某些较旧的L…...

RTKLIB数据流引擎str2str:从源码到实战的流式数据处理架构剖析

1. RTKLIB数据流引擎str2str架构解析 str2str是RTKLIB中负责数据流处理的核心模块,它的设计理念类似于工厂里的流水线传送带。想象一下GNSS数据就像流水线上的零件,str2str的工作就是把这些零件从不同来源的传送带(输入流)接过来&…...

Lumerical入门指南:从网格设置到材料库管理的实用技巧

1. 网格设置:从基础操作到高级技巧 第一次打开Lumerical时,网格设置可能是最让人困惑的部分。记得我刚接触这个软件时,经常因为网格设置不当导致仿真结果异常。网格就像建筑的地基,设置不当会导致整个仿真结构不稳。 在Lumerical中…...

远程服务器Jupyter Notebook安全配置全攻略

1. 为什么需要远程Jupyter Notebook? 很多数据分析师和开发者都遇到过这样的困扰:本地的电脑性能有限,跑个大型数据集就卡成PPT;出差时想调取公司服务器的代码,却发现环境配置复杂到怀疑人生。这时候,远程J…...

SEO 引擎优化平台如何进行国际化优化

SEO 引擎优化平台如何进行国际化优化 在全球化的今天,拥有一个国际化的SEO策略是任何企业扩大市场份额的关键。SEO引擎优化平台如何进行国际化优化,不仅仅是为了在一个国家取得高排名,更是为了在多个国家和地区抢占市场。具体该如何进行有效…...

新企业应该优先选择SEO还是网络推广_SEO和网络推广的具体操作方法有哪些

新企业应该优先选择SEO还是网络推广_SEO和网络推广的具体操作方法有哪些 在数字化营销的时代,新企业在选择推广策略时面临着两大选择:SEO(搜索引擎优化)和网络推广。两者各有优劣,本文将详细探讨新企业应优先选择哪种…...

IDEA查看Maven依赖源码全攻略:从下载失败到源码解析一条龙

IDEA高效查看Maven依赖源码实战指南 在Java开发中,阅读第三方库的源码是提升编码能力的必经之路。但当你满怀期待地点击IDEA中的"Download Sources"按钮时,却可能遭遇各种意外——进度条卡住、报错提示、或者下载完成后依然只能看到.class文件…...

从信号处理到量化交易:我是如何用Python+miniQMT搭建实时行情数据管道的(附避坑经验)

从信号处理到量化交易:PythonminiQMT构建高可靠行情管道的工程实践 第一次尝试用Python连接miniQMT获取实时行情时,我的回调函数在开盘瞬间就被数据洪流冲垮了——这让我意识到金融数据流的处理与信号处理领域的实时系统设计竟有惊人的相似。本文将分享如…...

无损音频存储的终极解决方案:FLAC 1.5.0如何帮你节省50%存储空间?

无损音频存储的终极解决方案:FLAC 1.5.0如何帮你节省50%存储空间? 【免费下载链接】flac Free Lossless Audio Codec 项目地址: https://gitcode.com/gh_mirrors/fl/flac 你是否曾为高品质音乐文件占用大量硬盘空间而苦恼?是否在音质完…...

告别重复打卡:远程办公族的智能签到自动化解决方案

告别重复打卡:远程办公族的智能签到自动化解决方案 【免费下载链接】daily-check-in 一个打卡小程序 - 基于 leancloud 数据存储 项目地址: https://gitcode.com/gh_mirrors/da/daily-check-in 在数字化办公普及的今天,远程办公族每天需在项目管…...

如何快速掌握DREAM3D:材料科学数据分析的完整指南

如何快速掌握DREAM3D:材料科学数据分析的完整指南 【免费下载链接】DREAM3D Data Analysis program and framework for materials science data analytics, based on the managing framework SIMPL framework. 项目地址: https://gitcode.com/gh_mirrors/dr/DREAM…...

PlugY终极指南:暗黑破坏神2单机玩家的生存套件完整教程

PlugY终极指南:暗黑破坏神2单机玩家的生存套件完整教程 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 还在为暗黑破坏神2单机模式储物空间不足而烦恼吗&…...

3个维度解锁抖音内容采集:从个人创作到企业运营的效率革命

3个维度解锁抖音内容采集:从个人创作到企业运营的效率革命 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback s…...

SMU Debug Tool技术解析与实战指南:释放AMD Ryzen处理器性能潜力

SMU Debug Tool技术解析与实战指南:释放AMD Ryzen处理器性能潜力 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: …...

JiYuTrainer终极指南:如何完全解除极域电子教室控制限制

JiYuTrainer终极指南:如何完全解除极域电子教室控制限制 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer JiYuTrainer是一款专为Windows系统设计的开源工具&#xff0c…...

从报错到解决:ipmitool lan与lanplus接口区别详解(避坑指南)

从报错到解决:ipmitool lan与lanplus接口区别详解(避坑指南) 在服务器带外管理的日常运维中,ipmitool是工程师们不可或缺的利器。但你是否遇到过这样的场景:明明参数正确,却因一个简单的接口类型选择错误而…...

除了重启,Win11任务栏卡死的深层原因与预防指南(附长期稳定运行配置建议)

Win11任务栏卡死的底层逻辑分析与系统健壮性优化指南 当Windows 11的任务栏突然失去响应,大多数用户的第一反应是重启资源管理器——这确实能快速解决问题,但就像用止痛药缓解头痛而不探究病因一样,治标不治本。作为一位经历过数十次类似故障…...

告别手动配置烦恼:3个步骤用OCAT轻松搞定OpenCore黑苹果引导

告别手动配置烦恼:3个步骤用OCAT轻松搞定OpenCore黑苹果引导 【免费下载链接】OCAuxiliaryTools Cross-platform GUI management tools for OpenCore(OCAT) 项目地址: https://gitcode.com/gh_mirrors/oc/OCAuxiliaryTools 还在为复杂…...

别只比功能了!从社区生态和未来路线图,聊聊Spring AI和LangChain4j谁更值得押注

从社区生态与战略布局看Spring AI与LangChain4j的长期价值 当技术决策者面对两个功能相近的开源项目时,功能对比表格往往只是决策的起点。真正决定技术选型成败的,是项目背后的社区活力、维护模式与长期演进路线。Spring AI与LangChain4j作为Java生态中两…...

告别ArcMap:在ArcGIS Pro 3.0时代,如何正确获取并配置PostgreSQL的ST_Geometry.dll

深度解析:ArcGIS Pro 3.0与PostgreSQL空间数据库的ST_Geometry.dll配置实战 当我们将空间数据库从传统ArcMap迁移到ArcGIS Pro 3.0时,ST_Geometry.dll这个看似微小的动态链接库文件往往成为最容易被忽视却又最关键的技术瓶颈。许多资深GIS工程师在深夜调…...

DeepXDE入门踩坑实录:我的第一个PINN模型为什么训不好?

DeepXDE入门踩坑实录:我的第一个PINN模型为什么训不好? 第一次用DeepXDE跑通代码后,看着屏幕上跳动的损失函数曲线,那种成就感就像解出了一道数学难题。但很快,兴奋就被困惑取代——为什么我的模型训练结果总是不尽如人…...

别只盯着图像分类了:CVPR 2025揭示的对抗攻击新战场——扩散模型与说话人生成

CVPR 2025:生成式AI安全新战场——扩散模型与说话人生成对抗攻防全景 当Stable Diffusion生成的虚拟网红开始接管社交媒体,当InstantID克隆的真人数字分身接听你的银行电话,当Talking-Head视频会议中的"同事"实为AI合成——我们正站…...

3个效率倍增步骤:茉莉花插件让中文文献管理效率提升92%

3个效率倍增步骤:茉莉花插件让中文文献管理效率提升92% 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 茉莉花插件是专…...

从“链表长度”到“游戏对象池”:用C++ std::list的size()函数设计一个简单的内存管理Demo

从链表长度到游戏对象池:用C std::list设计高效内存管理方案 在游戏开发中,频繁创建和销毁对象会导致内存碎片化与性能下降。想象一个2D射击游戏场景:玩家发射的子弹、随机生成的敌人都需要动态管理。传统new/delete直接操作内存的方式在这种…...

py每日spider案例之某website参数token获取(ob混淆,难度一般)

逆向参数: 请求代码: import requestsheaders = {"accept": "*/*","accept-language": "zh-CN,zh;q=0.9","cache-control": "n...

Flowable流程可视化实战:手把手教你自定义高亮流程图(Java AWT绘图详解)

Flowable流程可视化实战:深度定制高亮流程图的技术解析 在业务流程管理(BPM)系统中,流程可视化是提升用户体验的关键环节。本文将深入探讨如何基于Flowable工作流引擎,通过Java AWT绘图技术实现高度定制化的流程图渲染…...

高效全方位网页资源捕获方案:猫抓扩展技术解析与应用指南

高效全方位网页资源捕获方案:猫抓扩展技术解析与应用指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 引言:网页资源获取…...