117万台设备、千亿条数据:Zendure用TDengine企业版把存储账单砍掉八成

Feng 2 阅读 AI技术

Zendure(征拓)的设备接入量从数千台涨到117万台,数据规模从千万级冲到数千亿条。支撑这套系统的时序数据库,也从TDengine开源版换成了企业版集群。结果:存储成本降了约80%,单设备查询回到毫秒级,集群连续跑了9个多月没出可用性事故。

这篇文章拆解他们踩过的坑和最终落地的方案。

先看业务:数据从哪来,为什么涨得这么快

Zendure是广州疆海科技旗下的家庭能源管理品牌,主打即插即用。产品线从单一储能扩到9大品类,用户覆盖欧洲、北美、亚太60多个国家和地区。

核心场景有两个。

阳台光伏储能:欧洲大量公寓没法装屋顶光伏,方案是在阳台栏杆挂2到4块光伏板,接Solar Flow逆变器和电池,插家用插座就能用。白天发电存电池,晚上放电,App里看能源流向和省下的电费。

屋顶光伏加装储能:已有屋顶光伏的独栋住宅,用Mix AC+系列在不改动原系统的前提下加储能,提高自用率。

每台设备持续上报功率、电流、输入输出电能等时序数据。App还跑AI调度:按天气预报估发电量、按动态电价(比如法国EDF Tempo)挑低价时段充电、按用户习惯做充放电。

这些数据的特点是:设备多、频率高、保留久。

四个绕不过去的坎

接入设备从数千台涨到117万台后,压力集中爆发。

写入扛不住。太阳能流控、智慧CT、智能插座多条产品线同时上量,每台设备高频上报。以太阳能流控功率表为例,单表累计行数接近千亿级,高峰期每秒写入数十万个数据点。原来的单机部署直接顶到天花板。

存储烧钱。系统跑在AWS上,EBS按月计费。117万台设备乘高频采集乘约10年保留期,总量数千亿条。按老方案存,总存储需求7到8 TB,年开销超过20万美元。对一家全球化创业公司来说,这不是小数目。

查询变慢。数据量涨上来后,用户在App里看功率曲线,加载时间从几百毫秒变成好几秒,大跨度查询直接超时。“App变卡了”的反馈越来越多。

高可用不能断。用户跨多个时区,系统必须7×24小时在线。曾经一次单机故障,导致欧洲用户2小时看不到App数据,投诉量很大。从那以后,高可用成了硬指标。

选型:为什么最后是TDengine

开源版撞墙后,他们组了选型小组,从写入吞吐、查询性能、压缩能力、集群高可用几个维度横向比。

对比维度 MySQL InfluxDB TDengine
写入能力 分表后勉强支撑,运维复杂 开源版不支持集群 原生分布式集群,线性扩展
压缩率 无原生压缩 约3:1~5:1 约6:1~60:1
查询性能 大表查询分钟级 聚合查询秒级 单设备毫秒级,跨设备秒级
集群高可用 需主从+读写分离 集群版闭源收费 原生3副本集群
SQL兼容性 完整SQL 类SQL(非标准) 标准SQL
运维成本 高(分表+索引维护) 中 低(自动化运维)

InfluxDB在IoT场景本身不差,但开源版不支持集群,集群版是商业闭源产品,压缩率也不如TDengine。MySQL的问题是数据量一大,分表和索引维护的成本直线上升。

结论:TDengine在写入、压缩、集群能力、SQL兼容性上综合最优,而且团队已有开源版使用经验,迁移成本可控。

这里有个选型上的通用判断:IoT场景别只看单机benchmark,集群能力和压缩率才是决定长期账单的两个变量。前者影响可用性,后者直接影响存储费用。

数据建模:超级表加子表怎么切

架构采用分层设计。数据模型用的是TDengine的“超级表+子表”模式,核心思路一句话:超级表按场景品类切,子表按设备拆,标签按查询维度设。

一共建了16张超级表,其中11张有数据,5张为新场景预留。按产品线归类:

场景线 超级表 设备数 说明
太阳能流控 power / electric / inout 各约19万台 核心场景,数据量最大
智慧互感器 power / inout 各约9万台 精确电流计量
智能插座 power / inout 各约6万台 家庭用电管理
预估功率 predic_power 4万台 AI功率预测
收益拆解 hems_profit 7.6万台 投资回报展示
用户能耗 consumer_energy 10.2万台 用户能耗画像
Tesla整合 tesla_inout 1268台 第三方储能对接

以太阳能流控功率表为例,超级表这样建:

-- 太阳能流控功率超级表CREATE STABLE st_device_solar_flow_power (
 ts TIMESTAMP, -- 采集时间戳
 power INT, -- 实时功率值(W)
 type INT, -- 功率类型(充电/放电/光伏等)
 hems_id BIGINT -- 所属家庭能源管理系统ID) TAGS (
 device_id BIGINT -- 设备唯一标识);

同一台Solar Flow逆变器,在功率表、电流表、输入输出电能表下各有一张子表。TAG字段P0标识设备,场景层通过P0关联到家庭维度。

典型查询长这样:

-- 1. 单台设备最新功率(App实时展示)SELECT last_row(*) FROM st_device_solar_flow_power 
WHERE device_id = 100048;-- 响应时间:< 10ms-- 2. 某设备过去24小时功率趋势(App功率曲线)SELECT _irowts, AVG(power), MAX(power), MIN(power) 
FROM st_device_solar_flow_powerWHERE ts >= NOW() - 1d AND device_id = 100048INTERVAL(5m);-- 响应时间:< 100ms-- 3. 统计所有设备本月每日总发电量(运营分析)SELECT _irowts, SUM(energy) 
FROM st_device_solar_flow_inoutWHERE ts >= '2026-07-01'INTERVAL(1d);-- 响应时间:~2秒(覆盖18万+设备)-- 4. 按家庭维度聚合平均功率(HEMS分析)SELECT hems_id, AVG(power) 
FROM st_device_solar_flow_powerWHERE ts >= NOW() - 1dPARTITION BY hems_id;-- 响应时间:~3秒

这种建模的好处很直接:新增产品线时只需定义新的超级表,不会动到已有场景。

落地效果:数字说话

指标 调优前(开源版/MySQL) 优化后(TDengine企业版) 变化
写入 单机瓶颈,高峰期延迟 3节点集群,稳定高吞吐 质的提升
查询 大跨度查询分钟级 单设备<10ms,跨设备约2秒 百倍以上
压缩 MySQL无压缩/开源版5-9% 压缩率15%~31% 约1:6~1:60
存储开销 约$200,000+/年(估算) 约$35,000/年 降低约80%
高可用 单机无冗余 3节点+3副本,零故障运行9个月+ 从0到1
数据保留 无法长期保留 约10年(KEEP 3650d) 满足合规

太阳能流控是绝对的数据大户,仅功率数据就有近千亿条记录,占总数据量的60%以上。

迁移与运维:几个实操层面的经验

迁移用的是taos X数据迁移工具,实现了零停机平滑切换。这是从开源版升级到企业版时最省心的一环,但前提是提前把超级表结构和TAG设计对齐,否则迁移后查询性能会打折。

关于高可用,3节点3副本是他们的配置。这里有个坑:副本数不是越多越好,3副本已经能容忍单节点故障,再往上加只会放大写入延迟和存储开销。生产环境建议先按3副本起步,根据实际故障率再调。

关于数据保留,KEEP 3650d对应约10年。如果业务不需要那么久,缩短KEEP能直接省存储。冷热分层是他们下一步要做的方向。

后续计划

Zendure接下来会研究冷热数据分层存储,进一步压成本,同时深化智能拆解能力。

回头看,这次升级解决的不只是写入和存储的问题,更关键的是把成本控制在了可接受范围内,同时保住了全球用户7×24小时的数据可用性。对做IoT出海的公司来说,这两件事缺一不可。

Feng
这位作者很神秘,还没有填写简介。